پیشرفت dd را چگونه کنترل می کنید؟


به جواب پذیرفته شده بروید




dd جای تعجب است این به شما امکان می دهد یک هارد دیسک را به دیگری کپی کنید ، یک هارد دیسک کاملاً صفر ، و غیره. اما هنگامی که شما یک dd فرمان را راه اندازی کردید ، هیچ چیز برای پیشرفت شما وجود ندارد. فقط در مکان نما قرار می گیرد تا اینکه سرانجام فرمان تمام شود. بنابراین چگونه یک شخص بر پیشرفت dd نظارت می کند؟


667









20 :تعداد پاسخها


بروزرسانی 2016 : اگر از هسته های GNU> = 8.24 استفاده می کنید (پیش فرض در Ubuntu Xenial 16.04 به بالا) ، برای یک روش جایگزین برای نمایش پیشرفت ، به روش 2 زیر مراجعه کنید.


روش 1: با استفاده از pv

pv آن را فقط بین dd دستورات ورودی / خروجی نصب و قرار دهید .

توجه : هنگامی که شروع کرده اید ، نمی توانید از آن استفاده کنید dd .

از توضیحات بسته :

pv - Pipe Viewer - ابزاری مبتنی بر ترمینال برای نظارت بر پیشرفت داده ها از طریق خط لوله است. می توان آن را در هر خط لوله معمولی بین دو فرآیند قرار داد تا نشان دهد که چگونه داده ها به سرعت در حال عبور ، چه مدت زمان به طول انجامیده ، چقدر به اتمام رسیده و تخمین زده می شود که چقدر طول می کشد تا زمان اتمام.

نصب و راه اندازی

 sudo apt-get install pv
 

مثال

 dd if=/dev/urandom | pv | dd of=/dev/null
 

خروجی

 1,74MB 0:00:09 [ 198kB/s] [      <=>                               ]
 

--size اگر می خواهید یک تخمین زمانی داشته باشید ، می توانید اندازه تقریبی را مشخص کنید .


مثال با فرض اینکه یک دیسک 2 گیگابایتی از / dev / sdb کپی می شود

فرمان بدون pv خواهد بود:

 sudo dd if=/dev/sdb of=DriveCopy1.dd bs=4096
 

فرمان با pv :

 sudo dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096
 

خروجی:

 440MB 0:00:38 [11.6MB/s] [======>                             ] 21% ETA 0:02:19
 

استفاده های دیگر

مطمئناً می توانید pv مستقیماً از لوله خروجی به stdout استفاده کنید:

 pv /home/user/bigfile.iso | md5sum
 

خروجی

 50,2MB 0:00:06 [8,66MB/s] [=======>         ] 49% ETA 0:00:06
 

توجه داشته باشید که در این حالت pv اندازه را بطور خودکار تشخیص می دهد.


روش 2: status گزینه جدید اضافه شده به dd (GNU Coreutils 8.24+)

dd در GNU Coreutils 8.24+ (اوبونتو 16.04 و جدیدتر) status گزینه جدیدی برای نمایش پیشرفت بدست آورد:

مثال

 dd if=/dev/urandom of=/dev/null status=progress
 

خروجی

 462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
 

750



از HowTo: نظارت بر پیشرفت dd

شما می توانید بدون استفاده از kill دستور ، پیشرفت dd را متوقف کنید .

برای دیدن پیشرفت dd زمان اجرای آن ، یک ترمینال دیگر را باز کرده و وارد کنید:

 sudo kill -USR1 $(pgrep ^dd)
 

با این کار dd پیشرفت در dd پنجره ترمینال بدون متوقف کردن روند نمایش داده می شود. اگر در BSD یا OS X هستید ، INFO به جای از آن استفاده کنید USR1 . USR1 سیگنال DD خواهد خاتمه.

اگر می خواهید به روز رسانی های منظم از dd پیشرفت را دریافت کنید ، وارد کنید:

 watch -n5 'sudo kill -USR1 $(pgrep ^dd)'
 

