چند روزی است که افتادم طبق معمول به جان سیستم و هی فرمتش می کنم ،البته در این بین به نتایجی هم رسیده ام و مطالبی را آموخته ام ، حیفم آمد آنها را در اختیار دوستان قرار ندهم، شاید یکیش بدردتان بخورد.
...
الف) backup و restore با cp :
به نظرم rsync گزینه بهتری هست چون میتونه acl های فایلها رو موقع فرستادن حفظ کنه. journald از acl ها برای اینکه دسترسی به گزارشها (لاگها) رو مدیریت کنه، استفاده میکنه. فکر نکنم cp بتونه acl ها رو منتقل کنه.
rsync فقط فایلهایی رو کپی میکنه که یا توی مقصد نیستند یا اینکه توی مقصد و مبدا با هم تفاوت دارند. البته اگه توی مقصد چیزی وجود نداشته باشه یا اکثر فایلها توی مقصد و مبدا متفاوت باشند، این مزیت به درد نمیخوره.
در حالتی که از قبل پشتیبان گرفته باشید و بخواهید یه جدید بگیرید و فقط فایلهایی که تغییر کرده باشند رو کپی کنید، این قابلیت میتونه خیلی توی زمان، صرفه جویی کنه.
من خودم اینجوری از rsync برای پشتیبانی گرفتن از روت یه سیستم استفاده میکنم.
rsync -aAXUH path/to/root/ /path/to/destination
اگه اون اِسلش (علامت /) آخر رو بذارید، محتوای path/to/root کپی میشه. اگه اسلش آخر رو نذارید، خود دایرکتوری کپی میشه و فایلها درون اون قرار میگیرن. دستور بالا، فایلها و دایرکتوریهای مخفی رو هم کپی میکنه.
آپشن a- خیلی چیزها از جمله دسترسیها، مالکیت و اینجور چیزها رو حفظ میکنه. A- برای این هست تا acl ها هم حفظ بشن، X- برای حفظ xattr ها هست، U- باعث میشه تا زمانهایی که فایل تغییر کرده هم حفظ بشه و H- باعث میشه لینکهای سخت توی مبدا هم ایجاد بشن.
H- رو میتونید بردارید تا سرعت یکم بیشتر بشه. ولی با توجه به شرایط، ممکنه باعث بشه حجم بیشتری توی مبدا اشغال بشه. معمولا اینجوری نیست، مگه اینکه لینکهای سخت زیادی داشته باشید و فایلها مربوط به اون لینکها، حجیم باشند.
در صورتی که بخواهید rsync بگه که داره چیکار میکنه، میتونید آپشن v- رو بدید. با دادن آپشن h-، خروجی بهتری نمایش داده میشه تا یه آدم راحتتر متوجه بشه. اگه h- رو بدون هیچ چیز دیگهای به rsync بدید، راهنمای کوتاه rsync نمایش داده میشه.
در صورتی که آپشن N- رو به rsync بدید، زمانی که فایلها ایجاد شدند، موقع کپی کردن حفظ میشه. البته برای اینکه این قابلیت کار کنه، باید موقع کامپایلِ برنامه، فعال شده باشه. نسخهای از rsync که توی مخازن دبیان هست، این قابلیت رو نداره چون موقع کامپایل، این قابلیت فعال نبوده.
همه این کارها را در محیط لایو انجام دهید.
میشه توی سیستم اصلی، وقتی که بوت شده انجامش داد ولی باید بدونید دارید چیکار میکنید تا یه پشتیبان بدون مشکل و سالم بگیرید.
۱- ابتدا توسط این فرمان از پارتیشن موردنظرتان بک آپ بگیرید:
cp -afrp path/to/root /path/to/destination
بهتر بود اینجا میگفتید path/to/root، مسیر به جایی هست که فایلسیستم مورد نظر سوار شده و /path/to/destination/، مسیر به دایرکتوری مقصد هست؛ جایی که میخواهیم پشتیبان رو ذخیره کنیم. اگه یه کاربر همینجوری این دستورات رو بزنه، به احتمال خیلی زیاد خطا میگیره که چنین فایل یا دایرکتوری وجود نداره.
توی cp، آپشن a- معادل Rd --preserve=all- هست. R- و r- با هم برابر هستند. p- برابر preserve=mode,ownership,timestamps-- هست. با توجه به اینها، r- توی دستور شما زیادیه، p- هم همینطور چون preserve=all-- هرچی رو بتونه، منتقل میکنه، در نتیجه دسترسی، مالکیت، گروه و زمانها هم حفظ میشه. پس دستور شما میتونه به این شکل ساده بشه:
cp -af path/to/root /path/to/destination
دستور بالا دایرکتوری path/to/root رو کپی میکنه توی /path/to/destination/، توی این کپی کردن، بیشتر مشخصات فایلها و دایرکتوریها حفط میشن. منظورم از مشخصات، چیزهای مثل دسترسی، مالکیت، timestamp ها و اینجور چیزهاست. خود فایلها همیشه کپی میشن.
با احتیاط از آپشن f- توی cp استفاده کنید. چون باعث میشه حتی اگه فایلی هم توی مقصد بود و هم توی مبدا، اطلاعات اونی که توی مبدا هست، روی فایلی که توی مقصد هست، نوشته بشه.
توچه کنید که با این فرمان در مقصدتان یک پوشه ای با نام UUID پارتیشن مبدا ایجاد خواهد شد که در داخل آن پوشه ها و فایل های ریشه اتان خواهد بود.
البته این در حالتی درسته که اسم دایرکتوری path/to/root با uuid اون فایلسیستم برابر باشه. همیشه اینطوری نیست، مثلا ممکنه فایلسیستم مورد نظر رو دستی روی /mnt/ سوار کرده باشید، بعد از استفاده از دستوری که گذاشتید، توی مبدا یه دایرکتوری به اسم mnt ایجاد میشه.
معمولا وقتی از طریق محیط گرافیکی یا مدیرفایلهای گرافیکی مثل nautilus، dolphin و ... یه چیزی رو سوار میکنید، یه دایرکتوری توی /media/ به اسم کاربر شما ایجاد میشه. توی اون دایرکتوری، یه دایرکتوری دیگه با uuid فایلسیستم مورد نظر ایجاد میشه و بعد اون فایلسیستم، روی دایرکتوری آخری که گفتم، سوار میشه.
ممکنه اسم اون دایرکتوری آخری که ساخته میشه، برابر label یا یه مشخصه دیگه فایلسیستم باشه. پس اینکه بگید توی مقصد، یه دایرکتوری با اسمی برابر uuid فایلسیستم مبدا درست میشه، همیشه درست نیست.
وقتی میگید 'uuid پارتیشن مبدا'، به نظر میرسه منظور، uuid خود پارتیشن هست که به اطلاعات روی پارتیشن، بستگی نداره. در حالی که منظور ما، uuid خود فایلسیستم هست.
بهتره به جای پارتیشن بگید فایلسیستم. چون اون uuid که میبینید، مربوط به خود فایلسیستم هست. مال پارتیشن نیست.
میشه روی یه پارتیشن، lucks (برای رمزنگاری) ایجاد کرد. با اینکار، یه دستگاه مجازی توی /dev/ ایجاد میشه تا بتونید از این فضای رمزنگاری شده استفاده کنید.
الان میتونید مثل وقتی که یه پارتیشن رو فرمت میکنید، این دستگاه مجازی رو با یه فایلسیستم فرمت کنید. (در صورتی که کلید اون lucks، لود شده باشه) معمولا فایلسیستم برای خودش یه uuid ایجاد میکنه، شما میتونید مثل قبل، از این uuid توی فایل fstab استفاده کنید. البته باید توی فایل crypttab تنظیم کنید که این lucks باز بشه، در غیر اینصورت، فایلسیستمی با اون uuid پیدا نمیشه و یه جایی توی مراحل بوت، به مشکل میخورید.
در مورد دستگاههای مجازی md (مربوط به raid) باز هم همینجوره. یعنی شما چندین پارتیشن یا دیسک رو برای raid استفاده میکنید و نتیجه میشه یه دستگاه مجازی، توی /dev/، بعد میتونید اون دستگاه مجازی رو فرمت کنید، یا بدیدش به lucks یا کارهای دیگه باهاش انجام بدید.
lvm هم شبیه همین هست.
حتی میتونید اینها رو ترکیب کنید. مثلا با چنتا دیسک، raid بسازید که باعث میشه یه دستگاه مجازی توی /dev/ ساخته بشه، بعد از lvm استفاده کنید که میتونه چندین دستگاه مجازی دیگه، به /dev/ اضافه کنه. بعد همه یا بعضی از اونها رو با lucks رمزنگاری کنید که یک یا چنتا دستگاه مجازی دیگه هم اضافه میشه و بعد اون دستگاههای مجازی آخری رو با یه فایلسیستم فرمت کنید.
میتونید ترتیب رو هم عوض کنید، مثلا اول lucks باشه، بعد lvm یا چیزهای دیگه.
اگه از پارتیشنتیبل gpt استفاده شده باشه، هر پارتیشن فاقد از اینکه با چی فرمت شده، یا چه اطلاعاتی روی اون هست، یه uuid مخصوص به خودش داره. (ممکنه بهش guid هم بگن، توی این مورد فرقی ندارند)
توی سیستمعاملهای آزاد، معمولا به اسم PARTUUID شناخته میشه. میشه از این PARTUUID توی فایلهای fstab یا crypttab استفاده کرد. مثلا این شکلی برای fstab
PARTUUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /home ext4 rw,defaults 0 0
به جای xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx، باید uuid اون پارتیشن قرار بگیره.
uuid مربوط به پارتیشنها رو میتونید توی /dev/ پیدا کنید. توی این مسیر:
/dev/disk/by-partuuid
توی دایرکتوری بالا، لینکهایی وجود داره که به فایل اصلی پارتیشن، توی /dev/ اشاره میکنند. اسم اون لینکها، برابر uuid پارتیشنی هست که بهش اشاره میشه.
blkid و lsblk هم میتونند partuuid رو نمایش بدهند.
اگر هم دوست نداشته باشید که پوشه ای با نام UUID پارتیشن مبدا برایتان ایجاد شود از این دستور استفاده نمایید، تا پوشه ها و فایل ها ی مبدا، بدون ایجاد این پوشه در مقصدتان کپی شود( حتما در اینصورت ،علامت */ در انتهای مسیر مبدا را بگذارید.):
(عکس ۱)cp -afrp path/to/root/* /path/to/destination
گزینه بهتر اینه:
cp -af path/to/root/. /path/to/destination
اینجوری فایلها و دایرکتوریهای مخفی هم کپی میشن. البته معمولا بعیده که فایل یا دایرکتوری مخفی توی روت یه سیستم وجود داشته باشه.
تا جایی که میدونم، فقط selinux هست که توی روت، فایل مخفی ایجاد میکنه. selinux اینکار رو انجام میده تا توی بوت بعدی، برای فایلها label بذاره. ( تا بتونه درست کار کنه) بعد از اینکه اینکار رو انجام داد، اون فایل رو پاک میکنه.
فایلی که ایجاد میشه، خالی هست و اسمش اینه autorelabel.
میشه با touch این فایل رو ایجاد کرد. با ابزارهای selinux هم ممکنه. اینجوری:
fixfiles -F onboot
در مورد دایرکتوری مخفی هم فقط یه zfs رو میدونم که یه دایرکتوری با اسم zfs. توی روتِ هر dataset معمولی میسازه. در نتیجه اگه روتِ سیستم، از zfs استفاده کنه، یه دایرکتوری به اسم zfs. هم ایجاد میشه. این دایرکتوری برای این هست تا بشه به اطلاعات snapshot های قبلی دسترسی داشت. قسمت جالبش اینه که به طور پیشفرض، ls -a هم اون رو نشون نمیده. ولی اگه اسم کاملش رو بدید، نشون میده. این رفتار رو میشه تغییر داد.
۲- زمانیکه هم خواستید با این دستور سیستم را به حالت قبل برگردانید، جای دو تا مسیر را با هم عوض کنید و چون نمی خواهیم خود پوشه بک آپ انتقال یابد و تنها
می خواهیم محتویات پوشه بک آپ انتقال یابد،علامت */ در انتهای مسیر مبدا را بگذارید.( عکس ۲)
cp -afrp /path/to/backup/* path/to/root
اگه از rsync استفاده کرده باشید، میتونید اینجوری اطلاعات رو برگردونید.
rsync -aAXUH /path/to/backup/ path/to/root
همونطور که بالا گفتم، اون اسلش (علامت /) آخر رو باید بذارید تا محتوای داخل اون دایرکتوری کپی بشه.
اگه از cp میخواهید استفاده کنید، اینجوری انجام بدید تا فایلها و دایرکتوریهای مخفی هم کپی بشن.
cp -af /path/to/backup/. path/to/root
تذکر: برای استفاده از این روش ، لازم است که هر دو مسیر در حالت mount باشند.
بهتر بود این رو بالاتر میگفتید، همون اول کار قبل از اینکه cp رو معرفی کنید.
اینکه بگید 'لازم است هر دو مسیر در حالت mount باشند'، زیاد واضح نیست. بهتره بگید ' لازم است که فایلسیستم مورد نظر سوار شده باشد'
لازم نیست جایی که میخواهید پشتیبانها رو ذخیره کنید، حتما یه 'محل سوار شدن' (mountpoint) باشه.
برای مثال ممکنه شما بخواهید پشتیبانها رو روی یه فلش ذخیره کنید.
فرض کردیم فایلسیستمی که قرار پشتیبانها روی اون ذخیره بشن، روی /mnt/usb-storage/ سوار شده و فایلسیستمی که میخواهیم از اون پشتیبان بگیریم، روی /mnt/debian-root/
باز هم فرض میکنیم که قراره پشتیبانهای دبیان رو توی فلش، توی یه دایرکتوری به اسم debian-back ذخیره کنیم تا پشتیبانها یه نظمی داشته باشند.
برای اینکه ببینید هر پشتیبان کِی گرفته شده، یه دایرکتوری میسازید که اسم اون، برابر تاریخ پشتیبانگیری هست. مثلا این: 11-02-2022
با این فرضها، مسیری که قراره فایلها توی اون ذخیره بشن، میشه این:
/mnt/usb-storage/debian-back/2022-02-11
همینطور که میبینید، مسیر بالا یه محل سوار شدن (mountpoint) نیست. بلکه /mnt/usb-storage/ یه محل سوار شدن هست.
تذکر: چون حجم فایل ها زیاد است مدت زمانی طول می کشد که فایل ها از حافظه میانگیر یا بافر (Buffer) به روی هاردتان ذخیره گردند و بایستی حتما قبل از بستن پنجره ها و یا خروج از سیستم نسبت به این امر مطمئن شوید.
میتونید از دستور sync برای اینکار استفاده کنید. اگه دستور sync رو اجرا کنید، اطلاعات از توی cache/buffer روی حافظه ذخیرهسازی نوشته میشن.
تا وقتی که فایلسیستم پایان این نوشتن رو اعلام نکنه، دستور sync به پایان نمیرسه. اینجوری میتونید متوجه بشید که کِی عملیات نوشتن تموم شده و بیهوده صبر نکنید.
بطور کلی برای اینکه مطمئن شویم چه در زمان backup گیری و چه در زمان restore ، که تعداد فایل های مبدا با مقصد یکی باشند از دستور tree استفاده می نماییم.
به نظرم diff گزینه مناسبتری برای اینکار هست. چون اگه یه فایلی هم توی مقصد باشه و هم توی مبدا اما متفاوت باشند، (مثلا ناقص منتقل شده باشه) شما با استفاده از tree نمیتونید متوجه این بشید. در حالی که اگه از diff استفاده کرده باشید، میگه که دقیقا چه فایلها یا دایرکتوریهایی با هم متفاوت هستند.
diff رو همراه آپشنهای q- و r- و با دادن دوتا دایرکتوری مورد نظر اجرا کنید تا بگه چه فایلهایی توی اون دوتا دایرکتوری با هم متفاوته.
مثلا اینجوری:
diff -qr /mnt/debian-root /mnt/usb-storage/debian-back/2022-02-11
آپشن q- برای این هست تا تفاوتها رو نشون نده و فقط بگه چه فایلهایی با هم متفاوت هستند. r- برای این هست که مقایسه به صورت بازگشتی انجام بشه و زیر دایرکتوریها و فایلهای داخل اونها هم بررسی بشن.
تذکر: ولی اگر زمانی پارتیشن ریشه را فرمت کردید و سپس خواستید سیستمتان را restore نمایید،لازم است که علاوه بر مراحل بالایی ، مراحل زیر را هم انجام بدهید:
شاید لازم باشه initramfs رو هم دوباره ایجاد کنید. ممکنه فایلسیستم روت، توی خود initramfs مشخص شده باشه. اگه از lvm یا lucks یا چیزهای دیگه هم استفاده کرده باشید، احتمالا باز هم لازمه تا initramfs رو دوباره ایجاد کنید.
کار سختی هم نیست برای پیدا کردن uuid مثلا اگر پارتیشن / در sda3 باشد از این دستور استفاده کنید، فرقی ندارد چه در محیط سیستم اصلی تان و چه در محیط لایو ،باشید، جواب یکی است :
blkid /dev/sda3
با lsblk هم میتونید اینکار رو انجام بدید. حتی میشه فقط uuid رو گرفت. اینجوری
lsblk -o UUID /dev/sda3
ولی lsblk یه مشکل داره و partuuid (و احتمالا uuid) رو توی محیط chroot نشون نمیده. حتی با اینکه فایلسیستمهای مورد نیاز هم سوار بودند.
- بایستی grub را آپدیت نمایید.
علاوه بر آپدیت کردن گراب، باید فایل تنظیم اون توی esp رو هم تغییر بدید. (اگه سیستم توی حالت uefi بوت شده)
توی ارسال بالا یه سری توضیح دادم.
در مورد boot repair، توی کامپیوتر شما، گراب رو توی مسیر پیشفرض قرار داده. احتمالا متغیرهای EFI رو هم تغییر داده.
دلیل اینکه گراب رو توی مسیر پیشفرض گذاشته این هست که بعضی پیاده سازیهای uefi، مشکل دارند و الویت بوت رو بر اساس متغیرهای EFI انجام نمیدن. و فقط چیزی که توی مسیر پیشفرض هست رو بوت میکنند.
بعضی اوقات، boot repair میتونه نتایج ناخواسته داشته باشه. (مخصوصا اگه نخواهید از گراب استفاده کنید) به خاطر همین بهتره با احتیاط ازش استفاده کنید و بعد از استفاده، چیزها رو بررسی کنید تا ببینید مطابق چیزی هست که میخواهید یا نه.