শেলের মধ্যে সমস্ত বিটিআরএফএস ফাইল সিস্টেম এবং সাবভলিউম তালিকাভুক্ত করুন


11

সি, বা পোসিক্স শেল ছাড়া কোনও বিটিআরএফএস ফাইল-সিস্টেম সাবভলিউমের তথ্য পাওয়ার কোনও সুবিধাজনক উপায় কি নেই ?

/sys/fs/btrfsকেবল ফাইল সিস্টেমে তথ্য রয়েছে, সাবভলিউমগুলিতে কিছুই নেই, সুতরাং বর্তমানে আমি একটি অস্থায়ী ফোল্ডারে সমস্ত ফাইল সিস্টেমগুলি মাউন্ট করে শেষ করি, সেগুলি দিয়ে স্ক্যান করে btrfs subvol listতারপরে ফলাফলটি আউটপুট বিশ্লেষণ করি। বলা বাহুল্য, এটি মোটামুটি কুৎসিত।

এটি একটি 3.16.x কার্নেল এবং বিটিআরএফএস-প্রগস v3.14.1 সহ (স্টক উবুন্টু 14.10 থেকে)।

নীচে আমি বর্তমানে ব্যবহার করছি (কুরুচিপূর্ণ) স্ক্রিপ্ট। আমি জানি যে খাঁটি সি ব্যবহারের জন্য আমার প্রয়োজনীয় তথ্যটি আমি পেয়েছি এবং সম্ভবত এটিই শেষ করব, তবে আমি ভাবছিলাম যে আরও সহজ, আরও মার্জিত উপায় আছে কিনা।

#!/bin/bash

for i in /sys/fs/btrfs/*[!features]; do 

  device="/dev/$(basename $i/devices/*)"
  mountpoint=/var/lib/btrfs/tmp/mnt/$(basename "$i")

  [ -d "$mountpoint" ] || mkdir "$mountpoint"

  grep -qs $mountpoint /proc/mounts
  [ $? -ne 0 ] && mount -v "$device" "$mountpoint"

  while read -r subvol; do
    # whatever you want
  done < <(btrfs subvolume list "$mountpoint")

  umount $mountpoint
  rmdir $mountpoint
done

আপনি কি এর জন্য কোনও সি প্রোগ্রাম লিখেছেন? আমি নিশ্চিত আপনি যদি ভাগ করতে ইচ্ছুক হন তবে অন্যান্য লোকেরা এটি দরকারী বলে মনে করবে।
etskinner

উত্তর:


2

/sys/fs/btrfsডিবিয়ান / উবুন্টুতে পরীক্ষিত (4.14.0-1 / 4.10.0-42) সমস্ত বিটিআরএফএস ফাইল সিস্টেমের তালিকা তৈরি করে না (যেমন মাউন্ট করা হয়নি)।
আমি তাদের সন্ধানে বিটিআরএফএস প্রগ ব্যবহার করব:

btrfs filesystem show | awk '/ path /{print $NF}'

এবং যেহেতু বিটিআরএফএস প্রগস কেবল মাউন্ট করা fs এর সাবভলিউমগুলি তালিকাভুক্ত করতে পারে, তাই আপনার স্ক্রিপ্টটি আমি যা ব্যবহার করব তা থেকে দূরে নয়:

#!/bin/bash

readarray -t btdev < <(sudo btrfs filesystem show | awk '/ path /{print $NF}' )

for i in "${btdev[@]}"; do 

  device="${i}"
  mountpoint=/var/lib/btrfs/tmp/mnt/$(basename "$i")

  [ -d "$mountpoint" ] || mkdir "$mountpoint"

  grep -qs $mountpoint /proc/mounts
  [ $? -ne 0 ] && mount -v "$device" "$mountpoint"

  while read -r subvol; do
    # whatever you want
  done < <(btrfs subvolume list "$mountpoint")

  umount $mountpoint
  rmdir $mountpoint
done

মাল্টি-ডিভাইস ফাইল সিস্টেমের বিরুদ্ধে পরীক্ষা করা হয়নি (রেড -0 / 1/10/5/6)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.