watch خواهد بررسی dd روند هر ثانیه -n ( -n5 = 5 ثانیه) و گزارش بدون توقف است.

به نقل قول های مناسب در دستورات بالا توجه داشته باشید.


473



چند نمونه کاربردی دستی با pv تایپ کمتر و پیشرفت بیشتر از پاسخ های دیگر:

ابتدا pv با دستور باید نصب کنید :

 sudo apt-get install pv
 

سپس برخی از مثالها عبارتند از:

 pv -n /dev/urandom | dd of=/dev/null
pv -tpreb source.iso | dd of=/dev/BLABLA bs=4096 conv=notrunc,noerror
 

توجه: نمونه اول 5 نویسه کمتر تایپ می کند و سپس dd if=/dev/urandom | pv | dd of=/dev/null .

و مورد علاقه من برای کلون کردن یک درایو دیسک (X را با حروف درایو جایگزین کنید):

 (pv -n /dev/sdX | dd of=/dev/sdX bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running dd command (cloning), please wait..." 10 70 0
 


عکس صفحه

منبع: http://www.cyberciti.biz/faq/linux-unix-dd-command-show-progress- ضمن-coping/

همچنین برای بایگانی کردن خودم.


104



استفاده از Ctrl+ Shift+ Tدر حالی که dd حال اجرا است، و آن را به خروجی پیشرفت (به بایت):

 load: 1.51  cmd: dd 31215 uninterruptible 0.28u 3.67s
321121+0 records in
321120+0 records out
164413440 bytes transferred in 112.708791 secs (1458745 bytes/sec)
 

64



به خاطر کامل بودن:

نسخه 8.24 از هسته های اصلی GNU شامل یک پچ برای dd است که یک پارامتر را برای چاپ پیشرفت معرفی می کند.

متعهد معرفی این تغییر این اظهار نظر را دارد:

dd: new status = سطح پیشرفت برای چاپ دوره ای آمار

بسیاری از توزیع ها از جمله Ubuntu 16.04.2 LTS از این نسخه استفاده می کنند.


60



بهترین استفاده با استفاده از http://dcfldd.sourceforge.net/ نصب آن از طریق apt-get آسان است


33



وضعیت پیشرفت بومی به dd اضافه شد !!!

نسخه جدید Coreutils (8.24) وضعیت پیشرفت را به dd ابزار اضافه می کند :

طریقه استفاده در Xubuntu 15.10:

یک ترمینال را باز کنید و این دستورات را تایپ کنید:

 wget ftp://ftp.gnu.org/pub/gnu/coreutils/coreutils-8.24.tar.xz
tar -xf coreutils-8.24.tar.xz
cd coreutils-8.24
./configure && make -j $(nproc)
 

dd به عنوان ریشه اجرا کنید :

 sudo su
cd src
./dd if=/dev/sdc of=/dev/sda conv=noerror status=progress
 

خواهید دید: بایت ، ثانیه و سرعت (بایت / ثانیه).

برای بررسی نسخه های dd :

بومی:

 dd --version
 

جدید:

 cd coreutils-8.24/src
./dd --version
 

26



اگر dd را قبلاً شروع کرده اید ، و اگر در حال نوشتن پرونده ای از قبیل هنگام ایجاد یک نسخه از یک آونگ در دیسک هستید ، می توانید از دستور تماشای استفاده کنید تا به طور مداوم اندازه پرونده خروجی را مشاهده کنید تا تغییرات را مشاهده کنید و برآورد آن را تخمین بزنید.

 watch ls -l /pathtofile/filename
 

برای دیدن فقط اندازه پرونده (نمایه h-human):

 watch ls -sh /pathtofile/filename
 

18



این dd | pv | dd سه گانه باعث شد که نسخه 50m vm من 800 ثانیه طول بکشد ، در حالی که در مقابل 260 ثانیه با استفاده از فقط dd. حداقل با استفاده از این خط لوله ، pv تصور نمی کند که پرونده ورودی چقدر بزرگ باشد ، بنابراین قادر نخواهد بود به شما بفهمانید که تا چه اندازه در کنار شما هستید ، بنابراین هیچ مشکلی برای انجام این کار به شرح زیر وجود نخواهد داشت - و شما یک مزیت سرعت خوب را بدست می آورید:

من از PVP در هر چیز بزرگ جلوگیری می کنم ، و (اگر از Bash استفاده می کنید):

فرآیند dd را کنترل کنید

bg برای قرار دادن آن در پس زمینه. مشاهده کنید که bg خروجی مانند [1] 6011 شماره دوم شناسه پردازش به شما می دهد. بنابراین ، انجام دهید:

while true; do kill -USR1 process_id ; sleep 5; done

شناسه فرایندی که مشاهده کردید process_id است. وقتی چیزی را مشاهده کردید مانند Control-C را بزنید:

 [1]+  Done dd if=/path/file.qcow2 of=/dev/kvm/pxetest bs=4194304 conv=sparse
-bash: kill: (60111) - No such process
 

شما انجام دادید.

ویرایش: مدیر سیستم های احمق! زندگی خود را خودکار کنید ، کار نکنید! اگر من یک پروسه dd طولانی را دارم که می خواهم از آن نظارت داشته باشم ، در اینجا یک تابلو وجود دارد که از کل enchilada برای شما مراقبت خواهد کرد. همه اینها را در یک خط قرار دهید:

  dd if=/path/to/bigimage of=/path/to/newimage conv=sparse bs=262144 & bgid=$!; while true; do sleep 1; kill -USR1 $bgid || break; sleep 4; done
 

البته شما می توانید آن را اسکریپت کنید ، شاید 1 دلار فایل ورودی خود و 2 دلار فایل خروجی خود را تهیه کنید. این به عنوان یک تمرین برای خواننده باقی مانده است. توجه داشته باشید که به خواب کمی قبل از کشتن یا قتل احتیاج دارید که وقتی هنوز آماده نشده است برای ارسال سیگنال به دی وی دی بمیرد. خوابهای خود را مطابق دلخواه تنظیم کنید (شاید حتی خواب دوم را نیز به کلی حذف کنید).

Bash- FTW! :-)


