فایل سیستم Btrfs

Btrfs یا B-tree Filesystem یک فایل سیستم متن باز مبتنی بر مجوز GPL است که توسط شرکت هایی چون لینوکس فاندیشن، فیسبوک، اینتل، فوجیتسو، ردهت، اوراکل، سوزه و … توسعه داده می شود.

این فایل سیستم دیسک‌های با ظرفیت حداکثر ۱۶ اگزابایت و فایل‌های با اندازه حداکثر ۸ اگزابایت را پشتیبانی می‌کند.

برای نامگذاری فایل‌های ایجاد شده روی این فایل سیستم تقریباً می‌توان از هر کاراکتری جز ‘/’ و NULL استفاده نمود.

برخی ‌از ویژگی‌های مهم Btrfs عبارتند از:

  • یکپارچه سازی دیسک (Defragmention) به‌صورت آنلاین
  • تغییر اندازه پارتیشن ها (Volume) به‌صورت آنلاین
  • حدف یا اضافه نمودن دیسک های سخت به‌صورت آنلاین
  • بررسی فایل سیستم (Fsck) به‌صورت آفلاین
  • بررسی فایل‌ها و برطرف نمودن خودکار مشکلات آن‌ها به‌صورت آنلاین (Data Scrubbing)
  • پشتیبانی از RAID0 , RAID1, RAID10
  • پشتیبانی از Subvolume ها
  • فشرده سازی (Transparent Compression)
  • بررسی Checksum روی داده‌ها و Metadata
  • و …

Btrfs در اکثر توزیع‌های معروف به‌صورت پیش‌فرض پشتیبانی می‌شود و برای استفاده از آن فقط می‌بایست ابزارهای مربوط به آن را در توزیع خود نصب کنیم.

  • برای نصب در سیستم‌های مبتنی بر دبیان:
apt install btrfs-tools
  • برای نصب در سیستم‌های مبتنی بر ردهت:
yum install btrfs-progs

یکی از خصوصیات جالب Btrfs این است که شما می‌توانید فایل سیستم را روی یک یا چند دیسک خام و پارتیشن‌بندی‌نشده ایجاد کنید. برای مثال نیازی به استفاده از ابزارهایی همچون fdisk برای پارتیشن بندی نیست.

برای مثال برای ایجاد فایل سیستم Btrfs بر روی سه دیسک sdb, sdc, sdd دستور زیر را وارد می کنیم:

mkfs.btrfs /dev/sdb /dev/sdc /dev/sdd

پس از اجرای دستور فوق خروجی بصورت زیر خواهد بود:

Btrfs v3.17
See http://btrfs.wiki.kernel.org for more information.

Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
adding device /dev/sdc id 2
adding device /dev/sdd id 3
fs created label (null) on /dev/sdb
	nodesize 16384 leafsize 16384 sectorsize 4096 size 24.00GiB
  • نکته) در صورتی که دستور mkfs.btrfs رو بدون هیچ سوییچ و همراه با چند دیسک به‌کار ببریم به‌صورت پیش‌فرض از RAID0 (Stripe)برای ذخیره سازی داده‌ها و از (Mirror) RAID1 برای ذخیره‌سازی Metadata استفاده می‌شود. مزییت این روش در این است که علاوه بر بهبود سرعت خواندن و نوشتن داده‌ها در صورتی که یکی از دیسک‌ها دچار مشکل شود به کمک Metadata می‌توانیم داده‌های از دست رفته را بازسازی کنیم.

اگر مایل هستید که btrfs رو تنها روی یک دیسک ایجاد کنید و یا مایل نیستید که Data و Metadata بصورت RAID ذخیره سازی شود می‌توانید از سوییچ m- بصورت زیر استفاده نمایید:

mkfs.btrfs -m single /dev/sdb

همچنین در صورتی که بخواهید همین کار را با چندین دیسک انجام دهید نیز می‌توانید به‌صورت زیر عمل نمایید:

mkfs.btrfs -m raid0 /dev/sdb /dev/sdc /dev/sdd

که در مثال فوق برای ذخیره‌سازی Metadata از RAID0 (Stripe) بجای RAID1 (گزینه پیشفرض) استفاده می گردد.

همچنین می‌توانیم نحوه ذخیره‌سازی Data و Metadata را به دلخواه خودمان تعریف کنیم. برای مثال:

mkfs.btrfs -m raid0 -d raid1 /dev/sdb /dev/sdc /dev/sdd

