برای نمونه من یه دیسک خالی gpt دارم بدون افراز ، میخوام از zfs استفاده کنم : )
شاید بهتر باشه قبل از اینکه از zfs استفاده کنید، یکم با btrfs کار کنید تا با zfs زیاد به مشکل نخورید. (چون نحوه کار با اون با چیزی مثل ext4 یا xfs متفاوته)
پس یه دبیان زنده ( گنومشو دارم ) بالا بیارم و بسته های zfs-dkms و zfsutils-linux رو نصب کنم ، بعد چیکار کنم ؟ درست نفهمیدم بقیشو 😅
بعد باید یه استخر (pool) zfs بسازید. بعد میتونید داخل اون pool یه سری dataset بسازید. میتونید داخل هر dataset هم یه سری dataset دیگه بسازید. محدودیت پیشفرض ۵۰ تا dataset زیر هم هست.
میتونید مستقیم توی pool هم چیز بنویسید چون خود pool هم یه dataset به حساب میاد. ولی معمولا برای انعطاف پذیری بیشتر بهتره که dataset بسازید.
میتونید برای هر dataset محل سوار شدن اون، اینکه خودکار سوار بشه یا نه، فشردهسازی، رمزنگاری و ... رو مشخص کنید.
میتونید dataset رو از نوع volume با یه حجم مشخص بسازید. در این حالت به اون dataset گفته میشه zvol.
در این حالت اون dataset در قالب یه block device توی /dev/zvol/ ظاهر میشه و میتونید اون رو با یه فایلسیستم مثل ext4 یا هر چیز دیگهای فرمت کنید.
همچنان میتونید رمزنگاری، فشردهسازی و خیلی چیزهای دیگه رو روی اون zvol تنظیم کنید.
برای zvolها نمیشه چیزهایی مثل محل سوار شدن یا اینجور چیزها تنظیم کرد چون اینکار اصلا معنی خاصی نداره.
۱ . اینجوری هر موقع خواستم میتونم یه بخش جدید تعریف کنم برای بررسی یه توزیع مثلا و پس از پایان کارم ، پاکش کنم و اون بخش رو حذف ؟ منظورم اینه فقط همون اول میشه بخش تعریف کرد یا هر زمانی ممکنه زنده زنده ؟
توی btrfs هر وقت بخواهید میتونید یه subvolume بسازید و هر وقت خواستید، پاکش کنید. از یه نسخه کرنل و coreutils به بعد اینکار با دستور rm هم ممکن شده.
توی zfs هم همینطوره. البته نمیتونید dataset ها رو با دستور rm پاک کنید. به zfs destroy نیاز هست.
۲ . میتونم یکی از بخش ها رو با luks2 رمز کنم ؟
zfs خودش قابلیت رمزنگاری داره و میتونید هر dataset رو جدا رمزنگاری کنید. میتونید تعدادی از اونها رو همراه هم رمزنگاری کنید.
میتونید pool رو هم رمزنگاری کنید تا همه dataset ها رمزنگاری بشن.
حتی وقتی که کل pool رمزنگاری شده، میتونید dataset بدون رمزنگاری بسازید. میتونید dataset با کلید رمزنگاری متفاوت از کلید رمزنگاری pool بسازید.
میتونید zvol بسازید و اون zvol رو با luks رمزنگاری کنید.
میتونید هم zfs رو کلا روی luks قرار بدید.
فعلا رمزنگاری خود zfs فقط میتونه یه کلید داشته باشه.
zfs فعلا نمیتونه یه dataset یا pool که رمزنگاری نشده است رو رمزنگاری کنه. رمزنگاری رو باید موقع ساختن pool یا dataset مشخص کنید.
zfs نمیتونه کلید اصلی رمزنگاری یه dataset رو تعویض و اطلاعات رو مجدد رمزنگاری کنه. کاربر باید اطلاعات رو بفرسته روی یه dataset دیگه که رمزنگاری شده. luks چنین قابلیتی داره.
سرعت رمزنگاری luks از zfs خیلی بیشتره.
توی btrfs فقط میتونید کل فایلسیستم رو روی luks قرار بدید. البته
یه وصله هست که رمزنگاری رو به خود btrfs اضافه کنه ولی هنوز به btrfs اضافه نشده.
۳ . میگین این فایل سیستم ها پیشرفتن و کلی امکانات دارن ، به جز همین قابلیت خاص جداسازی با حافظه مشترک ، چه اپشن های منحصر به فردی دارن ؟ مثلا یه فایل سیستم چه امکانات ویژه ای میتونه داشته باشه ؟
snapahot (بالاتر بهش گفتند "عکس فوری" ولی فکر کنم ترجمه بهتری برای اون باشه)هم دارند که بالا معرفی کردند. یعنی میتونید یه نقطه بازگشت از وضعیت فعلی ایجاد کنید و هر موقع نیاز شد، به اون وضعیت برگردید.
قابلیت deduplicat هم میتونند داشته باشند. اینجوری که اگه اطلاعات یکسان چند جا نوشته شده باشه، فقط یه بار نوشته بشه و برای بقیه جاها به اون لینک بشه. ولی قابلیت خیلی سنگین بود، رم زیادی میخواست و پردازنده رو درگیر میکرد که در نهایت توی zfs منسوخ شد.
نسخههای جدید zfs نمیذارند یه pool با deduplication بسازید. بدی deduplication این بود که وقتی روی یه pool فعال میشد، دیگه نمیشد غیرفعالش کرد.
دلیل سنگین بودنش این بود که در سطح block کار میکرد، یعنی بلوک به بلوک اطلاعات رو دنبال اطلاعات یکسان میگشت و یه جدول بزرگ هم داخل رم میساخت تا حساب این لینکها رو نگهداری کنه.
اگه در سطح فایل کار میکرد، سبکتر میبود. به خاطر همین یه deduplication جدید در سطح فایل برای zfs در حال توسعه است.
فشردهسازی هم هست ولی فقط مربوط به فایلسیستمهای cow نیست. بقیه فایلسیستمها هم ممکنه فشردهسازی داشته باشند. برای مثال squashfs فشردهسازی داره در حالی که cow نیست.
یه قابلیتی که zfs داره arc هست. arc دادههایی که خونده میشن رو توی رم cache میکنه تا دفعه بعدی که اونها رو میخونید، خوندن خیلی سریع انجام بشه.
معمولا برای اینکه قسمت قابل توجهی از رم پر بشه، لازمه خوندن زیادی صورت بگیره.
اگه نگران هستید که مقدار زیادی از رم توسط zfs استفاده بشه، میتونید پارامتر zfs_arc_max از ماژول zfs رو تنظیم کنید که حداکثر چقدر از رم برای arc استفاده بشه. واحد اون بر اساس بایت هست.
مثلا zfs_arc_max=268435456 باعث میشه که arc به ۲۵۶MiB محدود بشه.
فکر کنم خود کرنل قابلیتی شبیه همین به اسم bcache داره.
zfs چندین قابلیت دیگه مثل l2arc یا zil و slog هم داره ولی به کار شما نمیاد چون به چندین حافظه ذخیرهسازی نیاز داره.
یه نکتهای که موقع استفاده از zfs باید در نظر داشته باشید این هست که گراب از بعضی از قابلیتهای zfs پشتیبانی نمیکنه.
به همین دلیل اگه میخواهید روت روی zfs باشه، یا باید موقع ساختن pool، قابلیتهایی که گراب پشتیبانی نمیکنه رو غیرفعال کنید. یا اینکه کرنل و initramfs رو جایی قرار بدید که گراب میتونه بخونه. (برای مثال یه pool دیگه یا یه پارتیشن دیگه)
گزینه بعدی این هست که از
ZFSBootMenu استفاده کنید.
اگه قراره به هر دلیلی حالت lockdown توی کرنل فعال بشه (مثلا به خاطر secure boot)، باید ماژولهای کامپایل شده رو امضا کنید و کلید عمومی اون رو هم به کرنل بدید تا کرنل ماژولهای zfs رو بارگذاری کنه.
این بحثش طولانیه و بهتره تا وقتی لازم نیست یا نمیخواهید، سمتش نرید.
بارگذاری ماژولهایی که همراه کرنل نیست، باعث میشه که کرنل taint بشه (تباه معنیش کنیم؟) و توی dmesg با سطح اخطار (warning) چیزی شبیه این بنویسه:
loading out tree module taints kernel
با فشرده سازی فشار بیشتره به پردازنده میاد ، پردازنده منم که نفتیه ، پس این موردو نمیخوام ، روی همون دیسک باشه فشارش باز بهتره : )
شاید اگه zstd با فشردهسازی کم استفاده کنید به نتیجه خوبی برسید، مطمئن نیستم. میتونید امتحان کنید.
copy on write یه قابلیتیه که وقتی فعال باشه
...
درست میگید ولی قضیه پیچیدهتره.
فکر کنم COW توی zfs نباشه.
cow نیست، بلکه copy on reflink هست. copy on reflink و cow خیلی شبیه هم هستند ولی تفاوت دارند. به خاطر همین خیلی جاها zfs رو cow حساب میکنند.
عکس فوری هم قابلیتیه که برای پشتیبان گیری استفاده میشه و میتونی از یک دایرکتوری پشتیبان بگیری در دو نوع قابل تغییر و ثابت.
تو نوع ثابت دیگه نمیتونی اون پشتیبان رو تغییر بدی، ولی توی قابل تغییر میتونی چیز های جدید توی فایل عکس فوری بنویسی.
این که میگید مربوط بهsnapshot توی btrfs هست.
میشه از یه block device هم snapshot تهیه کرد.
snapshot ها توی zfs فقط خواندنی هستند. اگه میخواهید روی اونها بنویسید، باید با zfs clone یه نسخه خواندنی نوشتنی از snapshot مورد نظر ایجاد کنید. clone ایجاد شده به خودی خود جایی نمیگیره. فقط چیزهایی که عوض بشن جا میگیرن.
راستی چجوری باید توی btrfs از یه subvolume عکس فوری بگیریم بدون اینکه از subvolume های دیگه عکس فوری گرفته شه؟
تا جایی که میدونم، btrfs snapshot فقط از subvolume که مشخص کردید snapshot میگیره.
مثلا یه عکسو برداریم کپی کنیم کنار خودش ، به اندازه یه عکس فضا میگیره بازم ولی اگه با یه ویرایشگر بازش کنیم و یه خط بکشیم روش ، به اندازه همون پیکسل هایی که روشون چیزی کشیده شده ، فضای دیسک اشغال میشه ؟ مثال زدم واسه اینکه درک کنم ، ولی مثال درستی نیست ، توضیح میدی بیشتر ؟
این که میگید ممکن هست ولی در واقعیت شبیه همون deduplication در سطح block هست که توی zfs منسوخ شد.