มีวิธีการรับเปอร์เซ็นต์ใน DD ใน linux หรือไม่


41

ดังนั้นนี่คือสิ่งที่เกิดขึ้น

ฉันเริ่มสำรองข้อมูลของไดรฟ์บนเซิร์ฟเวอร์ของฉันผ่าน Linux live USB ฉันเริ่มคัดลอกไดรฟ์แรกด้วยddคำสั่งวานิลลา เพิ่งsudo dd if=/dev/sda of=/dev/sdc1แล้วฉันจำได้ว่านี่เพิ่งปล่อยให้คอนโซลว่างเปล่าจนกว่ามันจะเสร็จสิ้น

ฉันจำเป็นต้องเรียกใช้การสำรองข้อมูลที่แตกต่างกันไปยังไดรฟ์เดียวกันดังนั้นฉันจึงเริ่มต้นด้วยเช่นกันsudo dd if=/dev/sdb of=/dev/sdc3 status=progressและจากนั้นฉันก็ได้รับข้อความที่แสดงอัตราการถ่ายโอนปัจจุบันและความคืบหน้าเป็นไบต์

ฉันหวังว่าจะมีวิธีการที่แสดงเปอร์เซ็นต์ของการสำรองข้อมูลแทนการคำนวณทางคณิตศาสตร์ว่ามีการสำรองข้อมูลจำนวนกี่ไบต์จาก 1.8TBs มีวิธีที่ง่ายกว่าในการทำเช่นนี้มากกว่า status = คืบหน้า

คำตอบ:


68

ดูคำตอบจากคำถามนี้[ 1 ]

pv

ตัวอย่างเช่นคุณสามารถใช้pv ก่อนที่จะเริ่ม

sudo apt-get install pv    # if you do not have it
pv < /dev/sda > /dev/sc3   # it is reported to be faster
pv /dev/sda > /dev/sc3     # it seems to have the same speed of the previous one
#or 
sudo dd if=/dev/sda | pv -s 1844G | dd of=/dev/sdc3  # Maybe slower 

เอาท์พุท[ 2 ] :

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

หมายเหตุ:
โดยเฉพาะอย่างยิ่งสำหรับไฟล์ขนาดใหญ่คุณอาจต้องการเห็นman ddและตั้งค่าตัวเลือกที่จำเป็นในการเร่งความเร็วทั้งหมดบนฮาร์ดแวร์ของคุณเช่นbs=100Mการตั้งค่าบัฟเฟอร์oflag=syncการนับไบต์ที่มีประสิทธิภาพเขียนอาจdirect...
ตัวเลือก-sใช้พารามิเตอร์จำนวนเต็ม1.8T-->1844Gเท่านั้น
ในขณะที่คุณสามารถสังเกตเห็นจากบรรทัดแรกคุณไม่จำเป็นddเลย


kill -USR1 pid

หากคุณเปิดใช้งานddคำสั่งแล้วเมื่อคุณแยก PID ( Ctrl- Z+ bgและอ่านแล้วหรือpgrep ^dd... ) คุณสามารถส่งสัญญาณUSR1(หรือSIGUSR1หรือSIGINFOดูด้านล่าง) และอ่านผลลัพธ์
หาก PID ของโปรแกรมคือ 1234 ด้วย

kill -USR1 1234

dd จะตอบใน terminal ของ STDERR ด้วยสิ่งที่คล้ายกัน

4+1 records in
4+0 records out
41943040 bytes (42 MB) copied, 2.90588 s, 14.4 MB/s

คำเตือน:ภายใต้ OpenBSD คุณอาจจะต้องตรวจสอบล่วงหน้าพฤติกรรมของkill[ 3 ] :
kill -SIGINFO 1234ใช้แทน
มันมีอยู่ sigaction SIGINFOชื่อ SIGUSR1หนึ่งในกรณีนี้ควรยุติโปรแกรม ( dd) ...
การใช้งานภายใต้อูบุนตู-SIGUSR1( 10)


9
คุณจะพบว่าการใช้ 'bs' บนคำสั่ง dd นั้นจะเพิ่มความเร็วอย่างมหาศาล เช่น dd if = / dev / blah ของ = / tmp / blah bs = 100M เพื่อถ่ายโอนบล็อก 100M ต่อครั้ง
Sirex

