تا جایی که میدونم، btrfs snapshot فقط از subvolume که مشخص کردید snapshot میگیره.
میشه دستورشو قرار بدید.
با خود دستور btrfs اینکار ممکنه. نحوه استفاده به این شکله:
btrfs subvolume snapshot /path/to/subvolume /path/to/snapshot
/path/to/subvolume/ میشه جایی که subvolume مورد نظر سوار شده.
/path/to/snapshot/ میشه جایی که میخواهید snapshot ذخیره بشه.
هر دو باید روی یه فایلسیستم btrfs یکسان قرار داشته باشند.
مثلا اگه میخواهید از subvolume که روی / سوار شده یه snapahot داخل /snapshots./ با اسم snap1 ایجاد کنید، دستور این شکلی میشه:
btrfs subvolume snapshot / /.snapshots/snap1
مشخصه که لازمه که دستور بالا با دسترسی روت اجرا بشه.
دستور بالا یه snapshot که خواندنی و نوشتنی هست ایجاد میکنه. اگه میخواهید فقط خواندنی باشه، آپشن r- رو به زیردستور snapshot بدید. مثلا اینجوری:
btrfs subvolume snapshot -r / /.snapshots/snap1
پس نمیپرسم چجوری و با چه دستوری چون اونجور که شما گفتید بهتره اول بریم سراغ btrfs ! هرچند خودم دلم میخواد یه راست برم سراغ zfs ، زحمتش هم برای شما کمتره ( شاید )
با دستور zpool باید اینکار رو انجام بدید. مثلا این رو ببینید:
zpool create -o ashift=12 -O compression=lz4\
-O dnodesize=auto -O normalization=formD -R /mnt\
poolname /dev/sda5
zfs جنبههای متفاوت زیادی داره و میشه اونها رو تنظیم کرد. بعضی از اونها رو فقط میشه موقع ساختن pool تنظیم کرد و بعد از اون نمیشه تغییرشون داد.
چه خوب ! دقیقا یکی از آپشن های خوب nix و guix ، اینو حتما میخوام !
البته با اون چیزی که توی nix و guix هست فرق داره. توی nix و guix در سطح فایل و با لینک کردن انجام میشه. توی zfs اینها در سطح خود فایلسیستم انجام میشه.
بعد یه سوال ؟ اون فایل snapshot چقد جا میگیره ؟ قشنگ به اندازه خود dataset مدنظر ؟
اول که snapshot ایجاد میکنید، فضای خاصی نمیگیره، فقط اونقدری که روی دیسک نوشته بشه یه snapshot از چه چیزی گرفته شده. به همراه یه سری metadata مربوط به اون snapshot که فکر نکنم روی هم به 500KiB برسه.
وقتی شروع به تغییر اطلاعات میکنید، حجم اون snapshot بیشتر میشه.
فقط اطلاعاتی که تغییر میدید یا جدید مینویسید جای بیشتر اشغال میکنند. اطلاعات یکسان بین dataset و snapshot و clone جای مشترکی میگیرن. برای هر کدوم فضای اضافه مصرف نمیشه.
خب این خوبه ولی آیا وقتی بخواد میتونه به یه چیز دیگه اختصاص داده بشه اون رم اشغال شده ؟ اگه میشه که خب اصلا محدودیت نمیخواد بزارم براش !
zfs به راحتی اون فضای گرفته رو پس نمیده. فقط برای cache های خودش ازش استفاده میکنه. البته یه دستور همراه zfsutils-linux هست تا وضعیت arc رو مشاهده و کنترل کنید. با این دستور میشه arc رو خالی کرد. ولی قسمتی از arc رو خالی نمیکنه. اون رو میشه با نوشتن یه چیزی روی یکی از فایلهای داخل /proc/ یا /sys/ خالی کرد. درست یادم نیست مسیر فایل چی بود و باید چی مینوشتید.
برای کامپیوترهای معمولی، محدودیت 512MiB برای arc باید کافی باشه. مگه اینکه وضعیت خاصی داشته باشید.
فکر کنم خود کرنل قابلیتی شبیه همین به اسم bcache داره.
کدوم بهتر و سریع تره ؟ مال کرنل یا zfs ؟
نمیدونم. فکر نکنم اصلا بتونید از bcache به جای arc استفاده کنید. ولی مطمئن نیستم.
خب ۳ تا dataset میسازم ، یکی بوت بدون اون قابلیت هایی که گراب پشتیبانی نمیکنه ، و یکی روت و دیگری هم همونی که به فایل هام میدم : )
اینجوری نمیشه. این قابلیتها فقط میتونند روی کل pool فعال و غیرفعال بشن. نمیشه برای هر dataset جداگانه تنظیم کرد.
وقتی قابلیتها برای یه pool فعال و مورد استفاده قرار میگیرن، دیگه نمیشه اونها رو غیرفعال کرد.
بعضی قابلیتها وقتی فعال میشن، میشه اونها رو غیرفعال کرد، تا وقتی که مورد استفاده قرار نگرفتن. اگه مورد استفاده قرار بگیرن، دیگه نمیشه غیرفعالشون کرد.
بعضی قابلیتها رو همون وقتی فعال میکنید دیگه ممکن نیست غیرفعالشون کرد.
به نظرم بهترین گزینه برای روت روی zfs، استفاده از ZFSBootMenu هست.
چشم ، امتحانش ضرری نداره ، هر موقع بخوای میشه غیر فعال کنی فشرده سازی رو دیگه ؟
میتونید هر وقت بخواهید اون رو خاموش کنید یا تغییر بدید. البته اطلاعات قبلی فشرده باقی میمونند. میتونید با یه zfs send و zfs receive فشردهسازی اونها رو درست کنید.
( پس اگه صلاح میدونید btrfs و یا zfs ( 😍️ ) رو توضیح بدید چیکار و کنم چه گام هایی رو پیش برم ، چون من آمادم : )
اول بسته btrfs-progs رو نصب کنید. معمولا این بسته به طور پیشفرض توی دبیان نصب نیست.
بعد یه جایی رو با btrfs فرمت کنید.
یا اینکه کرنل و initramfs رو جایی قرار بدید که گراب میتونه بخون
منظورم این بوده که روی یه فایلسیستم دیگه که گراب میتونه اون رو بخونه قرار بدید.