Score:3

การสกัดน้ำมันดินจากเทปหลายวอลุ่มขณะคำนวณ shasum

ธง cn

ในฐานะส่วนหนึ่งของระบบสำรองข้อมูล เราจำลองชุดข้อมูล zfs จากระบบ TrueNAS ไปยังเซิร์ฟเวอร์สำรองข้อมูล 2-3 เครื่อง ซึ่งเครื่องหนึ่งกำลังรัน TrueNAS Scale และเชื่อมต่อเทปไดร์ฟ LTO-5 บางครั้งเราเขียนเนื้อหาสแน็ปช็อตแบบอ่านอย่างเดียวลงในเทป เนื่องจากชุดข้อมูลเหล่านี้บางส่วนมีขนาดใหญ่ tar จึงใช้กับแฟล็ก --multi-volume

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

หลังจากนี้ เนื้อหาทั้งหมดของสแน็ปช็อตจะถูกเขียนลงเทปโดยใช้

  tar --acls --xattrs --spares --label="SomeLabel" --multi-volume -cvpf /dev/nst0 *

สิ่งนี้ช่วยเราได้ดี อย่างไรก็ตาม ฉันต้องการตรวจสอบข้อมูลหลังจากเขียนลงเทปแล้ว ฉันต้องการหลีกเลี่ยงการแยกชุดข้อมูลทั้งหมดของไฟล์ไปยังตำแหน่งเริ่มต้น ซึ่งอาจทำให้เรียกใช้ "sha256sum -c" ได้ เนื่องจากเซิร์ฟเวอร์สเกล TrueNAS ไม่มีพื้นที่เพิ่มเติมเพียงพอสำหรับชุดข้อมูลบางชุดที่จะแยกออกมา แต่ฉันพยายาม:-

  tar --multi-volume -xf /dev/nst0 --to-command=tar-shasums.sh | ที ตรวจสอบ datasetname.sha25sum

โดยที่ tar-shasums.sh อยู่ในบรรทัดเหล่านี้:

#!/bin/bash

sha1=`sha1sum`
เสียงสะท้อน -n $sha1 | sed 's/ .*$//'
เสียงสะท้อน " $TAR_FILENAME"

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

ดูเหมือนว่า "--to-command" ยังคงทำงานอยู่สำหรับไฟล์นั้น เนื่องจากยังไม่ได้รับข้อมูลทั้งหมดเพื่อสร้าง shasum แต่ยังไม่สามารถเสร็จสิ้นได้จนกว่าจะเปลี่ยนเทป แต่จะไม่สามารถเปลี่ยนเทปได้จนกว่า มันจบแล้ว...

ขณะนี้ฉันฆ่ากระบวนการ shasum ซึ่งอนุญาตให้ tar ดำเนินการต่อกับเทปถัดไป แต่หมายความว่าไม่สามารถตรวจสอบไฟล์หนึ่งไฟล์ที่ครอบคลุมสองวอลุ่มได้เว้นแต่ไฟล์นั้นจะถูกแยกและตรวจสอบด้วยตนเอง ไม่เหมาะ

ฉันคาดว่าจะไม่ แต่มีวิธีแก้ไขหรือไม่? มีวิธีใดบ้างในการสร้าง shasums ที่ไม่เกี่ยวข้องกับการแยก tar ทั้งหมดไปยังดิสก์ก่อน หรือมีวิธีใดที่จะปลดล็อค /dev/nst0 เพื่อให้ tar อ่านต่อจากเทปที่ใส่ใหม่โดยไม่ต้องฆ่า shas256sum

Gerard H. Pille avatar
in flag
จะเกิดอะไรขึ้นถ้าสารสกัดน้ำมันดินเขียนไปยังไพพ์ที่มีชื่อ และเธอกำลังอ่านผลรวมจากไพพ์นั้น
cn flag
เมื่อคืนฉันได้ดูแหล่งที่มาของ tar และดูเหมือนว่า "--to-command" จะสร้างไพพ์ จากนั้นใช้ fork เพื่อเรียกใช้สคริปต์และไพพ์ข้อมูลไฟล์ไปยังมัน ส้อมนั้นทำให้ตัวอธิบายไฟล์ของพาเรนต์เช่น tar ทั้งหมดถูกส่งไปยังสคริปต์ ซึ่งรวมถึง /dev/nst0 และไม่ใช่แค่ไพพ์ที่สคริปต์กำลังอ่านข้อมูล โปรดจำไว้ว่า เหตุผลในการใช้ --to-command คือรันต่อไฟล์ที่แยกจาก tar ดังนั้นคุณจึงสามารถสร้างเช็คซัมสำหรับแต่ละไฟล์ แทนที่จะเป็นไฟล์เก็บถาวร tar โดยรวม
Score:1
ธง cn

เมื่อคืนฉันได้ดูแหล่งที่มาของ tar และดูเหมือนว่า "--to-command" จะสร้างไพพ์ จากนั้นใช้ fork เพื่อเรียกใช้สคริปต์และไพพ์ข้อมูลไฟล์ไปยังมัน

ดังนั้นปัญหาคือ fork ทำให้กระบวนการ forked สืบทอดตัวอธิบายไฟล์พาเรนต์ทั้งหมดซึ่งรวมถึงอุปกรณ์ /dev/nst0 ที่ tar เปิดอยู่ จากนั้น Tar ปิด /dev/nst0 พร้อมสำหรับการเปลี่ยนแปลงสื่อ แต่กระบวนการแยกที่รอข้อมูลไพพ์เพิ่มเติมยังคงเปิดอยู่ ดังนั้นการหยุดชะงัก

ฉันได้แก้ไขปัญหานี้ไปแล้วบางส่วนโดยเปลี่ยนสคริปต์ที่ทำงานเป็นปิด /dev/nst0 descriptor เสมอ

อุปกรณ์=/dev/nst0
ไฟล์=`lsof -p $$ | grep ${DEVICE} | awk '{พิมพ์ $4}'`
ไฟล์=${ไฟล์::-1}
eval "exec ${file}<&-"

จากนั้นมีเพียงหนึ่งกระบวนการ "sh" ที่ดูเหมือนจะยังคงค้างอยู่ในตัวอธิบายไฟล์ "fuser -u /dev/nst0" แสดงสิ่งนี้และเป็นวิธีแก้ปัญหาชั่วคราว คุณสามารถใช้ gdb เพื่อปิดได้ หลังจากนั้นสื่อจะเปลี่ยนแปลงและเช็คซัมที่เหลือสร้างอย่างถูกต้อง

gdb -p PID
ปิด (FD)

ฉันไม่แน่ใจว่าเป็นไปได้หรือไม่ที่จะใช้ fork แต่ไม่ผ่านตัวอธิบายไฟล์ทั้งหมดไปยังกระบวนการที่ fork แต่ดูเหมือนว่าจะเป็นทางออกสุดท้าย

ฉันจะอัปเดตคำตอบนี้หากฉันเข้าใจ

โพสต์คำตอบ

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