1
@Sirex แน่นอนว่าคุณต้องตั้งค่า bs เพื่อปรับอัตราการถ่ายโอนให้เหมาะสมที่สุดกับฮาร์ดแวร์ของคุณ ... ในคำตอบนั้นคือ commandline ของ OP อีกครั้ง :-)
Hastur

3
@Criggie: นั่นอาจเป็นเพราะddการwrite()โทรของระบบทั้งหมดเสร็จสิ้นแล้วและfsyncหรือcloseถูกปิดกั้นเพื่อรอการเขียนเพื่อเข้าถึงดิสก์ ด้วย USB Stick ที่ช้าลินุกซ์บัฟเฟอร์ I / O เริ่มต้นสำหรับจำนวนบัฟเฟอร์การเขียนที่สกปรกขนาดใหญ่จะนำไปสู่พฤติกรรมที่แตกต่างเชิงคุณภาพมากกว่าไฟล์ขนาดใหญ่ในดิสก์ที่รวดเร็วเนื่องจากบัฟเฟอร์มีขนาดใหญ่เท่ากับสิ่งที่คุณคัดลอกและมัน ยังคงต้องใช้เวลาสังเกตเห็นได้ชัด
Peter Cordes

5
คำตอบที่ดี อย่างไรก็ตามฉันต้องการทราบว่าใน OpenBSD สัญญาณการฆ่าที่ถูกต้องคือ SIGINFO ไม่ใช่ SIGUSR1 ใช้ -USR1 ใน OpenBSD เพียงแค่จะฆ่า dd ดังนั้นก่อนที่คุณจะลองทำสิ่งนี้ในสภาพแวดล้อมใหม่ในการถ่ายโอนที่คุณไม่ต้องการขัดจังหวะคุณอาจต้องการทำความคุ้นเคยกับการทำงานของสภาพแวดล้อม (ในการทดสอบที่ปลอดภัยกว่า)
TOOGAM

1
คำแนะนำสำหรับการส่งสัญญาณddเป็นข้อมูลที่ดีจริงๆโดยเฉพาะอย่างยิ่งสำหรับเซิร์ฟเวอร์ที่คุณไม่สามารถ / ไม่ต้องการที่จะติดตั้งpv
ไมค์

38

เครื่องมือ go-to ของฉันสำหรับสิ่งนี้คือprogress:

เครื่องมือนี้สามารถอธิบายได้ว่าเป็นคำสั่ง C ขนาดเล็ก , สกปรก, Linux และ OSX เท่านั้นที่ค้นหาคำสั่ง coreutils พื้นฐาน (cp, mv, dd, tar, gzip / gunzip, cat ฯลฯ ) ที่ทำงานอยู่ในระบบของคุณในปัจจุบันและ แสดง เปอร์เซ็นต์ของข้อมูลที่คัดลอก นอกจากนี้ยังสามารถแสดงเวลาและปริมาณงานโดยประมาณและจัดให้มีโหมด "เหมือนด้านบน" (การตรวจสอบ)

ภาพหน้าจอ "<code> ความคืบหน้า </code> กำลังทำงาน"

มันแค่สแกน/procหาคำสั่งที่น่าสนใจแล้วมองไปที่ไดเรกทอรีfdและfdinfoค้นหาไฟล์ที่เปิดอยู่และค้นหาตำแหน่งและรายงานสถานะของไฟล์ที่ใหญ่ที่สุด

มันเบามากและเข้ากันได้กับแทบทุกคำสั่ง

ฉันพบว่ามีประโยชน์อย่างยิ่งเพราะ:

  • เมื่อเทียบกับpvใน pipe หรือdcflddฉันไม่ต้องจำคำสั่งที่แตกต่างกันเมื่อฉันเริ่มการทำงานฉันสามารถตรวจสอบสิ่งต่าง ๆ หลังจากข้อเท็จจริง
  • เมื่อเทียบกับkill -USR1มันใช้งานได้กับทุกคำสั่งฉันไม่ต้องตรวจสอบ manpage ซ้ำอีกครั้งเพื่อให้แน่ใจว่าฉันไม่ได้ฆ่าสำเนาโดยไม่ตั้งใจ นอกจากนี้ยังเป็นเรื่องดีที่เมื่อเรียกใช้โดยไม่มีพารามิเตอร์จะแสดงความคืบหน้าสำหรับคำสั่ง "การถ่ายโอนข้อมูล" ทั่วไปใด ๆ ที่กำลังทำงานอยู่ดังนั้นฉันจึงไม่ต้องค้นหา PID
  • เทียบกับpv -dอีกครั้งฉันไม่จำเป็นต้องค้นหา PID

