Score:8

วิธีเขียนทับฮาร์ดไดรฟ์ขนาดใหญ่มาก (18TB) ด้วยข้อมูลแบบสุ่มโดยใช้คำสั่งเชลล์ใน Linux

ธง cn

ฉันต้องการเขียนทับฮาร์ดไดรฟ์ขนาดใหญ่มาก (18TB) ด้วยไบต์แบบสุ่ม เพื่อตรวจสอบข้อมูลอัจฉริยะสำหรับเซ็กเตอร์ที่จัดสรรใหม่หรือข้อผิดพลาดอื่นๆ

เนื่องจากแบดบล็อกมีข้อจำกัดบางประการเกี่ยวกับจำนวนบล็อกที่จะใช้งานได้ในการรันครั้งเดียว ฉันจึงลองใช้ "วิธีการตั้งค่าการเข้ารหัส" ที่อธิบายไว้ใน archlinux wiki:

https://wiki.archlinux.org/title/Badblocks#Finding_bad_sectors

ฉันตั้งค่าอุปกรณ์โลจิคัลเข้ารหัส eld บนไดรฟ์ทั้งหมด จากนั้นใช้คำสั่ง "shred" เพื่อเขียนเลขศูนย์ไปยังอุปกรณ์ eld ที่เปิดอยู่:

cryptsetup เปิด /dev/device eld --type ธรรมดา --cipher aes-xts-plain64
ฉีก -v -n 0 -z /dev/mapper/eld

มันไปพิมพ์บรรทัดเช่น

ฉีก: /dev/mapper/eld: ผ่าน 1/1 (000000)...870MiB/17TiB 0%
ฉีก: /dev/mapper/eld: ผ่าน 1/1 (000000)...1.7GiB/17TiB 0%
...
ฉีก: /dev/mapper/eld: ผ่าน 1/1 (000000)...4.1TiB/17TiB 24%

แต่แล้วก็หยุดลงที่ 4.1TiB/17TiB ฉันได้ตรวจสอบสิ่งนี้ด้วย hexdump เลขศูนย์ไม่ได้เขียนเกินที่อยู่ไบต์ 0x428249b0000 (4570459340800 ~ 4.156 TiB):

