Установка CentOS ZFS в UEFI



Вирішив на днях спробувати ZFS, а докладного і простого мануала як це здійснити на CentOS не знайшов, вирішив виправити ситуацію. До того ж хотілося встановити все це в режимі EFI. — не стояти на місці? І заодно зрозуміти для себе як працює DKMS, а так само аспекти ручної установки RPM-based дистрибутивів.

ZFS був обраний теж не випадково, так як на цій машині планувалося розгорнути гіпервізор і використовувати zvol для зберігання образів віртуальних машин. Мені хотілося чогось більшого ніж програмний рейд + lvm або просте файлування образів, щось на подобі ceph, але для одного хоста це занадто жирно. Забігаючи вперед скажу, що я залишився дуже задоволений цією файловою системою, її продуктивністю і всіма її фишками.

Підготовка
Для початку візьмемо LiveCD образ CentOS, наприклад хмари yandex, потрібен саме live а не netinstall або minimal, так як для установки нам потрібно повністю робоча система linux. Запишемо образ на болванку або флешку і згрузимся з неї. Вантажиться потрібно в efi режимі, інакше не вийде зберегти завантажувальну запис в efi.

Встановимо epel і zol репозиторії:

ням -y install epel-release
yum -y localinstall http://archive.zfsonlinux.org/epel/zfs-release.el7.noarch.rpm

Встановимо пакет з kernel headers:

ням -y install kernel-devel 

Далі провернем якийсь фінт вухами, без якого zfs просто не збереться на нашому LiveCD:

rm -f /lib/modules/$(uname -r)/build
ln -s /usr/src/kernels/$(uname -r) /lib/modules/$(uname -r)/build

Тепер можна встановлювати пакет zfs:

ням -y install zfs 

Після установки пакета перевіримо встановився модуль, і якщо все ок, то завантажимо його:

dkms autoinstall
modprobe zfs

Розмітка дисків
В моєму випадку є три диски по 2 тб кожен, я хочу їх розташувати таким чином, що б у підсумку на кожному виявилося по три розділу:

  1. efi ( fat16 / 100мб ) — тут будуть зберігатися файли конфігурації і сам завантажувач
  2. boot ( ext4 / 412мб ) — ці розділи з усіх трьох дисків ми смакота в програмний RAID1, тут будуть лежати ядра і мінімальні образи для завантаження системи.
  3. data ( zfs / все інше ) — на цих розділах з усіх трьох дисків ми створимо zpool з RAIDZ, в якому створимо потрібні нам розділи з точками монтування в /, /home, /var і т. д., і встановимо на них систему.
Приступаємо до розмітки:

parted /dev/sda
mklabel gpt
mkpart ESP fat16 1MiB 101MiB
set 1 boot on
mkpart boot 101MiB 513MiB
mkpart data 513MiB 100%

Поаторяем теж саме /dev/sdb і /dev/sdc. Створюємо файлову систему для efi-розділу:

mkfs.msdos -F 16 /dev/sd{a,b,c}1

FAT16 використовується не випадково, оскільки розмір мінімального розділу з FAT32 — 512мб, а це надто багато.

Ок, тепер разбреремся з нашим /boot, створимо програмний RAID з других розділів на наших дисках, і відразу ж файлову систему на ньому:

mdadm --create --verbose /dev/md0 --level=1 --metadata=0.90 --raid-devices=3 /dev/sda2 /dev/sdb2 /dev/sdc2
mkfs.ext4 /dev/md0 

Настав час створити наш zpool, для цієї операції рекомендується звертатися до дисків по ID, ось приклад як ця команда виглядала у мене:

zpool create -m none -o ashift=12 rpool raidz \
/dev/disk/by-id/ata-TOSHIBA_DT01ACA200_74FWM9LKS-part3 \
/dev/disk/by-id/ata-TOSHIBA_DT01ACA200_74FWMHDKS-part3 \
/dev/disk/by-id/ata-TOSHIBA_DT01ACA200_74FWR4VKS-part3

Вам тільки варто визначитися з параметром ashift. Для дисків, розмір блоку яких дорівнює 512b слід вказати параметр ashift=9, для 4k дисків ashift=12. Подивитися розмір блоку диска можна командою fdisk -l.

Тепер створимо потрібні нам розділи, в zfs це легко:

zfs create -o mountpoint=none rpool/ROOT
zfs create -o mountpoint=/ rpool/ROOT/centos-1
zfs create -o mountpoint=/home rpool/home
zfs create -o mountpoint=/var rpool/var

Готово, диски ми розмітили.

Встановлення системи
Встановлювати будемо вручну, так що приступимо. Монтуємо всі наші розділи в /mnt, зверніть увагу, що efi розділ ми монтуємо тільки для одного диска, з рештою розберемося пізніше:

zpool import -o altroot=/mnt rpool
mkdir -p /mnt/boot/efi
mount /dev/md0 /mnt/boot/
mount /dev/sda1 /mnt/boot/efi/

Тільки що ми підготували простір для нашої нової системи. Тепер иницилизируем і встановимо в неї основний репозиторій, а потім і саму систему з ядром:

rpm --root=/mnt --rebuilddb
curl -O http://mirror.yandex.ru/centos/7/os/x86_64/Packages/centos-release-7-1.1503.el7.centos.2.8.x86_64.rpm
rpm --root /mnt -ivh centos-release-*.rpm
yum -y --installroot=/mnt groupinstall base
yum -y --installroot=/mnt install kernel

Коли гостьова система встановиться, подключем в неї системні директорії хостової системи і виконуємо chroot:

mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt /bin/bash --login

Тепер приступимо до її налаштування. Запишемо DNS-сервер, краще локальний звичайно, що б запрацювало дозвіл імен:

echo 'nameserver 192.168.225.1' > /etc/resolv.conf

Знову встановимо epel і zol репозиторії:

ням -y install epel-release
yum -y localinstall --nogpgcheck http://archive.zfsonlinux.org/epel/zfs-release.el7.noarch.rpm

Та й сам zfs тепер повинен встановитися без танців з бубном:

ням -y install kernel-devel zfs 

Ок продложаем, встановимо часовий пояс:

rm -rf /etc/localtime
ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Хостнейм, пароль рута:

echo 'one' > /etc/hostname
echo "root:newpass" | chpasswd

Запишемо точки монтування в fstab. Розділи на zfs в fstab додавати в принципі не потрібно:

cat /proc/mounts | grep /boot >> /etc/fstab

Так само необхідно зберегти інформацію про наш рейд-масиві:

mkdir /etc/mdadm
mdadm --examine --scan >> /etc/mdadm/mdadm.conf

Готово, наша система встановлена і налаштована, тепер розберемося з завантажувачем.

Встановлення завантажувача
В принципі у випадку з efi можна було б обійтися і без завантажувача т. к. ядро linux вже досить давно підтримує EFISTUB (завантаження безпосередньо через efi без завантажувача), але це не наш випадок тому-що: по перше: efi розділ на якому має буде знаходиться наше ядро не можна об'єднати в програмний рейд а отже при кожному оновленні ядра доведеться копіювати цей розділ на інші диски, по друге: centos не дуже пристосований до такої завантаженні з коробки, рекомендується все ж використовувати GRUB2.

Встановимо GRUB2 для UEFI:

ням -y install grub2-efi

Що б grub2-install не лаявся на zfs-розділи нам потрібно скомпировать і встановити ще один пакет grub-zfs-fixer:

ням groupinstall "Development Tools"
curl https://codeload.github.com/Rudd-O/zfs-fedora-installer/tar.gz/master | tar xzv
cd zfs-fedora-installer-master/
tar cvzf grub-zfs-fixer.tar.gz grub-zfs-fixer/
rpmbuild -ta grub-zfs-fixer.tar.gz
yum localinstall ~/rpmbuild/RPMS/noarch/grub-zfs-fixer-0.0.3-1.noarch.rpm

Готово, тепер виконаємо установку GRUB2 і згенеруємо конфіг:

grub2-install
grub2-mkconfig -o /boot/grub/grub.cfg

GRUB2 повинен був створити запис у вашому efi, перевіримо:

efibootmgr -v

Скопіюємо наш efi-розділ на інші диски:

dd if=/dev/sda1 of=/dev/sdb1 bs=4M
dd if=/dev/sda1 of=/dev/sdc1 bs=4M


Тепер залишилося лише додати модуль zfs в initramfs, для цього зробимо:

ням -y install zfs-dracut
dracut -f /boot/initramfs-3.10.0-229.14.1.el7.x86_64.img 3.10.0-229.14.1.el7.x86_64

Зверніть увагу, тут в якості першого аргументу передається шлях до initramfs а в якості другого версія ядра. Якщо другий параметр не поставити, то образ сгенерируется для текщего запущеного ядра, а так як ми працюємо в chroot, його версія буде явно менше ніж встановлена в гостьовій системі.

На цьому все. Виходимо з chroot, отмонтовуємо /mnt. І перезавантажуємося в нашу свіжовстановленому систему.

exit
umount -R /mnt
reboot

Джерела:
HOWTO Ubuntu install to a Native ZFS Root Filesystem
HOWTO install Debian GNU Linux to a Native ZFS Root Filesystem
тема на Google Groups
тема на Hardforum

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.