1
หมายเหตุ: คุณสามารถตรวจสอบมากกว่ากระบวนการ coreutils --command <command-name>เพียงแค่ระบุชื่อของคำสั่งด้วย
jpaugh

1
นี่มันเจ๋งมาก!
Floris

25

เรียกใช้ddจากนั้นในเชลล์แยกต่างหากให้เรียกใช้คำสั่งต่อไปนี้:

pv -d $(pidof dd) # root may be required

สิ่งนี้จะทำให้ pv ได้รับสถิติเกี่ยวกับตัวอธิบายไฟล์ที่เปิดทั้งหมดของddกระบวนการ มันจะแสดงให้คุณทั้งที่ที่การอ่านและการเขียนบัฟเฟอร์นั่ง


2
ทำงานหลังจากข้อเท็จจริง! ที่น่าตื่นตาตื่นใจ !!
jpaugh

3
มันเจ๋งมาก มันหลีกเลี่ยง memory-bandwidth + context-switch overhead ของการ piping ข้อมูลทั้งหมดผ่าน 3 กระบวนการ! @ jpaugh: ฉันคิดว่ามันแค่มอง/proc/$PID/fdinfoหาตำแหน่งไฟล์และ/proc/$PID/fdเพื่อดูว่าไฟล์ใด (และทำให้ขนาด) ใช่แล้วมันเจ๋งมากและเป็นความคิดที่ดีสำหรับฟีเจอร์ แต่ฉันจะไม่เรียกมันว่า "น่าทึ่ง" เพราะมีลินุกซ์ API ที่ให้มันสำรวจตำแหน่งไฟล์ของกระบวนการอื่น
Peter Cordes

@PeterCordes ฉันไม่ทราบว่าตำแหน่งไฟล์ถูกเปิดเผยโดยเคอร์เนล (ฉันใช้ชีวิตอย่างระมัดระวังในการเตรียมpvท่อล่วงหน้า) แน่นอนฉันคิดว่ามากพอที่ฉันเห็นว่ามันใช้งานได้
jpaugh

9

มีทางเลือกที่จะเป็น:dddcfldd

dcfldd เป็น GNU dd รุ่นปรับปรุงที่มีคุณสมบัติที่มีประโยชน์สำหรับนิติเวชและความปลอดภัย

สถานะเอาท์พุท - dcfldd สามารถอัปเดตผู้ใช้ของความคืบหน้าในแง่ของปริมาณข้อมูลที่ถ่ายโอนและการดำเนินการนานเท่าใด

dcfldd if=/dev/zero of=out bs=2G count=1 # test file
dcfldd if=out of=out2 sizeprobe=if
[80% of 2047Mb] 52736 blocks (1648Mb) written. 00:00:01 remaining.

http://dcfldd.sourceforge.net/
https://linux.die.net/man/1/dcfldd


มันเป็นชื่อคำสั่งที่ยาวกว่า ... ชัดเจนมันด้อยกว่า (+1)
jpaugh

6

เป็นเปอร์เซ็นต์ที่คุณต้องทำคณิตศาสตร์ แต่คุณสามารถรับความก้าวหน้าของ dd ในรูปแบบที่มนุษย์อ่านได้แม้หลังจากเริ่มแล้วโดยทำ kill -USR1 $(pidof dd)

กระบวนการ dd ปัจจุบันจะแสดงคล้ายกับ:

คัดลอก 11117279 ไบต์ (11 MB, 11 MiB), 13.715 s, 811 kB / s


4
นั่นเป็นสิ่งเดียวกับที่status=progressให้โดยทั่วไป
rakslice

1
จริง ๆ แล้วฉันกำลังจะบอกว่าเป็นสิ่งเดียวกันกับที่สถานะ = ความคืบหน้าให้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.