ทดสอบว่ามี subvolume btrfs หรือไม่


0

ฉันมีปัญหาในโพรซีเดอร์ bash ซึ่งควรพอร์ตการสำรองข้อมูลดิสก์ rsync เก่าของฉัน (และที่เก็บถาวร) ไปยังการสำรองสแน็ปช็อต btrfs ในอนาคตของฉัน

ฉันต้องการใช้สาย:

 # btrfs subvolume snapshot /targetdir/@monthly.9 /targetdir/@monthly.8

หาก snapshot /targetdir/@monthly.8 ไม่มี jet อยู่แสดงว่าได้รับการสร้างตามที่ฉันต้องการ

แต่ถ้า /targetdir/@monthly.8 อยู่ที่นั่นแล้ว /targetdir/@monthly.8/@onthly.9 จะถูกสร้างขึ้นแทน

ฉันขาดการทดสอบสำหรับการดำรงอยู่ที่นี่พูดว่า:

# [[ -bsnap <snap-path> ]] # =TRUE if <snap-path> exists and is a snap!

ฉันจะเอาชนะปัญหานี้ได้อย่างไร


btrfs-progs ของฉัน v4.4 ที่นี่บน Ubuntu 16.4 (ทุกวันจนถึงปัจจุบัน) ดูเหมือนจะ overinterprete ผู้ชาย btrfs-subvolume ที่บอกว่า: "... snapshot [-r] <source> <dest> / [ ] <name> ... หากมอบเฉพาะ <dest> ระบบย่อยจะถูกตั้งชื่อเป็น basename ของ <source> " ดูเหมือนว่าจะเพิ่มโดยบังเอิญ: "หาก <dest> / ชื่อมีอยู่แล้วให้สร้าง <dest> / <name> / $ (basename <source>)" ฉันจะเรียกมันว่าข้อผิดพลาดหรือคุณลักษณะที่ชั่วร้าย
prometheos

คำตอบ:


0

ฉันเดาว่าคุณไม่ต้องการเรียกใช้btrfs subvolume snapshot …หาก/targetdir/@monthly.8มีอยู่ไม่ว่าจะเป็นอะไร แค่ทดสอบว่ามันมีอยู่:

[ -e /targetdir/@monthly.8 ]

หรือไม่มีอยู่

[ ! -e /targetdir/@monthly.8 ]

สิ่งที่มีประโยชน์มากขึ้น ถ้ามันมีอยู่เมื่อมันไม่ควรbtrfs subvolume deleteมัน เฉพาะในกรณีที่คำสั่งนี้ส่งคืนERROR: not a subvolumeจะต้องกังวลสิ่งที่เป็นวัตถุ ฉันแนะนำให้คุณจัดระเบียบเวิร์กโฟลว์ subvolumes จุดเมานท์ไดเรกทอรีและการอนุญาตในแบบที่@monthly.8เป็น subvolume เท่านั้น


แต่ถ้าคุณต้องรู้จริงๆ

btrfs subvolume show /targetdir/@monthly.8

จะประสบความสำเร็จหากเป็น subvolume มันจะล้มเหลวเป็นอย่างอื่น ตัวอย่าง:

btrfs subvolume show /targetdir/@monthly.8 &>/dev/null && echo "It's a subvolume!"

ฉันต้องการเพิ่มคำสั่งของฉันเป็นตัวเลือกเพิ่มเติมในคำตอบของคุณ จากนั้นฉันก็ลบคำตอบของฉันออกไป ฉันไม่คิดว่าฉันเป็นคนพิถีพิถันมากนัก!
prometheos

@prometheos See ฉันจะตอบคำถามของฉันเองได้ไหม? คำตอบของเราสามารถอยู่ร่วมกันได้ คุณสามารถยอมรับคำตอบของคุณเองถ้ามันเหมาะกับคุณดีกว่า
Kamil Maciorowski