که در مثال فوق توسط سوییچ‌های m- و d- نحوه ذخیره‌سازی مشخص گردیده است.

  • نکته) می‌توانیم از RAID10 نیز برای ذخیره‌سازی Data و Metadata استفاده کنیم اما می‌بایست توجه داشته باشید که برای استفاده از RAID10 حداقل به ۴ دیسک نیاز است.

برای مشاهده وضعیت فایل سیستم ایجاد شده دستور زیر را وارد می کنیم:

btrfs filesystem show /dev/sdb
  • نکته) از آنجایی که در مثال فوق برای نشان دادن قابلیت‌های RAID در Btrfs از 3 دیسک استفاده نمودیم بنابراین برای نمایش اطلاعات فایل‌سیستم توسط دستور فوق هیچ فرقی نمی‌کند که نام کدام دیسک را اعلام کنیم چرا که هر 3 دیسک مربوط به یک فایل سیستم و در قالب یک Pool می‌باشد.

که خروجی آن به‌صورت زیر خواهد بود:

Label: none  uuid: f36e0a56-bcea-4637-a1e4-c9788574d84a
	Total devices 3 FS bytes used 112.00KiB
	devid    1 size 8.00GiB used 1.82GiB path /dev/sdb
	devid    2 size 8.00GiB used 827.19MiB path /dev/sdc
	devid    3 size 8.00GiB used 1.81GiB path /dev/sdd

Btrfs v3.17

پس از ایجاد فایل سیستم می‌توانیم به راحتی و توسط دستور زیر انرا Mount نماییم:

mount /dev/sdb /mnt

برای مشاهده فضای مصرفی و فضای باقی‌مانده فایل سیستم دستور زیر را وارد می کنیم:

btrfs filesystem df /mnt

که خروجی آن به‌صورت زیر خواهد بود:

Data, RAID0: total=2.40GiB, used=832.00KiB
Data, single: total=8.00MiB, used=0.00B
System, RAID1: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00B
Metadata, RAID1: total=1.00GiB, used=112.00KiB
Metadata, single: total=8.00MiB, used=0.00B
GlobalReserve, single: total=16.00MiB, used=0.00B

یکی از ویژگی‌های Btrfs قابلیت فشرده‌سازی داده‌ها می‌باشد که موجب می‌شود داده‌ها به‌صورت فشرده‌شده روی دیسک ذخیره شوند که موجب صرفه‌جویی در مصرف فضای دیسک می‌گردد. Btrfs از دو متد فشرده‌سازی zlib و lzo برای فشرده‌سازی استفاده می‌کند.

  • نکته) Btrfs بصورت پیش‌فرض از zlib برای فشرده‌سازی استفاده می کند.

برای فعال نمودن قابلیت فشرده‌سازی کافی است که دیسک مورد نظر را بصورت زیر Mount کنیم:

mount -o compress=lzo /dev/sdb /mnt

یا

mount -o compress=zlib /dev/sdb /mnt

یا

mount -o compress /dev/sdb /mnt

که دستور اول با استفاده از lzo و در دستور دوم با استفاده از zlib اقدام به فشرده‌سازی داده‌ها می کند. در دستور سوم هم از گزینه پیشفرض (zlib) برای فشرده‌سازی استفاده می‌شود.

  • نکته) زمانی که یک دیسک را با قابلیت فشرده‌سازی Mount می‌کنید توجه داشته باشید که تنها داده‌هایی که از آن پس در دیسک ذخیره خواهند شد فشرده می گردند.

از دیگر ویژگی‌های Btrfs امکان تغییر حجم Volume ها به‌صورت آنلاین می باشد. به‌عنوان مثال دستور زیر مقدار 2G از فضای فایل سیستم mnt/ می کاهد.

btrfs filesystem resize -2g /mnt

و دستور زیر مقدار 500M به فضای فایل سیستم mnt/ اضافه می‌کند.

btrfs filesystem resize +500m /mnt

برای اضافه نمودن دیسک جدید به فایل‌سیستم مورد نظرمان به‌صورت زیر عمل می کنیم.

btrfs device add /dev/sde /mnt

سپس دستور زیر را جهت مشاهده وضعیت فایل‌سیستم وارد می کنیم.

btrfs filesystem show /dev/sdb

که خروجی آن به‌صورت زیر خواهد بود.

Label: none  uuid: f36e0a56-bcea-4637-a1e4-c9788574d84a
	Total devices 4 FS bytes used 960.00KiB
	devid    1 size 8.00GiB used 1.82GiB path /dev/sdb
	devid    2 size 8.00GiB used 827.19MiB path /dev/sdc
	devid    3 size 8.00GiB used 1.81GiB path /dev/sdd
	devid    4 size 8.00GiB used 0.00B path /dev/sde