13



در اوبونتو 16.04

اوبونتو 16.04 همراه با dd (coreutils) نسخه 8.25 . از این رو گزینه status=progress است پشتیبانی :-)

برای استفاده از آن ، کافیست دستور status=progress خود را اضافه کنید dd .

مثال :

 dd bs=4M if=/media/severus/tools-soft/OperatingSystems/ubuntu-16.04-desktop-amd64.iso of=/dev/null status=progress && sync
 

وضعیت را به عنوان می دهد

 1282846183 bytes (1.2 GiB, 1.1 GiB) copied, 14.03 s, 101.9 MB/s
 


توضیحات تصویر را اینجا وارد کنید


7



ساده ترین این است:

  dd if=... of=... bs=4M status=progress oflag=dsync
 

oflag=dsync نوشتن شما را به صورت همگام نگه می دارد ، بنابراین اطلاعات status=progress دقیق تر است. با این حال ممکن است کمی کندتر باشد.


7



status=progress برای پیشرفت در هنگام ترانسفر از گزینه استفاده کنید .

علاوه بر این ، conv=fsync خطاهای I / O را نشان می دهد.

مثال:

 sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
 

5



من واقعا ddrescue را دوست دارم ، به عنوان dd عمل می کند اما باعث خروجی می شود و در خطا شکست نمی خورد ، در عوض دارای یک الگوریتم بسیار پیشرفته است و سعی در انجام یک نسخه موفق بسیار سخت است ... رابط کاربری گرافیکی زیادی برای آن وجود دارد

پروژه: https://www.gnu.org/software/ddrescue

ویکی پدیا: https://en.wikipedia.org/wiki/Ddrescue


توضیحات تصویر را اینجا وارد کنید


4