ขอโทษ @ Kamil Maciorowski ที่เวลาผ่านไปนานมากก่อนที่ฉันจะยอมรับคำตอบ ตอนนี้ฉันต้องการคุณสมบัตินี้อย่างเร่งด่วนและคำตอบนี้มีประโยชน์ที่สุดที่ฉันสามารถนึกได้ในการใช้ฟังก์ชันเช่น - ใน bash:probe-subvolume() { btrfs subvolume show $1 &>/dev/null && { true; } || { false; }; }
prometheos

@prometheos ไม่เป็นไร อยากรู้อยากเห็น: ในด้านใดfoo && { true; } || { false; }ดีกว่าเพียงfoo?
Kamil Maciorowski

"โอ้ใช่ฉันรู้แล้วคนตัดและแปะมารเข้ามาหาฉันอย่างใดฉันได้รหัสครั้งแรกสำหรับการส่งข้อความต้นฉบับเช่น` ... || เสียงก้อง "$ 1 ไม่ได้เป็นเนื้อหาย่อยหรือไม่มีอยู่จริง"; false ;} . Here I used "false" for having the right return code: echo <text> would be allways "sucessful". Then I found that "weniger ist mehr" and removed the text, leaving the rest. You are right: even less ist even better. My shortened code (gets so short that one could do whithout the function!): probe-subvolume () {btrfs subvolume แสดง $ 1 &> / dev / null;} `สำหรับ @Kamil Maciorowski
prometheos

0

คำตอบโดย @Kamil Maciorowski นั้นดี แต่ขอให้ฉันจดจ่อกับการทดสอบการมีอยู่

บอกว่าฉันกำลังดีบั๊กและฉันจำเป็นต้องลองทำซ้ำและภาพรวมเป้าหมายมีอยู่แล้ว จากนั้นฉันก็ระแวดระวังและนั่ง "bash -e" (เช่นข้อผิดพลาดแรกออกจากเปลือกของฉันโปรดจำไว้ว่าฉันจะต้องเรียกใช้มันเป็นราก ... ) จากนั้นฉันชอบคำสั่งที่บอกฉันว่าเกิดอะไรขึ้นแล้วออก ดังนั้นฉัน:

    btrfs subvolume list  /targetdir/@monthly.9 | grep @monthly.8 &&  echo "$0 ERROR: snapshot /targetdir/@monthly.8 exists already!" && exit

คำสั่ง "รายการ subvolume" ไม่มีข้อผิดพลาดและแสดงรายการทั้งหมด จากนั้นฉันกรองตามที่ฉันต้องการและตัดสินใจ


อ๊ะ! ทำไมคำตอบของฉันข้ามไปด้านบน ฉันคิดว่าพวกเขาไปตามลำดับเวลาหากพวกเขาไม่มีคะแนน
prometheos

ตามลำดับหากคุณคลิก "เก่าที่สุด" เหนือคำตอบแรก นี่คือการตั้งค่าต่อผู้ใช้และเว็บไซต์ไม่ได้เป็นฟอรั่ม
Kamil Maciorowski

/targetdir/@monthly.8ฉันหวังว่าคุณจะตระหนักถึงมันไม่ได้ทดสอบว่าสำหรับ ฉันคิดว่า subvolume ใด ๆ ที่@monthly.8อยู่ในพา ธ ของมัน (ฉันหมายถึงพา ธ ภายในในระบบไฟล์) จะทริกเกอร์echoแม้ว่า subvolume นี้จะไม่สามารถเข้าถึงได้ในทรีไดเรกทอรีของคุณในขณะนี้ ในทางกลับกันโซลูชันของฉันทดสอบวัตถุที่ปรากฏอย่างชัดเจน/targetdir/@monthly.8ในไดเรกทอรีต้นไม้
Kamil Maciorowski

0
function btrfsCreateSVIfNotExist ()
{
    # parameters: $1 the dest/name of the subvolume (what you'd pass to btrfs subvolume create, e.g. /home/MYSUBVOLNAME)
    # creates a btrfs subvolume under dest/ if it doesn't already exist
    if ! btrfs subvolume show "$1" > /dev/null 2>&1; then
        btrfs subvolume create "$1"
    fi
}
export -f btrfsCreateSVIfNotExist
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.