Btrfs v3.17

همان‌طور که مشاهده می‌کنید دیسک sde به فایل‌سیستم اضافه شد با این حال در حال حاضر از فضای آن استفاده نمی‌شود. برای اینکه بتوان از فضای دیسک جدید هم استفاده نمود می‌بایست دستور زیر را وارد کنیم.

btrfs filesystem balance /mnt

که پس از اجرای دستور فوق خروجی به شکل زیر خواهد بود.

Done, had to relocate 6 out of 6 chunks

برای حذف یک دیسک از فایل سیستم دستور زیر را وارد می‌کنیم.

btrfs device delete /dev/sdc /mnt

در صورتی که بخواهیم RAID Level را برای فایل سیستم ایجاد شده تغییر دهیم می‌توانیم به‌صورت زیر عمل کنیم.

btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt

یکی دیگر از قابلیت‌های جالب در btrfs مفهومی به نام Subvolume است. در btrfs می‌توانیم در هر فایل سیستم Subvolume هایی ایجاد کنیم و سپس از این Subvolume ها Snapshot بگیریم و یا آن‌ها را به‌صورت مستقل از فایل سیستم اصلی Mount کنیم.

برای ایجاد یک Subvolume دستور زیر را وارد می کنیم.

btrfs subvolume create /mnt/sv1

در مثال فوق یک Subvolume با نام sv1 در فایل سیستم mnt/ ایجاد گردید.

برای نمایش وضعیت Subvolume ها در فایل سیستم mnt/ دستور زیر را وارد می کنیم.

btrfs subvolume list /mnt

که خروجی آن به‌صورت زیر خواهد بود.

ID 272 gen 136 top level 5 path sv1

همانطور که مشاهده می‌کنید هر Subvolume یک ID منحصر به فرد دارد که به آن Subvolume اشاره می‌کند.

همچنین می‌توانیم یک Subvolume را درون Subvolume دیگری ایجاد کنیم.

btrfs subvolume create /mnt/sv1/sv2

برای Mount نمودن یک Subvolume به‌صورت زیر عمل می کنیم:

ابتدا می‌بایست فایل‌سیستم اصلی را در صورتی که Mount می‌باشد Unmount کنیم.

umount /mnt

و سپس توسط دستور زیر و به وسیله Subvolume ID آن را به‌صورت زیر Mount می کنیم.

mount -o subvolid=272 /dev/sdb /mnt

که در اینجا Subvolume ID مورد نظر ما 266 است. همچنین می‌توانیم به جای استفاده از ID از نام Subvolume استفاده کنیم.

mount -o subvol=sv1 /dev/sdb /mnt
  • نکته)‌ ID مربوط به Volume ریشه همواره 0 است.

برای تغییر Default Volume در زمان Mount می‌توانیم به‌صورت زیر عمل کنیم.

btrfs subvolume set-default 266 /mnt

از این پس هنگام Mount نمودن فایل‌سیستم، به جای Volume ریشه Subvolume مشخص شده به‌صورت پیشفرض Mount می‌گردد.

برای حدف یک Subvolume دستور زیر را وارد می کنیم.

btrfs subvolume delete /mnt/sv1

دستور فوق Subvolume با نام sv1 را حذف می کند.

یکی دیگر از امکانات مفید btrfs امکان تهیه Snapshot از Subvolume ها به‌صورت آنلاین است. توسط Snapshot ها می‌توانیم از Data های ذخیره شده در Subvolume ها کپی پشتیبان تهیه کنیم تا در مواقع لزوم Data ها را به حالت اولیه بازگردانیم.

برای تهیه Snapshot دستور زیر را وارد می‌کنیم.

btrfs subvolume snapshot /mnt/sv1 /mnt/sv1_snapshot

توسط دستور فوق یک Snapshot با نام sv1_snapshot از sv1 تهیه شد.

سپس می‌توانیم این Snapshot را در مواقع لزوم مستقیماً Mount کنیم و از اطلاعات ذخیره شده استفاده کنیم.

mount -o subvol=sv1_snapshot /dev/sdb /mnt

برای یکپارچه‌سازی (Defragment) فایل سیستم دستور زیر را وارد می کنیم.

btrfs filesystem defrag /mnt

همچنین می توانیم توسط دستور زیر فایل‌سیستم را با قابلیت یکپارچه‌سازی خودکار Mount کنیم.

mount -o autodefrag /dev/sdb /mnt