من یک بسته بند bash ایجاد کرده ام که از dd آن pv برای نشان دادن پیشرفت استفاده خواهد کرد. آن را در حالت معمول قرار دهید .bashrc و dd طبق معمول استفاده کنید :

 # dd if=/dev/vvg0/root of=/dev/vvg1/root bs=4M
    2GB 0:00:17 [ 120MB/s] [===========================================================>] 100%            
0+16384 records in
0+16384 records out
2147483648 bytes (2.1 GB) copied, 18.3353 s, 117 MB/s
 

منبع:

 dd()
{
    local dd=$(which dd); [ "$dd" ] || {
        echo "'dd' is not installed!" >&2
        return 1
    }

    local pv=$(which pv); [ "$pv" ] || {
        echo "'pv' is not installed!" >&2
        "$dd" "[email protected]"
        return $?
    }

    local arg arg2 infile
    local -a args
    for arg in "[email protected]"
    do
        arg2=${arg#if=}
        if [ "$arg2" != "$arg" ]
        then
            infile=$arg2
        else
            args[${#args[@]}]=$arg
        fi
    done

    "$pv" -tpreb "$infile" | "$dd" "${args[@]}"
}
 

3



بنابراین امروز من از اینکه سعی کردم kill در یک حلقه در حالی که dd در حال اجرا بود ، کمی ناامید شدم ، ناامید شدم و برای اجرای موازی به راحتی به این روش رسیدم:

 function vdd {
    sudo dd "[email protected]" &
    sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
}
 

اکنون فقط از vdd هرجایی که به طور معمول استفاده می کنید استفاده کنید dd (همه آرگومان ها را مستقیماً از طریق آن عبور می کند) و یک گزارش پیشرفت را خواهید دید که هر 5 ثانیه چاپ می شود.

تنها نکته منفی این است که فرمان پس از اتمام dd بلافاصله برنمی گردد. بنابراین این امکان وجود دارد که این فرمان بتواند شما را در انتظار 5 ثانیه اضافی پس از بازگشت dd قبل از اینکه متوجه شود و خارج شود.


2



این فرد مجبور است هر 2 ثانیه یکبار آمار ارائه دهد که برای ساعت پیش فرض است:

 watch killall -USR1 dd
 

برای تغییر از هر 2 ثانیه به هر 5 ثانیه ، گزینه 5-اضافه کنید مانند این:

 watch -n 5 killall -USR1 dd
 

2



فقط در شرایطی که کسی از سرزمین CentOS اتفاق بیفتد که این موضوع را پیدا کند ...

گزینه "status = پیشرفت" با CentOS 7.5 و 7.6 کار می کند

پاسخ فوق توسطdavidDavidson نشان می دهد این ویژگی اخیراً در Coreutils 8.24 اضافه شده است.

نسخه 8.24 از هسته های اصلی GNU شامل یک پچ برای dd است که یک پارامتر را برای چاپ پیشرفت معرفی می کند.

ممکن است این مورد باشد ، اما ممکن است CentOS از همان نسخه نسخه برداری پیروی نمی کند.

نسخه Coreutils که با CentOS 7.6.1810 همراه است:

 coreutils-8.22-23.el7.x86_64 : A set of basic GNU tools commonly used in shell scripts
 

و نسخه dd که نصب شده است:

 [[email protected] /]# dd --version
dd (coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Paul Rubin, David MacKenzie, and Stuart Kemp.
 

این نسخه های 8.22 را نشان می دهد .

با این حال ، من "وضعیت = پیشرفت" را با dd در هر دو CentOS 7.5 و CentOS 7.6 (هر دو با نسخه 8.22 Coreutils) آزمایش کرده ام و به درستی کار می کند.

من نمی دانم چرا RedHat تصمیم به استفاده از چنین نسخه قدیمی Coreutils را می دهد ، اما عملکرد آن با 8.22 وجود دارد.


2



همانطور که در بالا گفته شد ، حداقل با "dd" از هسته های GNU یا جعبه مشغول ، با چاپ اطلاعات پیشرفت به stderr ، به یک سیگنال USR1 پاسخ می دهد.

من یک اسکریپت کمی بسته بندی را برای dd نوشتم که یک شاخص درصد کامل را نشان می دهد ، و سعی می کند به هیچ وجه با روند dd یا روش عملکرد دخالت نکند. می توانید آن را در github پیدا کنید:

http://github.com/delt01/dd_printpercent

متأسفانه ، این ترفند SIGUSR1 فقط با GNU dd (از بسته coreutils) یا حالت 'dd' مشغول باکس با ویژگی خاصی که در زمان کامپایل فعال شده است ، کار می کند. با سهام "dd" که در اکثر سیستمهای BSD ، از جمله FreeBSD و OS X وجود دارد ، کار نمی کند ... :(


1



می توانید با استفاده از برنامه پیشرفت هر برنامه اصلی را تماشا کنید progress - Coreutils Progress Viewer .

این می تواند نظارت داشته باشد:

cp mv dd tar گربه rsync grep fgrep egrep cut مرتب سازی md5sum sha1sum sha224sum sha256sum sha384sum sha512sum adb gzip gunzip bzip2 bunzip2 xz unxz lzma unlzma 7z 7za zcat bzcat lz

می توانید این صفحه را ببینیدhttp://manpages.ubuntu.com/manpages/bionic/man1/progress.1.html

می توانید در حین اجرای دستور ، از آن در یک پنجره ترمینال جداگانه استفاده کنید یا آن را با دستور dd راه اندازی کنید:

 dd if=/dev/sda of=file.img & progress -mp $!
 

در اینجا & دستور اول را خاموش می کند و بلافاصله به جای انتظار تا زمان پایان فرمان ، ادامه می یابد.

فرمان پیشرفت با راه اندازی می شود: -m بنابراین منتظر می ماند تا روند نظارت شده به پایان برسد ، -p بنابراین یک پید معین را نظارت می کند و $! آخرین پید دستور است.

اگر DD را با sudo صادر می کنید ، باید در پیشرفت نیز شرکت کنید:

 sudo dd if=/dev/sda of=file.img &
sudo progress -m
# with no -p, this will wait for all coreutil commands to finish
# but $! will give the sudo command's pid
 

1



انتشارات مرتبط


سرعت شبکه را بین دو جعبه چگونه آزمایش می کنید؟

چگونه می توانید لیستی از تمام خدمات شروع به کار بگیرید؟

چگونه سریعترین آینه را از خط فرمان انتخاب می کنید؟

چگونه اندازه استاندارد Ubuntu Desktop را در داخل Virtualbox تغییر دهید؟

چگونه منطقه زمانی crontab را تنظیم می کنید؟

چگونه پوسته پیش فرض را برای همه کاربران به bash تغییر می دهید؟

چگونه می توان در هنگام استفاده از -exec نام نام را در find پیدا کرد؟

چگونه دایرکتوری یک دستور را پیدا می کنید؟ [تکثیر]

چگونه عنوان ترمینال gnome-termininal فعال را از خط فرمان تنظیم می کنید؟ [تکثیر]

چگونه آخرین نسخه GNU Octave را نصب می کنید؟

[dd] سوال برچسب


چگونه حالت bash یا ssh را به یک ظرف در حال اجرا در حالت پس زمینه تبدیل کنیم؟

"بسته های زیر ذخیره نشده است:" چرا و چگونه می توانم آن را حل کنم؟

چگونه سرویس ها را فعال یا غیرفعال کنیم؟

چگونه می توان اندازه کل یک فهرست (پوشه) را از خط فرمان تعیین کرد؟

چگونه می توانم از docker بدون سودو استفاده کنم؟

چگونه می توانم با استفاده از ترمینال ، محتوای پوشه را در پوشه دیگری در یک پوشه دیگر کپی کنید؟

چگونه می توان با استفاده از دستور "tar" پرونده ها را به پوشه دیگری استخراج کرد؟

متن را با استفاده از دستورات متن را پیدا کرده و جایگزین کنید

چگونه می توانم رمزعبور اداری گمشده را تنظیم مجدد کنم؟

دستور تعیین IP عمومی من؟