في العام الماضي كنت بحاجة لإنشاء تعليمات لتثبيت نظام التشغيل Ubuntu 18.04. بالمناسبة ، لا يوجد شيء معقد في تثبيت أوبونتو ، ولكن هناك فارق بسيط: أردت استخدام نظام الملفات ZFS كقاعدة. من ناحية ، يدعم Ubuntu ZFS على مستوى kernel ، لكن لا يوجد برنامج تثبيت له حتى الآن ، ولكن هناك تعليمات ، نعم:
https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS
تسلسل الإجراءات في هذا الدليل صحيح بشكل عام ، لكن بعض النقاط تتطلب الضبط. إذن ما يلي ليس ترجمة مباشرة للتعليمات ، ولكن مجانًا ، مع مراعاة التصحيحات وتجربتي مع ZFS وأشياء أخرى. أنا أيضًا لا أعتبر مشكلات تشفير القرص واستخدام أداة تحميل أداة MBR. يمكن الحصول على تعليمات التثبيت الخاصة بي هنا.
0. إعداد الخادم
أول شيء مفقود في الإرشادات ولا يتم اعتباره بأي شكل من الأشكال هو أن ZFS لا يعمل بشكل جيد مع صفائف RAID للأجهزة ، على وجه الخصوص ، إنه متصل بـ "ذاكرة التخزين المؤقت للكتابة" ، وهو أمر مفهوم: يتم عمل نظام ملفات ZFS بشكل يومي ويتطلب التحكم الكامل في عمليات الكتابة. أيضًا ، عند استخدام مجموعة RAID للأجهزة الجاهزة ، يتم فقد إمكانات ZFS من حيث ذاكرة التخزين المؤقت و Spare والمزيد. لذلك ، يجب نقل جميع الأقراص إلى وضع HBA ، وإذا لم يكن ذلك ممكنًا - لإنشاء RAID منفصل لكل قرص وتعطيل جهاز التحكم في ذاكرة التخزين المؤقت للكتابة.
أيضًا ، عند استخدام تجميع منافذ الشبكة ، يمكنك تعطيلها في مرحلة التثبيت ، حتى لا يتم تعقيدها (سأقوم بإجراء جميع العمليات الأخرى دون الربط).
1. إعداد بيئة التثبيت
1.1. قرص حي
كما ذكرنا سابقًا ، لسوء الحظ ، لا يوجد مثبت أوبونتو جاهز يستخدم الجذر على ZFS ، لذلك يتم التثبيت باستخدام قرص قرص حي:
قم بالتنزيل من هنا: http://releases.ubuntu.com/18.04/ubuntu-18.04.1-desktop-amd64.iso
في الوقت نفسه ، حاولت مع زملائي استخدام صور مختلفة للقرص لأنني لا أريد حقًا استخدام القشرة الرسومية ، لكن هذا لم يؤدي إلى أي شيء جيد.
نقوم بالتمهيد من قرص حي ، حدد Try Ubuntu وافتح الجهاز (Ctrl + Alt + T).
1.2. تحديث وتثبيت المستودعات
''
sudo apt-add-repository universe sudo apt update
نحن هنا في انتظار المشكل الأول إذا لم يتم تحديد إعدادات الشبكة للخادم بواسطة DHCP. لن تعمل تحديث المستودعات ، لذلك دعونا نقوم بإعداد الشبكة.
نحن نلقي نظرة على واجهات الشبكة ونجد واجهة التواصل من خلالها:
sudo ip a
تكوين واجهة الشبكة:
sudo echo "auto {{ NAME }}" >> /etc/network/interfaces sudo echo "iface {{ NAME }} inet static" >> /etc/network/interfaces sudo echo " address {{ IP }}" >> /etc/network/interfaces sudo echo " netmask {{ NETMASK }}" >> /etc/network/interfaces sudo echo " gateway {{ GATEWAY }}" >> /etc/network/interfaces sudo service networking restart
ومحلل DNS:
sudo echo 'nameserver 8.8.8.8' >> /etc/resolv.conf
تحديث المستودعات:
sudo apt update
1.3. خادم SSH (اختياري)
لسهولة التثبيت ، يمكنك رفع خادم OpenSSH وتنفيذ جميع العمليات الأخرى من خلال عميل SSH
قم بتعيين كلمة المرور للمستخدم أوبونتو:
passwd
هذا مهم! منذ خلاف ذلك ، سيتم الوصول عبر ssh بدون كلمة مرور مع حقوق sudo. ومع ذلك ، لا يمكنك تعيين كلمة مرور بسيطة.
تثبيت وتشغيل OpenSSH:
sudo apt install openssh-server sudo service ssh start
وفي محطة محطة العمل:
ssh ubuntu@{{ ip server }}
1.4. تصبح الجذر
sudo -s
1.5. تثبيت دعم ZFS في بيئة قرص حي
apt install --yes debootstrap gdisk zfs-initramfs
2. تقسيم وتنسيق الأقراص الصلبة
2.0. تحديد صفائف القرص
لا تحتوي التعليمات الرئيسية على نقطة مهمة حول كيفية تحديد صفائف القرص.
عادةً ما يكون عدد الأقراص على الخوادم:
- 2 أقراص ؛
- 4 اسطوانات
- العديد من الأقراص.
لا نعتبر قرصًا واحدًا نظرًا لأنه شاذ بشكل عام.
2.0.1. 2 أقراص
كل شيء بسيط هنا ، صفيف MIRROR واحد (RAID1). إذا كان هناك محرك أقراص ثالث آخر ، فيمكنك وضعه في مكان ساخن (SPARE) أو تجميع مجموعة RAIDZ (RAID5). ولكن 3 أقراص في الخادم نادرة جدا.
2.0.2. 4 أقراص
إذا كانت جميع محركات الأقراص متماثلة ، فهناك ثلاثة خيارات فقط (RAID0 الرابعة لا تأخذ في الاعتبار بشكل أساسي):
- MIRROR + MIRROR هو نظير لـ RAID10 ، بتعبير أدق RAID01 ، لأنه في ZFS هو مرآة + مرآة. 50 ٪ من مساحة القرص المتاحة ؛
- RAIDZ هو التناظرية RAID5. 75 ٪ من مساحة القرص المتاحة ؛
- RAIDZ2 هو تناظرية RAID6. 50 ٪ من مساحة القرص المتاحة ؛
في الممارسة العملية ، أستخدم صفيف MIRROR + MIRROR ، في حين أنه من الواضح أن صفيف RAIDZ هو الأكثر ربحية ، لأنه يوفر مساحة أكبر على القرص ، ولكن هناك فروق دقيقة
من حيث التسامح مع الخطأ ، يتم ترتيب المصفوفات بالترتيب (من الأفضل إلى الأسوأ):
- RAIDZ2 - قد يتم فقد قرصين دون فقد البيانات ؛
- MIRROR + MIRROR - قد يتم فقد قرص واحد دون فقد البيانات ، وباحتمال بنسبة 66٪ ، قد يتم فقد قرص ثانٍ دون فقد البيانات ؛
- RAIDZ - يمكن فقد قرص واحد فقط دون فقد البيانات ؛
من حيث السرعة ، يتم ترتيب المصفوفات بالترتيب التالي:
- MIRROR + MIRROR - سواء من حيث الكتابة والقراءة ؛
- RAIDZ - من حيث التسجيل أبطأ ، لأنه بالإضافة إلى التسجيل ، يجب حساب المجموع الاختباري ؛
- RAIDZ2 - من حيث الكتابة هو أبطأ لأنه يتطلب حساب اختباري أكثر تعقيدًا ؛
من حيث سرعة المصفوفة أثناء تدهور قرص واحد:
- MIRROR + MIRROR - عند سقوط محرك أقراص واحد ، وفقدان القراءة المتوازية فقط من مرآة واحدة فقط ، تعمل المرآة الثانية دون تدهور الأداء ؛
- RAIDZ2 - التدهور في تدهور الأداء أعلى لأنه يتطلب تخصيصًا للخلف للكتلة من المجموع الاختباري لـ 1/4 من البحث عن البيانات + الكتلة ؛
- RAIDZ - التدهور أكبر بكثير ، لأنه يتطلب إعادة حساب الكتلة من المجموع الاختباري لـ 1/3 من البحث عن البيانات + الكتلة ؛
مقارنة الخصائص ذاتية ، لكن يعكس بما فيه الكفاية خياري كحل وسط.
في الوقت نفسه ، عليك أن تفهم أن "أبطأ" و "حتى أبطأ" ليس في بعض الأحيان ، ولكن فقط 10-20 ٪ في أسوأ الحالات ، وبالتالي ، إذا لم يتم تحسين قاعدة البيانات أو التطبيق الخاص بك للعمل مع الأقراص ، فلن تسقط بسرعة من حيث المبدأ ، لا تلاحظ. يجب مراعاة عامل سرعة التسجيل فقط عندما تحتاجه حقًا.
2.0.2. العديد من الأقراص
تكمن المشكلة الرئيسية في أنه إذا كان لدينا العديد من الأقراص ونريد إنشاء مجموعة واحدة مشتركة لكل شيء ، فسنحتاج إلى وضع علامة على كل قرص بقطاع التمهيد أو عمل القليل من الخدع مع آذاننا. في الممارسة العملية ، بالنسبة للأنظمة متعددة الأقراص ، أحاول بناء هذا التكوين:
- 2 أقراص SSD - نقوم بعمل نسخة متطابقة وكصفيف التمهيد الرئيسي مع نظام التشغيل وذاكرة التخزين المؤقت ZFS لصفيف القرص الثاني ؛
- يتم انسداد الباقي باستخدام أقراص SATA أو SAS وبدون العلامات نقوم بتجميع صفيف قرص ZFS ؛
الأمر نفسه ينطبق على الخوادم ذات الأقراص الأربعة إذا أردنا الحصول على نظام أساسي عالمي إلى حد ما ؛
إذا كانت كل الأقراص متشابهة ، ومن غير المنطقي تخصيص قرصين لصفيف منفصل (على سبيل المثال ، 6 أقراص كل منهما 8 تيرابايت لكل منهما) ، فيمكنك جعل أقراص المجموعة الأولى من المصفوفة قابلة للتمهيد. هذا هو ، إذا كنت ستقوم بإنشاء صفيف مثل: MIRROR + MIRROR + MIRROR أو RAIDZ + RAIDZ ، فسنقوم بترميز قطاع التمهيد للمجموعة الأولى فقط. من حيث المبدأ ، من الممكن تقسيم محرك أقراص واحد على الإطلاق ، حتى بالنسبة لـ MIRROR و RAIDZ ، واستبدال الباقي في شكل أولي ، ستقوم ZFS بإعداد الصفيف بواسطة العنصر الأصغر نفسه ، ولكن في هذه الحالة ، إذا فشل محرك الأقراص الأول ، فستفقد قرص التمهيد الوحيد ، لذلك لا يستحق القيام بذلك.
من المهم أن نفهم أن نظام الملفات ZFS - شريط ليس RAID0 بالضبط ، وأنه يعمل بشكل مختلف قليلاً ولا يتطلب نفس أحجام القرص ، لذلك لن يؤدي تخصيص مساحة صغيرة لقطاع التمهيد للطقس إلى القيام بالكثير ، والشيء الرئيسي هو الإشارة إلى أن BIOS هو القرص الصحيح الذي سيتم التمهيد منه .
2.1. التقسيم وتنظيف القرص
يتم استخدام حزمة mdadm لتمييز القرص ووضعه:
apt install --yes mdadm
ننظر إلى الأقراص المتوفرة لدينا:
lsblk
وتنظيفها:
sgdisk --zap-all /dev/{{ disk name }}
2.2. تخطيط القرص
في الواقع ، قسم التمهيد:
sgdisk -a1 -n1:34:2047 -t1:EF02 /dev/{{ disk name }}
القسم الرئيسي.
هنا قد يكون هناك اختلافات: إذا كنت بحاجة إلى تخصيص قسم إضافي من أقراص SSD ، على سبيل المثال ، ل ZFS Cache أو Aerospike ، فأنت تقوم بإنشاء القسم الرئيسي من وحدة التخزين المحدودة:
sgdisk -n2:0:+100GB -t2:BF01 /dev/{{ disk name }} sgdisk -n3:0:0 -t2:BF01 /dev/{{ disk name }}
إذا استخدمنا كل المساحة ، فقم فقط بإنشاء قسم للمساحة المتبقية:
sgdisk -n2:0:0 -t2:BF01 /dev/{{ disk name }}
لا تنسى أن تحقق كيف اتضح:
lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 1.8T 0 disk ├─sda1 8:1 0 1007K 0 part └─sda2 8:2 0 1.8T 0 part sdb 8:16 0 1.8T 0 disk ├─sdb1 8:17 0 1007K 0 part └─sdb2 8:18 0 1.8T 0 part ...
2.3. إنشاء صفيف ZFS
zpool create \ -o ashift=12 \ -O atime=off \ -O canmount=off \ -O compression=lz4 \ -O checksum=fletcher4 \ -O normalization=formD \ -m legacy \ -R /mnt \ -f \ tank \ mirror \ /dev/{{ disk a part 2}} \ /dev/{{ disk b part 2}}
أول أشعل النار على أحد مسؤولي المألوف فورًا ، إنه عند إنشاء صفيف ZFS ، يجب تحديد ليس قرصًا ولكن تقسيمًا على القرص ، إذا تم إنشاؤه خصيصًا لهذا الغرض.
بعد ذلك ، بالترتيب:
- ashift = 12 - استخدام حجم الكتلة في 4K ، من حيث المبدأ ، ما زلت لا أفهم لماذا في كثير من الأحيان في أنظمة التشغيل حجم الكتلة الافتراضي هو 512 بايت عندما لا توجد عمليا مثل هذه الأقراص ؛
- atime = off - تعطيل تاريخ تحديث الوصول إلى الملفات ، فأنا أطفئه دائمًا لأنني لم أكن بحاجة إلى هذه المعلومات مطلقًا ولا يلزم تحميل النواة مرة أخرى ؛
- canmount = off - تعطيل القدرة على تحميل قسم الجذر ؛
- ضغط = lz4 - تمكين ضغط البيانات باستخدام خوارزمية LZ4. يوصى بتضمين هذه المعلمة ليس فقط لتوفير مساحة على القرص ، ولكن أيضًا لتقليل عدد عمليات الإدخال / الإخراج. في الوقت نفسه ، لهذا aglorhythm ضغط ، واستخدام وحدة المعالجة المركزية منخفضة للغاية.
- المجموع الاختباري = fletcher4 - خوارزمية المجموع الاختباري الافتراضي ، وبالتالي فإن fletcher4 يستحق التدقيق مرة أخرى ؛
- normalization = formD - يستخدم لتحسين العمل مع UTF-8 ، في الواقع يحد من إمكانية استخدام أسماء ملفات غير UTF-8. يقرر الجميع هنا بنفسه ، في عملنا نستخدم دائمًا فقط ترميز UTF-8 ؛
- xattr = sa - تسريع العمل مع السمات الموسعة. لا أستخدم هذا الخيار نظرًا لحقيقة أنه عند استخدام هذا الخيار ، يتم تعطيل التوافق مع تطبيقات OpenZFS الأخرى (على سبيل المثال: FreeBSD). والتوافق مع ويندوز وبالمناسبة ، أنا بحاجة إلى. علاوة على ذلك ، يمكن تمكين هذا الخيار في القسم الأخير ؛
- -m إرث - نقطة التحميل إلى أي مكان ، ولا حاجة لتركيب قسم الجذر ؛
- -R / mnt - بادئة تركيب القسم المؤقت لتثبيت النواة ؛
- -f - إنشاء مجموعة القوة. إذا تم جمع صفيف ZFS على الأقراص من قبل ، فلن يعمل أمر إنشاء ، كما تعلمون ، ربما ارتكبت خطأ وتريد مسح البيانات المهمة ؛
أشير عادةً إلى اسم صفيف قرص نظام الجذر كخزان ، رغم أنهم يفضلون في الوقت الحالي استخدام الاسم rpool (تجمع الجذر) في بيئة Linux. في ممارستي ، أستخدم تسمية المصفوفات هذه بشكل عام:
- خزان - مجموعة النظام الرئيسي.
- تخزين - مجموعة إضافية مع أقراص كبيرة لتخزين البيانات ؛
- ذاكرة التخزين المؤقت - مجموعة إضافية من أقراص SSD ، إذا لم يكن القسم الرئيسي عليها ؛
بشكل عام ، أوصي بشدة بتطوير ممارسة تسمية شيء لا يمكن الخلط فيه.
3. تركيب النظام
3.1. و 3.2. إنشاء نظام ملفات الجذر
جمعت على وجه التحديد الفقرات 3.1. و 3.2. لأنني أعتقد أن تحديد قسم الجذر في المستوى الثالث لا لزوم له على الإطلاق. هذا صحيح ، لعدة سنوات من العمل مع ZFS ، لم أكن بحاجة أبدًا إلى إجراء أي تلاعب مع قسم الجذر. علاوة على ذلك ، هناك صور يمكنك بها إنشاء نقاط تحكم. لذلك ، قسم الجذر الخاص بي هو الخزان / الجذر:
zfs create -o mountpoint=/ tank/root
في نفس الوقت ، يتم اكتشاف الخطأ الفادح الأول في التعليمات الأصلية ، وهي عدم وجود قسم تمهيد لصفيف الأقراص:
zpool set bootfs=tank/root tank
3.3. إنشاء أقسام إضافية
في هذا الجزء من التعليمات الأساسية ، يمكنك رمي كل شيء ونسيانه. من الواضح أن اللاعبين تجاوزوا الأمر بالسحق والخيارات ، ولهذا السبب ، كان عليّ إصلاح شيء ما. صحيح ، لم يساعد كثيرا. منذ ظهور المشاكل اللاحقة مرة أخرى وفي النهاية اتضح أن كل هذا لا يعمل ، لذلك ، في الفقرة 4.11. تم تصحيح هذا مرة أخرى.
يبدو فصل قسم منفصل عن / var / games ملحميًا تمامًا. أنا لا أمانع ، ولكن من الواضح أن هذا كثير للغاية.
حقيقة أن يتم إنشاء أقسام في ZFS ببساطة ودعم التسلسل الهرمي لا يعني أنه ينبغي التخلي عن الدلائل الكلاسيكية. مثال بسيط: ذات مرة كان لدي أكثر من 4K ZFS من أقسام مجموعة الخوادم ، كان ذلك ضروريًا ، ولكن تباطأ إعادة تشغيل الخادم لعدة دقائق بسبب تركيب هذه الأقسام.
لنبدأ مع لائحة نظيفة.
هناك أقسام ملف ثابت وديناميكي.
تتضمن أقسام الملفات الثابتة أقسامًا تحتوي على برامج وإعداداتها ، ويتم ملؤها مرة واحدة ولا تتغير أثناء التشغيل. في الوقت نفسه ، تم تقسيم الأقسام الثابتة السابقة إلى أقسام النظام والمستخدمين (/ usr) ، ولكن في الوقت الحالي يتم خلطها في أنظمة تشغيل Linux ولا يوجد أي معنى لفصلها ، ولن ينجح الأمر.
تشتمل أقسام الملفات الديناميكية على أقسام يتم تخزينها فيها:
- البيانات المؤقتة - مكافئ: tmp ، مبادلة ؛
- سجلات العمل - مكافئ: var / log؛
- بيانات المستخدم - مكافئ: home؛
- البيانات - مكافئ: var / db وكيف يحالفك الحظ ؛
- نتائج البرنامج الأخرى في شكل ملفات.
في عائلات Linux ، تتضمن الأقسام الديناميكية / tmp و / var ، لكن هذا غير دقيق ، نظرًا لأنها يمكن أن تدخل / var / lib ، البرامج والمكتبات ، بشكل عام ، كل شيء مختلط ، لكن مع ذلك ...
تحتاج أولاً إلى تحديد ما إذا كنت تريد إنشاء قسم / tmp على القرص أو في الذاكرة كـ tmpfs. إذا أنشأنا على القرص ، فقم بإنشاء قسم منفصل له:
zfs create -o mountpoint=legacy tank/tmp
خيارات com.sun: لقطة تلقائية = setuid false = لا تعمل بشكل جيد ، بغض النظر عن كيفية عمل الطقس ، لا تعقد. ولكن مع SWAP سنفعل لاحقًا في الخطوة 7.
افصل قسم var بشكل منفصل:
zfs create -o mountpoint=legacy tank/var
وأقسام المستخدم:
zfs create -o mountpoint=/home tank/home zfs create -o mountpoint=legacy tank/home/root
من المنطقي تخصيص أقسام المستخدم ، نظرًا لأنه من الناحية العملية يتم انسدادها بشكل دوري بمصنوعات مختلفة ولتسهيل مراقبتها ، من الأفضل إنشاء أقسام منفصلة لهم ، وكذلك الدليل الرئيسي لمستخدم الجذر (خاصة بالنسبة لأولئك الذين يحبون العمل كجذر). لا يساعد استخدام الحصص النسبية على دلائل المستخدم في انسداد مساحة القرص فحسب ، بل يساعد أيضًا على التداخل ، لأنه في مثل هذه الحالات ، يبدأ المستخدمون في ترك القطع الأثرية في أي مكان وقد يكون من الصعب جدًا العثور عليها لاحقًا. لا يتم معالجة هذا الأمر ، لذلك تحتاج فقط إلى التحكم وضرب الأيدي.
يتم إدراج دبابة نقطة التحميل / الصفحة الرئيسية / الجذر كإرث ، وليس كجذر /. هذا صحيح ، حيث يتم تركيب هذا القسم في القسم 4.11
نحن الآن بحاجة إلى تركيب أقسامنا الديناميكية مؤقتًا في / mnt:
cd /mnt/ mkdir var tmp root mount -t zfs tank/var /mnt/var/ mount -t zfs tank/tmp /mnt/tmp/ mount -t zfs tank/home/root /mnt/root/
3.4 تثبيت النواة
في الإرشادات الرئيسية ، يوجد أمران لا لزوم لهما ، ونحن لا نولي اهتمامًا ، ويبدو أنهما من التجارب:
debootstrap bionic /mnt
نتيجة لذلك ، يجب أن تحصل على شيء مثل هذا:
zfs list NAME USED AVAIL REFER MOUNTPOINT tank 213M 1.76T 96K legacy tank/home 208K 1.76T 96K /mnt/home tank/home/root 112K 1.76T 112K legacy tank/root 147M 1.76T 147M /mnt tank/tmp 96K 1.76T 96K legacy tank/var 64.6M 1.76T 64.6M legacy
حجم القسم 96K الفارغ ، على التوالي ، بقي فقط الخزان / tmp فارغًا ، وتم تسجيل الباقي أثناء تثبيت kernel ، مما يعني أنه تم تركيب الأقسام بشكل صحيح.
4. تكوين النظام
4.1. تكوين المضيفين واسم المضيف
echo HOSTNAME > /mnt/etc/hostname echo “127.0.0.1 localhost” > /mnt/etc/hosts echo “127.0.0.1 HOSTNAME” >> /mnt/etc/hosts
4.2. تكوين واجهة الشبكة
نعم ، لدينا بالفعل خطة هنا:
nano /mnt/etc/netplan/setup.yaml network: version: 2 renderer: networkd ethernets: eno2: dhcp4: no dhcp6: no addresses: [ {{ IP }}/{{ netmask }}, ] gateway4: {{ gateway IP }} nameservers: addresses: [8.8.8.8]
4.3. تكوين مستودعات ملائمة
nano /mnt/etc/apt/sources.list deb http://archive.ubuntu.com/ubuntu/ bionic main restricted universe deb http://security.ubuntu.com/ubuntu/ bionic-security main restricted universe deb http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe
src - ليست هناك حاجة في الغالب
4.4. نحن تركيب أقسام الملفات الافتراضية قرص حي و "الذهاب" إلى النظام الجديد
mount --rbind /dev /mnt/dev mount --rbind /proc /mnt/proc mount --rbind /sys /mnt/sys chroot /mnt /bin/bash --login
مطلوب لاستخدام - rbind ، ولكن ليس - ربط
نحن بالفعل في النظام الجديد ...
4.5. إعداد البيئة الأساسية
ln -s /proc/self/mounts /etc/mtab chmod 1777 /tmp apt update
اللغة والوقت:
dpkg-reconfigure locales * en_US.UTF-8 * ru_RU.UTF-8 dpkg-reconfigure tzdata
والمحررين الإضافيين الذين يحبون ما:
apt install --yes vim nano
4.6. تثبيت دعم ZFS
apt install --yes --no-install-recommends linux-image-generic apt install --yes zfs-initramfs
4.8. تثبيت محمل الإقلاع
كما ذكر سابقًا ، أستخدم MBR قديم:
apt install --yes grub-pc
أثناء تثبيت أداة تحميل التشغيل ، يجب تحديد كل الأقراص التي حددناها على أنها قابلة للتمهيد ، بينما يقسم المثبت على كافة الأقراص الأخرى باستثناء القرص الأول ، نحن نتفق وننفذ الخطوة 5 (ليس من الواضح سبب ترك الباقي في وقت لاحق):
4.8.1. (5.1) تحقق من التعرف على نظام الملفات الجذر:
grub-probe / zfs
4.8.2. (5.2) تحديث initrd
update-initramfs -u -k al
4.8.3. (5.3) تبسيط تصحيح اليرقة
vi /etc/default/grub ... GRUB_CMDLINE_LINUX_DEFAULT="" GRUB_CMDLINE_LINUX="console" ...
4.8.4. (5.4.) تحديث تكوين أداة تحميل التشغيل
update-grub
4.8.5. (5.5.) قم بتثبيت أداة تحميل التشغيل على كل قرص تم تمييزه على أنه قابل للتمهيد
grub-install /dev/sda grub-install /dev/sdb ...
من المهم أن تعمل هذه الأوامر بشكل صحيح. لكي أكون أمينًا ، لم أتمكن من الحصول على العكس مرة واحدة على الأقل ، لذلك لا أعرف ماذا أفعل ، ولكن على الأرجح ، إذا كان لديك خطأ ، فمن المحتمل أنك ارتكبت خطأً عند وضع علامة على القرص (القسم 2.2).
4.8.6. (5.6.) تحقق من تثبيت وحدة ZFS
ls /boot/grub/*/zfs.mod /boot/grub/i386-pc/zfs.mod
4.10. تعيين كلمة مرور الجذر (الثابت!)
passwd
ونعم ، سنقوم بتثبيت opensh على الفور ، وإلا فسنفاجأ بعد إعادة التشغيل إذا عملنا عن بُعد:
apt install --yes openssh-server
لا تنس تصحيح التكوين sshd:
vi /etc/ssh/sshd_config ... PermitRootLogin yes ... PasswordAuthentication yes ...
4.11. إصلاح أنظمة الملفات جبل
هنا وصلنا إلى الأكثر إثارة للاهتمام. في الحقيقة ، يتم تثبيت أقسام ZFS بعد بدء بعض الشياطين (كما أثرنا أيضًا على ZFS_INITRD_ADDITIONAL_DATASETS في / etc / default / zfs) ، والتي بدورها تقوم بإنشاء بعض البنية الخاصة بها / var تبدأ في ملء سجلات النظام. عندما يحين الوقت لتركيب أقسام ZFS ، اتضح أن نقاط التحميل ليست فارغة ولا شيء يتصاعد ، البيانات مبعثرة ، كل شيء سيء. لذلك ، تحتاج إلى تحديد نقاط التحميل في / etc / fstab لأن systemd يركز عليها بشكل أساسي عند الوصول إلى المجلد:
vi /etc/fstab tank/var /var zfs noatime,nodev 0 0 tank/tmp /tmp zfs noatime,nodev 0 0 tank/home/root /root zfs noatime,nodev 0 0
الباقي متروك للفقرة 6. فعلت بالفعل
6. إعادة التمهيد الأول
6.1. التقاط صورة للقسم الجذر
zfs snapshot tank/root@setup
لا يوجد أي معنى منه ، في الممارسة العملية لم أكن قد اهتزت قسم الجذر للنظام ولم أستخدم قط لقطات من هذا القسم ، لكن مع ذلك دعه يكذب ، فقد يكون مفيدًا
6.2. خروج chroot
exit
6.3. قم بإلغاء تثبيت أقسام قرص حي وتصدير مجموعة ZFS
cd mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -i{} umount -lf {} umount /mnt/root umount /mnt/var umount /mnt/tmp zpool export tank
تصدير مجموعة الأقراص المطلوبة لمسح ذاكرة التخزين المؤقت zfs
6.4 إعادة التشغيل
تتم إعادة التشغيل بشكل أفضل في محطة قرص حي ، حيث إذا كنت تعمل من خلال عميل ssh ، فإن إعادة التشغيل من خلاله يمكن أن يؤدي إلى "تجميد" الخادم.
reboot
ومع ذلك ، إذا حدث خطأ ما ولم يذهب الخادم إلى إعادة التشغيل ، فيمكنك إعادة التشغيل بأي طريقة ، حيث يتم تصدير صفيف ZFS ومن الصعب إتلافه.
6.5. نحن ننتظر إعادة التشغيل ونذهب إلى الجذر
6.6. إنشاء حساب المستخدم الخاص بك
zfs create tank/home/{{ LOGIN }} useradd -u {{ UID }} -G adm,sudo -d /home/{{ LOGIN }}/ -s /bin/bash {{ LOGIN }} cp -a /etc/skel/.[!.]* /home/{{ LOGIN }} chown -R {{ LOGIN }}:{{ LOGIN }} /home/{{ LOGIN }}
أضف مفتاح ssh العام إلى المستخدم واضبط كلمة المرور له:
su - {{ LOGIN }} mkdir .ssh chmod 0700 .ssh vi .ssh/authorized_keys exit passwd {{ LOGIN }}
في OpenSSH نزيل القدرة على تسجيل الدخول كمصادقة الجذر وكلمة المرور:
vi /etc/ssh/sshd_config ... PermitRootLogin no ... PubkeyAuthentication yes ... PasswordAuthentication no ... service ssh restart
6.7. 6.8. لم يعد مطلوبا
7. تكوين المبادلة
7.1. إنشاء قسم ZFS
zfs create \ -V 32G \ -b $(getconf PAGESIZE) \ -o compression=zle \ -o logbias=throughput \ -o sync=always \ -o primarycache=metadata \ -o secondarycache=none \ tank/swap
- -V 32G - حجم SWAP لدينا ، يمكنك تحديد ما هو مطلوب بالفعل ؛
- -b $ (getconf PAGESIZE) - حجم الكتلة (4K مع ashift = 12) ؛
- compression = zle - اختر خوارزمية الضغط الأقل من حيث استهلاك الموارد ، نظرًا لأن حجم الكتلة في الواقع 4 كيلو بايت ، فإن الضغط على هذا النحو لن يسمح باستخدام مدخلات المخرجات ، لكن سيكون من الممكن حفظها على كتل الصفر ؛
- logbias = سرعة - ضبط النطاق الترددي لتحسين العمليات المتزامنة ؛
- تزامن = دائما - دائما مزامنة السجل. هذا يقلل بشكل طفيف من الأداء ، لكنه يضمن تمامًا موثوقية البيانات ؛
- primarycache = بيانات التعريف - بيانات تعريف ذاكرة التخزين المؤقت فقط ، حيث لن يتم استخدام المبادلة لقراءة الكتلة نفسها عدة مرات ؛
- secondarycache = بلا - تعطيل ذاكرة التخزين المؤقت الثانوية تمامًا للأسباب المذكورة أعلاه ؛
7.2. قم بإعداد قسم المبادلة
mkswap -f /dev/zvol/tank/swap echo /dev/zvol/tank/swap none swap defaults 0 0 >> /etc/fstab echo RESUME=none > /etc/initramfs-tools/conf.d/resume
7.3. بدوره على المبادلة
swapon -av
علاوة على التعليمات ، هناك القليل من الاهتمام ، لأنه يعتمد بشدة على تفضيلات مسؤولين معينين ومهام الخادم ككل ، باستثناء نقطة واحدة ، وهي: "التمهيد في حالات الطوارئ"
ولا تنسى أن تضع جدار الحماية
ر التمهيد في حالات الطوارئ
نحن نستعد بيئة التثبيت (البند 1.)
ZFS , , :
zpool export -a zpool import -N -R /mnt tank zfs mount -a
, , , fstab, :
mount -t zfs tank/var /mnt/var/ mount -t zfs tank/tmp /mnt/tmp/ mount -t zfs tank/home/root /mnt/root/
, , chroot .4.4., . 6.3.
D.
3.3. . , : , /spool, /data. ZFS .
ملخص
- ZFS , , ;
- ZFS, , . ZFS — , ;
- .