انجمنهای فارسی اوبونتو
کمک و پشتیبانی => انجمن عمومی => نویسنده: آرگون در 17 خرداد 1401، 10:16 قظ
-
سلام
اگه من پارتیشن dev/sda2/ رو با luks1 رمزگذاری کرده باشم و اون ظرف رمزنگاری شده در dev/mapper/awem/ در دسترس باشه،
و من اون ظرف رو با دستور زیر با btrfs فرمت کنم.
mkfs.btrfs -L argonpc /dev/mapper/awem
و subvolume ها رو بصورت زیر بسازم.
@ mountpoint=/
@home mountpoint=/home
@boot mountpoint=/boot
@var mountpoint=/var
@snapshots mountpoint=/.snapshots
@usr mountpoint=/usr
@tmp mountpoint=/tmp
@sbin mountpoint=/sbin
@opt mountpoint=/opt
@media mountpoint=/media
@lib mountpoint=/lib
@etc mountpoint=/etc
@dev mountpoint=/dev
@bin mountpoint=/bin
@test mountpoint=/test
@projects mountpoint=/projects
سوال اول :
مثلا اگه وقتی بخوام یه عکس فوری از ریشه بگیرم از کل subvolume ها عکس فوری گرفته میشه یا فقط subvolume ریشه و دایرکتوری هایی که درونشن؟
سوال دوم :
اگه مثلا من یه عکس فوری از ریشه گرفتم و بعد از اون ریشه خراب شد.
چجوری باید عکس فوری رو برگردونم؟
سوال سوم :
و اینکه اگه بخوام مجدد یه سیستم عامل روی این subvolume ها نصب کنم و همه رو حذف کنم و دوباره بسازم و فقط خانه رو سالم نگه دارم بعد نصب یه سیستم عامل دیگه اون چجوری رمزی که روی پارتیشن ها گذاشتم رو میفهمه؟ خود cryptsetup که رو اون توزیع نصب شده میفهمه که رمزنگاری شده یا نه؟
-
۱- فقط از subvolume ریشه snapshot گرفته میشه.
۲- تا جایی که یادمه باید کامپیوتر رو راهاندازی مجدد کنید و توی خط فرمان کرنل، پارامتر root رو به subvolume درست تغییر بدید.
برای آرچ لینوکس بسته grub-btrfs هست که snapshot ها رو به منوی گراب اضافه میکنه.
snapper هم هست که کار مربوط به snapshot گیری خودکار رو انجام بده.
توی آرچ لینوکس بسته snap-pac هم هست که قبل از هر بروزرسانی با pacman، یه snapshot از روت ایجاد میکنه.
snap-pac-grub توی aur وجود داره که بعد از اینکه snap-pac کار رو انجام داد، منوی گراب رو آپدیت کنه. به هر دو بسته snap-pac و grub-btrfs وابسته هست.
توی دبیان هم چیزهایی شبیه اینها بود، اسمشون رو یادم نیست.
۳- به نظر میاد درست نمیدونید که luks چجوری کار میکنه.
luks یه کلید لازم داره تا اطلاعات رو باهاش رمزنگاری کنه. وقتی که یه جایی رو به luks فرمت میکنید، یه کلید اصلی به طور تصادفی ساخته میشه که همه اطلاعات با اون رمزنگاری و رمزگشایی میشن. این کلید تغییر نمیکنه، مگه اینکه از luks بخواهید یه کلید اصلی دیگه بسازه و اطلاعات رو دوباره با اون کلید جدید رمزنگاری کنه.
این کلید اصلی مستقیم در اختیار کاربر قرار نمیگیره. وقتی که برای luks یه کلید (مثلا رمز عبور یا یه key file) تعیین میکنید، اون کلید به عنوان کلید اصلی استفاده نمیشه.
نحوه کار اینجوریه که کلید اصلی، توسط کلیدی که وارد میکنید رمزنگاری، و روی header های luks ذخیره میشه.
وقتی کلید رو میدید، اول کلید اصلی با استفاده از کلیدی که دادید رمزگشایی میشه و بعد با اون کلید اصلی، اطلاعات واقعی رمزنگاری و رمزگشایی میشن.
خوبی این روش اینه که میتونید چندین کلید داشته باشید. برای هر کلیدی که شما میسازید، اون کلید اصلی با همون کلید موردنظر، رمزنگاری میشه و روی header های luks قرار میگیره. تا جایی که یادمه luks2 میتونه حداکثر ۸ تا کلید متفاوت داشته باشه. مطمئن نیستم.
اون کلیدی که شما انتخاب میکنید میتونه یه رمز عبور باشه. البته قبل از اینکه مستقیم استفاده بشه، طی یه سری مراحلی پیچیدگی اون افزایش پیدا میکنه تا نشه راحت بدستش آورد.
کلید ممکنه یه فایل هم باشه. در این حالت، کلید اصلی با استفاده از یه فایل رمزنگاری میشه و اگه اون فایل رو داشته باشید، میتونید جایی که رمزنگاری شده هست رو باز کنید.
با توجه به اینها، شما یا رمز دارید یا key file. وقتی هم یه توزیع دیگه نصب میکنید، باید حداقل یکی از این ۸ تا کلید رو داشته باشید تا بتونید جایی که رمزنگاری شده هست رو باز و اون subvolume های فایلسیستم btrfs رو سوار کنید.
به غیر از چیزهای بالا، چرا /usr/ یا /lib/ یا خیلی چیزهای دیگه مثل /bin/ یا /sbin رو جدا کردید و هر کدوم رو گذاشتید روی یه subvume مجزا؟
مدتیه توی اکثر توزیعها، دایرکتوریهای /lib/ /sbin/ /bin/ /lib64/ /lib32/ /libx32/ یه لینک به دایرکتوری متناظر توی /usr/ هستند. مثلا /lib/ یه لینک به usr/lib هست.
پس به همین دلیل لازم نیست /sbin/ /bin/ و /lib/ رو جدا کنید. فکر کنم اصلا نباید در این حالت اونها رو جدا کنید.
روی /dev/ هم یه فایلسیستممجازی devtmpfs سوار میشه و لازم نیست جداش کنید. از اونجایی که /dev/ توی مراحل اولیه بوت، توسط initramfs سوار میشه، فکر کنم تخصیص دادن یه subvolume به /dev/ باعث مشکل میشه.
به این دلیل که اون subvolume توی مراحل پایانی بوت سوار میشه و با این سوار شدن، محتوای قبلی /dev/ پوشیده میشه و اونها غیر قابل دسترس میشن. وقتی هم این اتفاق بیوفته، خیلی از برنامهها نمیتونند کار کنند..
/media/ هم لازم نیست جدا باشه. بعضی ابزارها مثل udisk چیزها رو روی یه سری زیردایرکتوری توی /media/ سوار میکنند. در اصل /media/ یه جایی هست تا سوار کردنهای موقت روی اون انجام بشه.
اینکه /tmp/ رو جدا کنید، مشکلی نداره. بعضی جاها هم پیشنهاد میشه که /tmp/ رو جدا کنید تا بتونید برای اون quota در نظر بگیرید تا یه کسی نتونه اون رو کامل پر کنه و برای سیستم مشکل ایجاد کنه.
/etc/ رو چرا جدا کردید؟ /etc/ رو هم بذارید جز / باقی بمونه.
/usr/ رو هم لازم نیست جدا کنید. توی اکثر توزیعها، تقریبا همه چیزهای سیستمعامل داخل /usr/ قرار داره (به غیر از خود کرنل و پیکربندیهای داخل /etc/) این چیزهایی که داخل /usr/ قرار دارند، باید با چیزهای داخل /etc/ هماهنگ باشند.
اینکه هر کدوم توی subvolume جدا باشند باعث میشه موقعی که یه snapshot از روت گرفتید و بعد وضعیت رو به اون snapshot برگردوندید، چیزهای داخل /usr/ و /etc/ با هم هماهنگ نباشند و مشکل ایجاد بشه.
یه راه حل اینه که یه سازوکاری ایجاد کنید که این snapshotها رو به درستی مدیریت کنه. خود این سازوکار باعث افزایش پیچیدگی میشه. گزینه بهتر اینه که اصلا /usr/ رو از / جدا نکنید تا به این سازوکار هم نیاز نشه.
به همون دلایل بالا، /var/ رو هم جدا نکنید. مدیربسته معمولا یه پایگاه داده از بستهها، فایلهاشون و وضعیت اونها داخل /var/lib/ نگهداری میکنه. اینکه پایگاه داده مدیربسته با وضعیت فعلی سیستم هماهنگ نباشه، میتونه به شدت مشکل درست کنه.
اگه دایرکتوریهای مجزا توی /var/lib/ رو بر اساس نیاز جدا کنید، بهتره. مثلا من خودم /var/lib/libvirt/ و /var/lib/docker/ که به ترتیب مربوط به libvirt و docker هستند رو جدا کردم تا اطلاعات مربوط به اونها موقع برگردوندن یه snapshot از روت، به حالت قبل برنگرده.
/boot/ رو هم معمولا لازم نیست جدا کنید. دلیل خاصی برای اینکار دارید؟ اگه دلیل خاصی ندارید، بهتره بذارید جز همون / باقی بمونه.
/opt/ معمولا برای برنامههایی استفاده میشه که از خارج از مخازن نصب شدند. شاید بخواهید /opt/ جزیی از / باشه، شاید هم بخواهید جدا باشه. بستگی به شرایط خودتون انتخاب کنید. اگه من باشم، /opt/ رو از / جدا نمیکنم.
گزارشهای (لاگها) سرویسها، کرنل و اینجور چیزها معمولا توی /var/log/ ذخیره میشه. بهتره که /var/log/ رو اگه میخواهید جدا کنید. اینجوری نوقع برگردوندن یه snapshot، گزارشهای جدید از دست نمیرن.
/var/tmp/ هم که مثل /tmp/ میمونه هم میشه جدا کرد تا بتونید برای اون quota تعیین کنید.
اگه هوم روت (root) رو هم جدا کنید بد نیست. انتخابش با خودتون هست.
میتونید از یه tmpfs برای /var/tmp/ و /tmp/ استفاده کنید تا سرعت خوندن و نوشتن فایلهای موقتی بیشتر بشه، به قیمت اینکه اون فایلهای موقتی روی رم ذخیره بشن و رم رو اشغال کنند. (اگه رم کمی دارید، گزینه مناسبی نیست)
با توجه به این چیزها، این subvolume ها حتما رو بسازید.
@ mountpoint=/
@home mountpoint=/home
@snapshots mountpoint=/.snapshots
subvolume با اسم @ برای روت استفاده میشه به طوری که /usr/ و /boot/ و /var/ جزیی از اون باقی میمونند.
subvolume با اسم home@ هم برای /home/ استفاده میشه. میتونید برای هوم هر کاربر هم subvolume جدا بسازید.
لازم نیست اسم subvolume ها حتما با علامت @ شروع بشه. هر چیزی میتونه باشه. (البته به غیر از کاراکتر NULL و /)
مثلا میتونید اسم subvolume روت رو بذارید rootfs یا هر چی که میخواهید، فقط یه اسمه که باید همه جا از اون استفاده کنید.
برای subvolume هوم هم همینطور؛ مثلا اسمش رو بذارید homedir به جای home@.
اگه من باشم، این subvolume ها رو هم میسازم:
@tmp mountpoint=/tmp
@home-root mountpoint=/root
@var-tmp mountpoint=/var/tmp
@var-log mountpoint=/var/log
اگه میخواهید همزمان چنتا توزیع نصب کنید، بهتره هر کدوم یه subvolume جدا برای /var/log/ داشته باشند تا گزارشهای اونها با هم به تداخل نخوره.
مثلا debian-var-log@ برای دبیان و manjaro-var-log@ برای مانجارو.
چیزهای دیگهای هم هستند که قابلیتهایی شبیه btrfs دارند. برای مثال lvm، ولی قابلیتهاش کمی کمتر از btrfs هست. هرچند به دلیل اینکه مدت زیادی استفاده شده، پایداری خیلی خوبی داره.
فایلسیستم bcachefs هم هست ولی هنوز قابلیتهای مهم اون پایدار نشده و ماژولهای مربوط بهش هم همراه کرنل نیست. باید خودتون جدا ماژولهاش رو از کد منبع کامپایل کنید.
فایلسیستم zfs هم هست که از نظر من از همه گزینهها بهتره. قابلیتهای بیشتری نسبت به btrfs داره و اکثر ویژگیهای اون هم پایداره.
خود فایلسیستم به صورت داخلی از رمزنگاری پشتیبانی میکنه، بدون نیاز به luks؛ البته یه قابلیت مربوط به این رمزنگاری مشکل داره. ولی این مشکل فقط توی بعضی شرایط خاص روی میده.
مشکل دیگه اون اینه که که با مجوز cddl منتشر میشه. این مجوز با مجوز gpl2 که اکثر کد کرنل لینوکس تحت این مجوز منتشر میشه ناسازگاره و به خاطر همین zfs همراه کرنل لینوکس نیست و باید جدا کامپایل بشه.
اما توی اکثر توزیعها در قالب یه بسته موجوده که dkms اون رو کامپایل نصب و مدیریت کنه. به همین دلیل نصبش کار سختی نیست. اوبونتو اون رو به صورت کامپایل شده همراه کرنلش قرار داده.
مورد بعدی اینه که بیشتر توسعه پروژه zfs on linux توسط سازمان llnl، زیرمجموعهای از وزارت انرژی آمریکا انجام میشه. اکثر تحقیقات این وزارت در حوزه فیزیک هستهای و جنگافزارهای هستهای هست. (فردا از گونی سردر میارم ;D)
-
عالی بود 👌 سپاس
تاپیک های منم که فک کنم رفتن اخر لیست اولویت ها 🥲
-
واقعا ممنونم. خیلی چیزا یاد گرفتم. :D
-
سلام
یه سوال دیگه هم داشتم.
مثلا میشه subvolume های زیر رو ساخت
@manjaro
@debian
@home
و مانجارو رو روی @manjaro و دبیان رو روی @debian و برای خانه هم از @home به صورت مشترک استفاده کرد؟
و اینکه من قابلیت فشرده سازی zstd و قابلیت cow فایل سیستم btrfs رو نیاز دارم آیا استفاده از اینا ناپایداری ایجاد میکنه؟
سوال بعدی :
میتونید از یه tmpfs برای /var/tmp/ و /tmp/ استفاده کنید تا سرعت خوندن و نوشتن فایلهای موقتی بیشتر بشه، به قیمت اینکه اون فایلهای موقتی روی رم ذخیره بشن و رم رو اشغال کنند. (اگه رم کمی دارید، گزینه مناسبی نیست)
رم ۱۶ گیگابایت فکر نکنم کم باشه.
میشه توضیح بدید چجوری باید برای /var/tmp/ و /tmp/ از tmpfs استفاده کنم؟
و اصلا این tmpfs چی هست؟ فایل سیستم مجازیه؟
/var/tmp/ هم که مثل /tmp/ میمونه هم میشه جدا کرد تا بتونید برای اون quota تعیین کنید.
چجوری براشون quota تعیین کنم؟
سوال بعدی بعدی :
اگه دایرکتوری های زیر رو جدا کنم مشکلی پیش نمیاد؟
/var/cache/
/var/log/
/var/tmp/
-
سلام
یه سوال دیگه هم داشتم.
مثلا میشه subvolume های زیر رو ساخت
@manjaro
@debian
@home
و مانجارو رو روی @manjaro و دبیان رو روی @debian و برای خانه هم از @home به صورت مشترک استفاده کرد؟
بله میشه.
اگه دبیان پایدار نصب کنید، به احتمال خیلی زیاد نسخه برنامههای اون با نسخه برنامههای مانجارو متفاوته. ممکنه نسخههای متفاوت یه برنامه، از پیکربندیهای متفاوتی استفاده کنند.
به همین دلیل شاید با داشتن هوم مشترک بین دوتا توزیع با نسخه نرمافزارهای متفاوت مشکل پیش بیاد. مثلا دبیان ۱۱ از گنوم ۳.۳۸ استفاده میکنه در حال که فکر کنم نسخه فعلی گنوم توی مانجارو ۴۲ باشه.
احتمالا پیکربندیها عوض شده و هوم مشترک مشکل بوجود بیاره. بهتره حداقل دایرکتوریهای config. وlocal. توی هوم، بین توزیعها متفاوت باشه.
و اینکه من قابلیت فشرده سازی zstd و قابلیت cow فایل سیستم btrfs رو نیاز دارم آیا استفاده از اینا ناپایداری ایجاد میکنه؟
این دوتا قابلیت btrfs پایدار هستند.
میشه توضیح بدید چجوری باید برای /var/tmp/ و /tmp/ از tmpfs استفاده کنم؟
میتونید با دستور mount یه tmpfs رو یه جایی سوار کنید. لازمه که برای دستور mount مشخص کنید که نوع فایلسیستم tmpfs هست. اینکار با دادن آپشن t- یا type-- ممکن هست. t- معادل کوتاه type-- هست.
مثلا اینجوری میتونید یه tmpfs روی /var/tmp/ سوار کنید:
mount -t tmpfs tmpfs /var/tmp
اون tmpfs دومی فقط یه اسم هست، هر چیز دیگهای میتونید بنویسید.
حواستون باشه که وقتی یه چیزی رو روی یه دایرکتوری سوار میکنید، محتویات قبلی اون دایرکتوری از دسترس خارج میشن، تا زمانی که اون چیز unmount بشه.
ممکنه فایلهای موقتی مهمی توی /var/tmp/ باشه و این سوار کردن باعث مشکل بشه، هرچند خیلی بعیده این اتفاق بیوفته.
برای اینکه سوار شدن به صورت خودکار انجام بشه، باید چیزهای مورد نیاز رو به فایل fstab اضافه کنید.
ساختار فایل fstab شامل ۶ قسمت هست. لازمه ۴ قسمت اول قسمت مشخص بشن، اگه دو قسمت آخر مشخص نشن، عدد ۰ برای اونها در نظر گرفته میشه.
قسمتها توسط فاصله از هم جدا میشه. خطهای خالی و همینطور خطوطی که با علامت # شروع میشن نادیده گرفته میشن.
اگه یه قسمت خودش شامل فاصله باشه، یا باید اون قسمت رو گذاشت بین " " یا ' ' یا اینکه یه علامت \ گذاشت قبل هر فاصله.
قسمت اول مشخص میکنه که چی قراره سوار بشه. توی حالت مربوط به tmpfs، هر اسمی بذارید فرقی نمیکنه. مثل دستور mount میمونه.
قسمت دوم مشخص میکنه که این چیز باید کجا سوار بشه.
قسمت سوم نوع فایلسیستم رو مشخص میکنه. بسته به شرایط ممکنه لازم باشه دقیقا نوع فایلسیستم رو مشخص کنید (برای tmpfs لازمه) ممکن هم هست لازم نباشه، در این حالت همچنان میتونید به طور دقیق نوع فایلسیستم رو مشخص کنید، میتونید هم auto رو بنویسید تا نوع فایلسیستم به طور خودکار شناسایی بشه.
قسمت چهارم آپشنهای سوار شدن رو مشخص میکنه. مثلا rw برای اینکه فایلسیستم به صورت خواندنی و نوشتنی سوار بشه یا ro برای اینکه به صورت فقط خواندنی سوار بشه یا size برای اینکه حداکثر اندازه رو مشخص کنید
اگه میخواهید از پیشفرضها استفاده بشه، میتونید defaults رو بنویسید. میتونید همراه defaults آپشنهای دیگه هم بنویسید.
اگه یه آپشن که میتونه مقدار بگیره، برای مثال compress توی btrfs، چند بار نوشته بشه؛ آخرین مقدار مشخص شده مورد استفاده قرار میگیره.
قسمت پنجم مشخص میکنه که آیا با استفاده از دستور dump از فایلسیستم پشتیبانی گرفته بشه یا نه. این قسمت دیگه منسوخ شده و تا حالا جایی ندیدم که ۰ نباشه. هرچند این یکی روی سطح بلوکها کار میکنه و اصلا فکر نکنم بشه برای tmpfs ازش استفاده کرد.
قسمت ششم مشخص میکنه که fsck کی اون فایلسیستم رو بررسی کنه. از اونجایی که tmpfs روی رم قرار داره، اصلا fsck برای اون کار نمیکنه.
با توجه به اینها، چیزهایی که باید به فایل fatab اضافه کنید میشه این:
tmpfs /tmp tmpfs rw,mode=1777,nosuid,nodev,size=500mb,defaults 0 0
tmpfs /var/tmp tmpfs rw,mode=1777,nosuid,nodev,size=500m,defaults 0 0
شاید بخواهید فاصلهها رو خودتون تنظیم یا با tab عوضشون کنید تا منظمتر بشن. اینکار توی عملکرد تاثیری نداره.
اندازه tmpfs به ۵۰۰Mib محدود شده. این به این معنی نیست که tmpfs همین الان ۵۰۰Mib اشغال کرده، بلکه به این معنیه که فقط میذاره تا ۵۰۰Mib اطلاعات توی اون tmpfs ذخیره بشه.اگه size رو مشخص نکنید، به طور پیشفرض، محدودیت میشه نصف رم. میتونید size رو تغییر بدید.
mode برای این لازمه تا دسترسی درست برای /tmp/ و /var/tmp/ حفظ بشه. nodev و nosuid هم پارامترهای امنیتی هستند تا از ایجاد block device و همینطور موثر بودن بیتهای setuid و setgid توی دایرکتوریهایی که همه میتونند داخل اونها چیز بنویسند جلوگیری بشه.
میتونید توی تنظیمات systemd هم تنظیم کنید که سوار کردن رو انجام بده. ولی به نظرم بهتره از همون فایل fstab استفاده کنید، به جای اینکه برید سراغ چیزهایی که فقط روی systemd کار میدهند.
و اصلا این tmpfs چی هست؟ فایل سیستم مجازیه؟
یه فایلسیستممجازی هست که بیشتر کد اون با کد مربوط به قابلیت cache کرد کرنل یکی هست. ممکنه در صورتی که رم پر بشه، محتویات tmpfs به swap منتقل بشن.
اگه نمیخواهید اینجوری بشه، میتونید از ramfs استفاده کنید. ولی نمیتونید برای ramfs محدودیت اندازه مشخص کنید. تا جایی که حافظه به طور کامل پر بشه، اجازه میده که اطلاعات داخلش بنویسید.
چجوری براشون quota تعیین کنم؟
در مورد tmpfs نمیدونم اصلا چنین قابلیتی داره یا نه. در مورد بقیه فایلسیستمها، بستگی داره که چی باشه. تا جایی که میدونم هر کدوم روش متفاوتی برای اینکار داره.
اگه دایرکتوری های زیر رو جدا کنم مشکلی پیش نمیاد؟
/var/cache/
/var/log/
/var/tmp/
نه. نباید مشکلی پیش بیاد. /var/cache/ رو هم اگه جدا کنید، اتفاقی نمیافته. بهتره فشردهسازی رو برای /var/cache/ غیرفعال کنید چون معمولا بیشتر فایلهای داخل اونجا به طور پیشفرض یا فشرده هستند یا اگه نباشند، یه سری فایل موقتیاند.
-
پس برای /var/tmp/ و /tmp/ که از نوع tmpfs باشن نیازی نیست فضای روی دیسک بهشون تخصیص داده بشه؟
و اینکه 4GB برای هر کدوم از این دو تا کافیه؟
-
لازم نیست پارتیشن جدا بهش تخصیص بدید. از اونجایی که از btrfs استفاده میکنید، میتونید هر وقت خواستید یه subvolume برای اونها بسازید.
4Gib باید کافی باشه. میتونید size رو هم مشخص نکنید تا به اندازه نصف رم جا داشته باشه.
توی ارسال بالا یکی از آپشنها رو اشتباه نوشتم. وقتی آپشن size برای tmpfs رو مشخص میکنید، میتونید از پسوندهایی مثل m برای MiB و k برای KiB و g برای GiB استفاده کنید.
توی قسمت آپشنها مربوط به فایل fstab، اشتباهی به جای size=500m نوشتم size=500mb، حواستون به این باشه. اون ارسال رو ویرایش میکنم.
-
یعنی باید برای هرکدوم یه subvolume بسازم؟
یا اینکه وقتی از نوع tmpfs هستن، مثل اینه که یه پارتیشن با اون روی رم ساخته میشه؟
-
اگه میخواهید محتویات موقتی /tmp/ و /var/tmp/ روی دیسک ذخیره بشه، برای اونها subvolume بسازید.
اگه میخواهید روی رم ذخیره بشن، از tmpfs استفاده کنید.
-
بسیار ممنونم که با حوصله به سوالات بنده پاسخ میدید.
-
اگه برای ساخت فایل fstab به ترتیب دستورات زیر رو وارد کنم مشکلی نیست؟
echo "UUID=$(lsblk -dno UUID /dev/sda3) / btrfs autodefrag,compress=zstd:9,subvol=@,ssd,datacow 0 1" >> /mnt/etc/fstab
echo "UUID=$(lsblk -dno UUID /dev/sda1) /boot/efi vfat defaults 0 2" >> /mnt/etc/fstab
echo "UUID=$(lsblk -dno UUID /dev/sda2) none swap defaults 0 2" >> /mnt/etc/fstab
echo "UUID=$(lsblk -dno UUID /dev/sda3) /home btrfs autodefrag,compress=zstd:9,subvol=@home,ssd,datacow 0 2" >> /mnt/etc/fstab
echo "UUID=$(lsblk -dno UUID /dev/sda3) /.snapshots btrfs autodefrag,compress=zstd:9,subvol=@snapshots,ssd,datacow 0 2" >> /mnt/etc/fstab
echo "varfs /var/tmp tmpfs rw,mode=1777,nosuid,nodev,size=4g,defaults 0 0" >> /mnt/etc/fstab
echo "tmpfs /tmp tmpfs rw,mode=1777,nosuid,nodev,size=4g,defaults 0 0" >> /mnt/etc/fstab
echo "UUID=$(lsblk -dno UUID /dev/sda3) /test btrfs autodefrag,compress=zstd:9,subvol=@test,ssd,datacow 0 2" >> /mnt/etc/fstab
echo "UUID=$(lsblk -dno UUID /dev/sda3) /projects btrfs autodefrag,compress=zstd:9,subvol=@projects,ssd,datacow 0 2" >> /mnt/etc/fstab
پارتیشن بندی به صورت زیره :
/dev/sda1 1Gib ESP
/dev/sda2 6Gib SWAP
/dev/sda3 505Gib System Partition
-
ساختار فایل fstab با پارتیشنبندی شما نمیخونه.
توی فایل fstab تعریف کردید sda3 برای swap استفاده بشه در حالی که برای پارتیشنبندی گفتید sda2 قراره swap باشه.
توی فایل fstab تعریف کردید که sda2 همون فایلسیستم btrfs هست ولی توی پارتیشنبندی به نظر میاد که sda3 برای اینکار استفاده شده.
-
اوه، بله درست میگید
موقع نوشتن تو اینجا اشتباه نوشتم.
-
خب الان هر پارتیشن قراره برای چی استفاده بشه؟
-
sda1 برای esp و اینکه گراب رو روی این پارتیشن نصب میکنم و روی boot/efi/ سوار میشه با حجم ۱ گیگابایت. فرمتش هم fat32 یا vfat هست.
sda2 برای swap با حجم ۶ گیگابایت بدون نقطه اتصال.
sda3 برای پارتیشن اصلی سیستم که با فرمت btrfs هست و حجم باقیمانده فضای دیسک که میشه ۵۰۵ گیگابایت، با subvolume های زیر :
@ mountpoint= /
@home mountpoint= /home
@snapshots mountpoint= /.snapshots
@test mountpoint= /test
@projects mountpoint= /projects
و دایرکتوری های var/tmp/ و tmp/ از نوع tmpfs با ۴ گیگابایت سایز هر کدوم.
-
ساختار پارتیشنبندی شما به نظر خوب میاد. شاید بهتر باشه مقداری فضای خالی آخر ssd بذارید تا اگه به هر دلیلی به فضای خالی نیاز داشتید، به مشکل نخورید.
فکر نکنم لازم باشه تا آپشن datacow رو اضافه کنید چون به صورت پیشفرض فعال هست.
شاید با اضافه کردن space_cache=v2 سرعت بهتری بگیرید. البته مطمئن نیستم نسخه دوم space_cache پایداری خوبی داشته باشه. به طور پیشفرض نسخه یک اون فعال هست. نسخه یک پایداره.
شاید zstd با سطح ۹ کمی کند باشه، مطمئن نیستم. قبلش امتحان کنید که compress=zstd:9 باعث کندی نمیشه.
فشردهسازی بار روی حافظه ذخیرهسازی رو کم میکنه و روی پردازنده قرار میده. وقتی اطلاعات فشرده میشن، حافظه ذخیرهسازی اطلاعات با حجم کمتری رو مینویسه و میخونه ولی از طرف دیگه، پردازنده باید هر بار موقع نوشتن، اطلاعات رو فشرده و موقع خوندن استخراج کنه.
-
اگه آپشن compress رو ننویسیم فشرده سازی انجام نمیشه؟
-
اگه آپشن compress رو مشخص نکنید، از مقدار پیشفرض اون استفاده میشه که مقدار پیشفرض off هست و در نتیجه فشردهسازی انجام نمیشه. اگه compress=off هم بنویسید، همین اثر رو داره.
-
کدوم نوع فشردهسازی هماهنگی بهتری بین سرعت و فشردهسازی داره؟
zstd با سطح ۵ خوبه؟
-
دقیقا نمیدونم. فکر کنم بهترین کار این هست که با تجهیزات خودتون امتحان کنید و ببینید کدوم بهتر عمل میکنه.
فشردهسازی توی btrfs به این شکل کار میکنه که نصف اول اطلاعات ورودی رو بررسی میکنه؛ اگه قابل فشردهسازی باشه، تمام اون رو فشرده میکنه.
اگه قابل فشردهسازی نباشه یا نسبت فشردهسازی پایین باشه، تموم اون رو به شکل فشرده نشده مینویسه. فکر کنم اطلاعات رو توی بستههایی به blick size میخونه.
معمولا block size بین ۵۱۲Kib و ۸Mib هست. بیشتر مواقع ۴Mib هست.
اگه به جای compress از compress-force استفاده کنید، btrfs بررسی نمیکنه که اطلاعات قابل فشردهسازی هستند یا نه، همه اونها رو فشرده میکنه. برای فایلسیستم روت، معمولا حدود ۱۰٪ توی حجم صرفه جویی میشه.
-
فک میکنم سطح ۹ هم کندی خاصی شاهدش نشی، من با i5-4210u گذاشته بودم روی 9 که احتمالا پردازنده شما نسل جدید ترم باشه..
-
من احتمالا پردازندهای که میخوام بگیرم یا i3-10100 هست یا i5-11400
-
compress-force=zstd:9 تا چند درصد در حجم صرفهجویی میکنه؟
-
نمیدونم. بستگی به اطلاعاتی داره که قرار نوشته بشه.
-
میشه یکم درباره انواع فشردهسازی هایی که btrfs پشتیبانی میکنه توضیح بدید؟
-
با توجه به اینها، چیزهایی که باید به فایل fatab اضافه کنید میشه این:
tmpfs /tmp tmpfs rw,mode=1777,nosuid,nodev,size=500mb,defaults 0 0
tmpfs /var/tmp tmpfs rw,mode=1777,nosuid,nodev,size=500m,defaults 0 0
شاید بخواهید فاصلهها رو خودتون تنظیم یا با tab عوضشون کنید تا منظمتر بشن. اینکار توی عملکرد تاثیری نداره.
سطح دسترسی 1777 یعنی چی؟
-
رقم هزارگان مربوط به bit های پیشرفته تره که من حوصله نکردم دقیق یادشون بگیرم ! مثلا یه بیت هست که اگه بدی به پروندت ، وقتی هر کاربری اجراش کنه با سطح دسترسی مالک اون فایل اجرا میشه ! بریم سراغ سه رقم آخر ..
رقم صدگانش دسترسی هایی هست که به مالک اون فایل داده میشه ، که انواعش شامل خوندن ، نوشتن ( شامل حذف کردن ) و اجرا کردن هست ! دهگان دسترسی های گروه اون پرونده ، و یکان هم برای باقی کاربران که به فایل ارتباطی ندارن ، نه عضو گروه فایلن و نه مالکش !
هر عدد جمع یه سری عدد دیگس ، ما فقط به سه رقم آخر کار داریم ، نماد دسترسی خوندن عدد ۴ هست ، برای نوشتن ۲ و قابلیت اجرایی ۱ ، پس وقتی به یه فایل برای مالکش ، دسترسی ۷ رو بدی یعنی هم میتونه بخونش ، هم بنویسه روش و هم اجراش کنه ( اگه فایل اجرایی باشه ) ، یعنی ۴ + ۲ + ۱ ، برای بقیه هم همینطوره !
( خب تو بگو : مثلا دسترسی 644 از چه اعدادی بدست میاد ؟ به چه کاربرایی چه دسترسی هایی میده ؟ )
اینجا هم مشخص کرده جناب دراگون که به همه پرونده های داخل این فایل سیستم این دسترسی رو بده بصورت پیش فرض ، یعنی همه بتونن توی این فایل سیستم بخونن ، بنویسن ، و اجرا کنن ، اما اون یک اولش فک کنم بیتی هست که اجازه نمیده کاربرا فایل های همو دستکاری کنن !
( امیدوارم جایی رو اشتباه نکرده باشم : )
-
من همون یکشو میخواستم بدونم
( خب تو بگو : مثلا دسترسی 644 از چه اعدادی بدست میاد ؟ به چه کاربرایی چه دسترسی هایی میده ؟ )
کاربر مالک دسترسی خوندن و نوشتن
گروهی که فایل بهش تعلق داره دسترسی خوندن
و بقیه هم دسترسی خوندن داره
-
خب تو که بلد بودی ..
۱ . تاکید میکردی اون یک رو میخوای بدونی !
۲ . دیگه نمیخواست سوالمو جواب بدی که وقتی خودت واردی !
😅️
-
میشه یکم درباره انواع فشردهسازی هایی که btrfs پشتیبانی میکنه توضیح بدید؟
تا جایی که میدونم btrfs از فشردهسازیهای zstd و lzo و zlib پشتیبانی میکنه.
برای zlib و zstd میتونید سطح فشردهسازی رو مشخص کنید. هرچی اون عدد رو بیشتر کنید، نسبت فشردهسازی بیشتر میشه و در عوض، پردازنده و رم بیشتری برای فشردهسازی و استخراج اطلاعات مصرف میشه.
zstd از سطح ۱ تا ۱۵ قابل مشخص کردن هست و zlib از ۱ تا ۹.
سطح فشردهسازی پیشفرض برای zstd و همینطور zlib برابر ۳ هست. اگه سطح فشردهسازی رو صفر مشخص کنید، از سطح فشردهسازی پیشفرض استفاده میشه.
سطح فشردهسازی رو میتونید با گذاشتن یه : بعد از اسم فشردهسازی مشخص کنید.
مثلا این آپشن سوار شدن باعث میشه که فشردهسازی با zlib و سطح ۶ اتفاق بیوفته:
compress=zlib:6
یا این باعث میشه فشردهسازی با zstd و سطح پیشفرض انجام بشه:
compress=zstd:0
اگه فقط compress رو مشخص کنید، به طور پیشفرض از zlib با سطح ۳ استفاده میشه
-
جناب دراگون ، من الان با دقت خوندم بخش tmpfs رو و میخواستم بدونم که ...
۱ . دقیقا /tmp و /var/tmp نهایت تا کجا ممکنه سنگین بشه ، چون الان که du گرفتم ازشون به ترتیب 40K و 4K فضا گرفته بودن ، یعنی کمینه مقداری که میشه داد به آپشن size چقد هست ؟
۲ . دقیقا چه پرونده های تو tmp قرار میگیره که میارزه بزارمش رو رم تا بشه سریع تر باهاشون کار کرد ؟ یعنی چقدر میتونه تو سرعت تاثیر بذاره ؟
۳ . به جز این دو تا چه چیزای سبک دیگه ای هستن که باهاشون زیاد کار میکنه سیستم و tmpfs باشن خوبه ؟
-
۱- نمیدونم درست. ولی ممکنه تا 200Mib رو برن.
۲- چیزهای موقتی.
۳- شاید دایرکتوری cache. توی هوم هم بشه. ولی فکر کنم اون یکم حجمش زیاد باشه.
-
بعد این سایزی که بهشون میدیم رزرو نمیشه دیگه ؟ یعنی رم ازاده و میتونه از این فضا استفاده کنه ؟ منظورم اینه اگه نوشتیم ۲۰۰ تا بده به /tmp و اون فقط ۵۰ تا بگیره ، اون ۱۵۰ تای دیگه ازاده از رم دیگه ؟ میتونه اختصاص داده بشه به هر چیز دیگه ای دیگه ؟
-
بعد این سایزی که بهشون میدیم رزرو نمیشه دیگه ؟
نه رزرو نمیشه
یعنی رم ازاده و میتونه از این فضا استفاده کنه
بله
یعنی رم ازاده و میتونه از این فضا استفاده کنه
بله
میتونه اختصاص داده بشه به هر چیز دیگه ای دیگه ؟
بله
-
بعد این سایزی که بهشون میدیم رزرو نمیشه دیگه ؟ یعنی رم ازاده و میتونه از این فضا استفاده کنه ؟ منظورم اینه اگه نوشتیم ۲۰۰ تا بده به /tmp و اون فقط ۵۰ تا بگیره ، اون ۱۵۰ تای دیگه ازاده از رم دیگه ؟ میتونه اختصاص داده بشه به هر چیز دیگه ای دیگه ؟
اون اندازهای که برای tmpfs مشخص میکنید، حداکثر مقداری هست که میتونه مصرف بشه. اگه اطلاعات کمتری نوشته بشه، جای کمتری هم میگیره.
-
سپاس از ابوالفضل و جناب دراگون عزیز 💙