hexdump -C -- ข้าม 0x428249a0000 /dev/mapper/eld | ศีรษะ
428249a0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
428249b0000 b3 cd d0 34 72 15 f2 2c f6 32 90 fb 69 24 1f ec |...4r..,.2..i$..|
428249b0010 a0 f4 88 a5 56 e7 13 82 94 e5 e0 f5 37 da c3 59 |....V.......7..Y|
428249b0020 9b 55 9f d8 39 a1 41 dc 52 ca 7b 3a 95 f5 59 e2 |.U..9.A.R.{:..Y.|

คำสั่งมาตรฐานจำนวนมากดูเหมือนจะมีปัญหากับดิสก์ความจุสูง เนื่องจากจำนวนที่เกี่ยวข้องนั้นใหญ่เกินไปสำหรับประเภทข้อมูล 32 บิตเครื่องมืออ่าน/เขียนใดบน Linux ที่สามารถอ่าน/เขียนเกินขอบเขตจินตนาการ 2TiB,4TiB เหล่านี้ได้อย่างน่าเชื่อถือ

in flag
4 TB คือขีดจำกัดทางกายภาพของ MBR คุณสร้างตารางพาร์ติชัน MBR แทน GPT และตั้งค่าพาร์ติชันเดียวหรือไม่
cn flag
นี่คือดิสก์ใหม่ที่ไม่มีพาร์ติชันใดๆ ฉันไม่คิดว่า MBR หรือพาร์ติชั่นมีความเกี่ยวข้อง ฉันต้องการเขียนทับทั้งดิสก์ ดังนั้นจึงไม่ควรรักษาข้อมูล MBR หรือ GPT ไว้
marcelm avatar
ng flag
_"แต่แล้วก็หยุดที่ 4.1TiB/17TiB"_ - มันหยุดได้อย่างไร ไม่มีความคืบหน้าอีกต่อไป? `shred` เพิ่งออกอย่างหมดจด? ข้อความแสดงข้อผิดพลาดใด ๆ มีอะไรอยู่ในบันทึกของระบบในเวลานั้นหรือไม่? ต่อจากคำถามของ Gerald นั่นหมายความว่า `/dev/device` ในคำสั่งของคุณเป็นดิสก์เต็ม ไม่ใช่พาร์ติชันใช่หรือไม่
cn flag
@marcelm Shred ยังคงทำงานต่อไป แต่ไม่มีเอาต์พุตอีกเป็นเวลานานหลังจากบรรทัด 4.1TiB ไม่มีข้อความแสดงข้อผิดพลาดใดๆ บนหน้าจอหรือ syslog เส้นทาง /dev/device หมายถึงฮาร์ดไดรฟ์ SATA ทั้งหมด
Score:12
ธง us

แก้ไข: อัปเดตตามความคิดเห็น

ฉันจะใช้

dd if=/dev/urandom of=/dev/sdX bs=1M สถานะ=ความคืบหน้า iflag=fullblock oflag=fullblock

ที่นี่ /dev/sdX เป็นอุปกรณ์สำหรับฮาร์ดดิสก์

cn flag
สิ่งนี้ดูไม่น่าเชื่อถือ เนื่องจากการอ่านจาก urandom อาจล้มเหลวในช่วงกลางของบล็อก จากนั้น dd จะเขียนข้อมูลน้อยกว่าบล็อกทั้งหมด มีวิธีแก้ไขด้วย iflag=fullblock oflag=fullblock ดู https://unix.stackexchange.com/a/121888/90056
jm flag
แม้ว่าการเขียนทับด้วยข้อมูลแบบสุ่มจะดูสมเหตุสมผล แต่การใช้ `/dev/zero` เป็นอินพุตควรทำงานกับผู้โจมตีใด ๆ ยกเว้นผู้โจมตีที่แน่วแน่ที่สุด
Remember Monica avatar
ru flag
นอกจากนี้ /dev/urandom ยังช้ามาก การใช้บางอย่างเช่น openssl rc4 เพื่อสร้างข้อมูลหลอกเทียมนั้นน่าจะใกล้เคียงกับความเร็ว I/O ที่ซีพียูต่ำกว่ามาก หรือ /dev/zero ซึ่งควรจะดีพอ หรือเครื่องมือเช่นฉีก
joshudson avatar
cn flag
@ JánLalinský: สิ่งต่าง ๆ เปลี่ยนไปไหมเพราะฉันเคยใช้สิ่งนี้ประมาณปี 2000 และฉันไม่เคยสังเกตบล็อกบางส่วนจาก urandom เลยสักครั้ง?
peterh avatar
pk flag
@joshudson ฉันไม่ค่อยใช่ ไม่ค่อยเกิดขึ้นจริง ๆ และมีสถานการณ์ที่เป็นปัญหาอยู่เสมอ ฉันคิดว่ามันเกิดจากพวกเขา แม้ว่าบางครั้งฉันจำเป็นต้องติดตาม dd เพื่อทำความเข้าใจว่าเกิดอะไรขึ้น
ilkkachu avatar
us flag
@JánLalinský มันไม่สำคัญ: ถ้า `dd` อ่านบล็อกที่ไม่สมบูรณ์ มันก็แค่เขียนบล็อกที่ไม่สมบูรณ์ด้วย หมายความว่าบล็อกที่เขียนจะไม่สอดคล้องกันหลังจากนั้น แต่ระบบปฏิบัติการจะบัฟเฟอร์ใน `/dev/sdX` อยู่ดี `count=NN` มีความสำคัญมากกว่า เนื่องจาก AFAIK บล็อกที่ไม่สมบูรณ์จะรวมอยู่ในการนับ
ilkkachu avatar
us flag
`urandom` คือ/ช้า อย่างน้อยเมื่อฉันทดสอบครั้งล่าสุด ฉันคิดว่าอัลกอริทึมที่ใช้นั้นเปลี่ยนไป (เป็น ChaCha20 หรือเปล่า) ในบางจุด ดังนั้นมันอาจจะเร็วกว่านี้ ฉันคิดว่าฉันใช้บางอย่างเช่น `openssl enc -aes-128-ctr -nosalt -pass file:/dev/urandom ...` ในบางจุด
Peter Cordes avatar
ke flag
ทำไม `bs` ใหญ่จัง ขนาดบล็อกที่เล็กกว่าเช่น 128k (ประมาณครึ่งหนึ่งของขนาดแคช L2) มีแนวโน้มที่จะทับซ้อน I/O กับ CPU ที่มีค่า "read" บนอุปกรณ์ "urandom" ได้ดีกว่า แต่ตามที่ผู้แสดงความคิดเห็นหลายคนกล่าวไว้ แหล่งที่มาของการสุ่มที่เร็วกว่านั้นเป็นความคิดที่ดี *มาก* บน i7-6700k Skylake ของฉันที่ 3.9GHz, Linux 5.12.15-arch1-1, `pv /dev/null` รายงาน 55.6 MiB/s ดังนั้นขึ้นอยู่กับความเร็วของ HDD ประมาณครึ่งหนึ่งถึงหนึ่งในสี่ของความเร็วของดิสก์ ทำให้กระบวนการเขียน 18TiB ใช้เวลานานเป็นสองเท่าถึง 4 เท่า
Peter Cordes avatar
ke flag
สันนิษฐานว่าคุณต้องการใช้ CSPRNG หากคุณกำลังจะเขียนการสุ่มแทนที่จะเป็นศูนย์ แต่โดยทั่วไปแล้ว ถ้าคุณต้องการแหล่งที่มาของการสุ่มอย่างรวดเร็วบนเครื่อง x86 โปรดดู [วิธีใดเป็นวิธีที่เร็วที่สุดในการสร้าง ไฟล์ข้อความ 1 GB ที่มีตัวเลขสุ่ม?](https://unix.stackexchange.com/a/324520) - คำตอบของฉันสามารถเปลี่ยนได้ง่ายๆ เพียงเก็บผลลัพธ์ xorshift128+ แบบดิบจากเวกเตอร์ SSE2 หรือ AVX2 ลงในบัฟเฟอร์เอาต์พุตแทน ประมวลผลเป็นตัวเลข ASCII + ช่องว่าง คอร์เดียวควรยังคงทำงานใกล้เคียงกับความเร็วของ memcpy ซึ่งเร็วกว่า HDD ใดๆ มาก
marcelm avatar
ng flag
[`dd` โดยทั่วไปไม่มีประโยชน์](https://unix.stackexchange.com/questions/12532/dd-vs-cat-is-dd-still-relevant-these-days) (ใช่ ข้อยกเว้นที่มีอยู่) อาจช้าลงเนื่องจากขนาดบล็อกที่ไม่เหมาะสม (และใช่ `1M` นั้นต่ำกว่ามาตรฐาน) และ [อาจเป็นอันตราย](https://unix.stackexchange.com/questions/17295/when-is-dd-suitable- สำหรับการคัดลอกข้อมูลหรือเมื่อมีการอ่านและเขียนบางส่วน) _อย่าใช้ `dd`._ ใช้ `cat` หรือ `pv` หากคุณต้องการตัวบ่งชี้ความคืบหน้า เครื่องมือเหล่านั้นง่ายกว่ามาก เร็วกว่ามาก และไม่เต็มไปด้วยหลุมพราง
Zac67 avatar
ru flag
ต้องการข้อมูลแบบสุ่มเพื่อป้องกันการกู้คืนข้อมูลในระดับสื่อ -drive-multiple-times-better-th) หรืออย่างน้อยก็ล้าสมัยอย่างมาก เพียงใช้ `/dev/zero`
Score:1
ธง cn

แทนที่จะใช้ cryptsetup + shred ฉันใช้ cryptsetup + pv (cat ควรทำงานแทน pv ด้วย แต่จะไม่ให้ข้อมูลความคืบหน้าใด ๆ ) และชี้ stdin ไปที่ /dev/zero:

cryptsetup เปิด /dev/device eld --type ธรรมดา --cipher aes-xts-plain64
</dev/zero pv >/dev/mapper/eld

สิ่งนี้มีข้อได้เปรียบ (เมื่อเทียบกับ dd) ที่ไม่จำเป็นต้องระบุอาร์กิวเมนต์ที่คลุมเครือ และประสิทธิภาพการทำงานบนลิงก์ SATA 3.3 6Gb/s นั้นดี (>200MiB/s)

pv ยังคงล้มเหลวเมื่อถึงจุดสิ้นสุด แต่ฉันได้ตรวจสอบแล้วว่ามันเขียนทับอุปกรณ์ลอจิคัลทั้งหมดด้วยเลขศูนย์ ซึ่งหมายความว่า dm-crypt เขียนทับฮาร์ดไดรฟ์ทั้งหมดด้วยไบต์สุ่มหลอก

ขณะนี้สามารถตรวจสอบข้อผิดพลาดของฮาร์ดไดรฟ์ได้อย่างน้อยสองวิธี:

1. มองหาข้อมูล SMART ที่ลดลง (เช่น ภาคที่จัดสรรใหม่) ในผลลัพธ์ของ

smartctl -a /dev/device

2.อ่านข้อมูลจาก /dev/mapper/eld และตรวจสอบว่าไบต์ที่อ่านทั้งหมดมีค่าเป็นศูนย์ เรียกใช้คำสั่ง cmp จาก diffutils เพื่อทำการเปรียบเทียบนี้:

cmp -l -b /dev/zero /dev/mapper/eld

มันจะพิมพ์ที่อยู่ไบต์ของรายการที่ไม่ตรงกันครั้งแรกและออกด้วยข้อผิดพลาด หรือไม่พบรายการที่ไม่ตรงกัน จากนั้นจะพิมพ์ "cmp EOF บน /dev/mapper/eld ..." (และยังคงออกโดยมีข้อผิดพลาด)

ไม่ตรงกันหมายความว่าฮาร์ดไดรฟ์มีความล้มเหลวอย่างถาวรในการบันทึกที่ตำแหน่งนั้น หรืออาจเป็นข้อผิดพลาดแบบสุ่มที่จะไม่ทำซ้ำในตำแหน่งเดิมทุกประการ

ในการเรียกใช้ cmp ครั้งแรก ฉันได้รับข้อผิดพลาดหลังจากผ่านไป 8 วินาที ซึ่งฉันประหลาดใจมากที่เห็น ข้อมูล SMART ไม่แสดงการลดระดับใดๆ และ syslog ไม่แสดงข้อความแสดงข้อผิดพลาดเกี่ยวกับฮาร์ดไดรฟ์

จากนั้นฉันพยายามเรียกใช้คำสั่ง cmp อีกครั้งเพื่อตรวจสอบว่าข้อผิดพลาดในการบันทึกเป็นจริงหรือไม่ แต่ตำแหน่งที่ไม่ตรงกันนั้นไม่เกิดขึ้นอีก มันเป็นข้อผิดพลาดแบบสุ่มในกระบวนการอ่าน + ประเมินทั้งหมด ดังนั้นอย่าพึ่งพาคำสั่ง cmp เพียงครั้งเดียว ในกรณีที่พบไม่ตรงกันให้เรียกใช้อีกครั้ง หากข้อผิดพลาดหายไป ให้ไม่ต้องสนใจข้อผิดพลาดแรกหรือลองอีกครั้ง หากข้อผิดพลาดยังคงอยู่ ให้ส่งคืนฮาร์ดไดรฟ์ให้กับผู้ขายเนื่องจากอาจมีข้อบกพร่องมากที่สุด และการเสื่อมสภาพตามเวลาอาจเร็วกว่าฮาร์ดไดรฟ์ปกติ

.

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา