Приветствую, друзья!
Сегодня я вам не буду рассказывать, почему я люблю Arch Linux, вы сами всё увидите.
— установить Arch Linux таким образом, чтобы корневой раздел монтировался по сети с Samba-сервера
Для решения этой задачи нам понадобится:
— установленный Arch Linux (или LiveCD)
— mkinitcpio-mount-hook из AUR (http://aur.archlinux.org/packages.php?ID=40372)
— ещё пара небольших hook-ов: mount.cifs и mount.loop
— extra/devtools (содержит mkarchroot)
— core/mkinitcpio-nfs-utils (в этом пакете находятся утилиты и скрипты для получения IP адреса)
— собирающий скрипт
1. И начну я с последнего.
build.sh
Первой командой мы создаём chroot окружение и устанавливаем в него пакеты из группы base, mkinitcpio-nfs-utils и сюда же можно добавить любые другие пакеты по желанию. Вторая команда добавляют поддержку cifs и loop-устройств в initrcpio. Третья команда расширяет возможности монтирования корневого раздела. Четвертая отключает поддержку физических жёстких дисков из initcpio и подключает наши hook-и для cifs, loop и расширенного mount. Пятая команда отключает fallback образ initcpio, он нам не нужен, т.к. мы не используем автоопределение при сборке. Шестая команда настраивает новую систему таким образом, чтобы сеть, при завершении работы, не отключалась раньше времени. И последняя команда заново собирает initcpio, уже с поддержкой сети, cifs, loop, расширенного монтирования и без поддержи локальных жёстких дисков.
2. Cледующие два файла включают в initcpio модули необходимые для работы cifs (samba) и loop (монтирование образа диска).
mount.cifs
mount.loop
Этого уже достаточно для того, чтобы собрать chroot и initcpio, но нам необходимо chroot поместить в дисковый образ. Это нужно для того, чтобы не ломать голову над поддержкой acl, symlinks и hardlinks на Samba-сервере. Плюс дискового образа ещё и в том, что в качестве сервера мы сможем использовать не только Linux, но и Windows.
3. Создадим файл размером 1Gb, отформатируем его, например, под ext4 и примонтируем в /tmp/chroot:
4. Вот теперь уже можно запускать build.sh. После того как скрипт отработает мы должны скопировать файлы /tmp/chroot/boot/vmlinuz26 и /tmp/chroot/boot/kernel26.img (они нам ещё пригодятся) и отмонтировать образ.
5. И это всё? Да, это всё. Ну почти всё. Теперь осталось узнать как нам всё это загружать. Для этого нужно:
1) взять наш /tmp/arch.img и поместить на какой-нибудь Samba-сервер;
2) определиться со способом загрузки (CD-ROM, PXE, Grub или любой другой, какой сами придумаете);
3) скопировать /tmp/chroot/boot/vmlinuz26 и /tmp/chroot/boot/kernel26.img туда, откуда будете грузиться.
Параметры загрузки:
Примечание: обратите внимание на параметр для username=guest. Если вы не хотите, чтобы директория была доступна всем, то вместо username=guest можно указать конкретную учётную запись и пароль.
Мы получили систему которая загружается следующим образом:
1) локально запускается vmlinuz26 с kernel26.img (эти файлы могут быть на жётском диске, на CD, на tftp сервере);
2) монтируется сетевая директория //SERVER_IP/share в директорию /cifs;
3) монтируется /cifs/arch.img как корневой раздел и продолжается загрузка системы.
Примерно таким же способом можно разместить образ на nfs. Эксперимент так же проводился и с aufs, когда файл образа монтируется только для чтения, а изменения пишутся в tmpfs, но, к сожалению, в текущем ядре исключена поддержка aufs.
Сегодня я вам не буду рассказывать, почему я люблю Arch Linux, вы сами всё увидите.
Задача
— установить Arch Linux таким образом, чтобы корневой раздел монтировался по сети с Samba-сервера
Решение
Для решения этой задачи нам понадобится:
— установленный Arch Linux (или LiveCD)
— mkinitcpio-mount-hook из AUR (http://aur.archlinux.org/packages.php?ID=40372)
— ещё пара небольших hook-ов: mount.cifs и mount.loop
— extra/devtools (содержит mkarchroot)
— core/mkinitcpio-nfs-utils (в этом пакете находятся утилиты и скрипты для получения IP адреса)
— собирающий скрипт
1. И начну я с последнего.
build.sh
#!/bin/bash -e
chroot_path=/tmp/chroot
# Install base and some needed packages
mkarchroot -f $chroot_path base mkinitcpio-nfs-utils
# This adds cifs and loop modules to the initcpio image
cp mount.cifs mount.loop -t $chroot_path/lib/initcpio/install
# Add mount hook (http://aur.archlinux.org/packages.php?ID=40372)
wget "http://people.oh14.de/andrej/mkinitcpio-mount-hook/mkinitcpio-mount-hook-0.3-stickbuild.tar.xz" -O - | tar -xJ --wildcards -C /tmp mkinitcpio-mount-hook-0.3/initcpio/*/mount
cp -r /tmp/mkinitcpio-mount-hook-0.3/initcpio/* -t $chroot_path/lib/initcpio
# Remove hard drives support and keep only needed hooks (added: net, mount, mount.cifs, mount.loop)
sudo sed -i 's/^HOOKS=".*"/HOOKS="base udev net filesystems mount mount.cifs mount.loop"/' $chroot_path/etc/mkinitcpio.conf
# Keep only one initcpio image (we don't need fallback)
sed -i "s/^PRESETS=.*/PRESETS=('default')/" $chroot_path/etc/mkinitcpio.d/kernel26.preset
# Adapt network configuration for network-based root
sed -i 's/^DHCPCD_ARGS="-q"$/DHCPCD_ARGS="-q -p"/' $chroot_path/etc/conf.d/dhcpcd
sed -i 's/^interface=$/interface=eth0/' $chroot_path/etc/rc.conf
sed -i 's/^NETWORK_PERSIST="no"$/NETWORK_PERSIST="yes"/' $chroot_path/etc/rc.conf
# Rebuild initcpio image
mkarchroot -r "mkinitcpio -p kernel26" $chroot_path
Первой командой мы создаём chroot окружение и устанавливаем в него пакеты из группы base, mkinitcpio-nfs-utils и сюда же можно добавить любые другие пакеты по желанию. Вторая команда добавляют поддержку cifs и loop-устройств в initrcpio. Третья команда расширяет возможности монтирования корневого раздела. Четвертая отключает поддержку физических жёстких дисков из initcpio и подключает наши hook-и для cifs, loop и расширенного mount. Пятая команда отключает fallback образ initcpio, он нам не нужен, т.к. мы не используем автоопределение при сборке. Шестая команда настраивает новую систему таким образом, чтобы сеть, при завершении работы, не отключалась раньше времени. И последняя команда заново собирает initcpio, уже с поддержкой сети, cifs, loop, расширенного монтирования и без поддержи локальных жёстких дисков.
2. Cледующие два файла включают в initcpio модули необходимые для работы cifs (samba) и loop (монтирование образа диска).
mount.cifs
# vim:set ft=sh:
install ()
{
MODULES="cifs hmac md4 md5"
BINARIES=""
FILES=""
SCRIPT=""
}
help ()
{
cat <<HELPEOF
This hook helps to mount cifs.
HELPEOF
}
mount.loop
# vim:set ft=sh:
install ()
{
MODULES="loop"
BINARIES=""
FILES=""
SCRIPT=""
}
help ()
{
cat <<HELPEOF
This hook helps to mount loop images.
HELPEOF
}
Этого уже достаточно для того, чтобы собрать chroot и initcpio, но нам необходимо chroot поместить в дисковый образ. Это нужно для того, чтобы не ломать голову над поддержкой acl, symlinks и hardlinks на Samba-сервере. Плюс дискового образа ещё и в том, что в качестве сервера мы сможем использовать не только Linux, но и Windows.
3. Создадим файл размером 1Gb, отформатируем его, например, под ext4 и примонтируем в /tmp/chroot:
#!/bin/bash -e
dd if=/dev/null of=/tmp/arch.img bs=1M seek=1024
mkfs.ext4 -F /tmp/arch.img
mkdir /tmp/chroot
mount /tmp/arch.img /tmp/chroot
4. Вот теперь уже можно запускать build.sh. После того как скрипт отработает мы должны скопировать файлы /tmp/chroot/boot/vmlinuz26 и /tmp/chroot/boot/kernel26.img (они нам ещё пригодятся) и отмонтировать образ.
#!/bin/bash -e
cp /tmp/chroot/boot/{vmlinuz26,kernel26.img} /tmp
umount /tmp/arch.img
5. И это всё? Да, это всё. Ну почти всё. Теперь осталось узнать как нам всё это загружать. Для этого нужно:
1) взять наш /tmp/arch.img и поместить на какой-нибудь Samba-сервер;
2) определиться со способом загрузки (CD-ROM, PXE, Grub или любой другой, какой сами придумаете);
3) скопировать /tmp/chroot/boot/vmlinuz26 и /tmp/chroot/boot/kernel26.img туда, откуда будете грузиться.
Параметры загрузки:
# grub
kernel /boot/vmlinuz26 ip=::::::dhcp mounts=cifs,root cifs_dev=//SERVER_IP/share cifs_target=/cifs cifs_type=cifs cifs_opts=username=guest root_dev=/cifs/arch.img root_type=ext4
initrd /boot/kernel26.img
# isolinux/pxelinux
kernel vmlinuz26
append initrd=kernel26.img ip=::::::dhcp mounts=cifs,root cifs_dev=//SERVER_IP/share cifs_target=/cifs cifs_type=cifs cifs_opts=username=guest root_dev=/cifs/arch.img root_type=ext4
Примечание: обратите внимание на параметр для username=guest. Если вы не хотите, чтобы директория была доступна всем, то вместо username=guest можно указать конкретную учётную запись и пароль.
Результат
Мы получили систему которая загружается следующим образом:
1) локально запускается vmlinuz26 с kernel26.img (эти файлы могут быть на жётском диске, на CD, на tftp сервере);
2) монтируется сетевая директория //SERVER_IP/share в директорию /cifs;
3) монтируется /cifs/arch.img как корневой раздел и продолжается загрузка системы.
Примерно таким же способом можно разместить образ на nfs. Эксперимент так же проводился и с aufs, когда файл образа монтируется только для чтения, а изменения пишутся в tmpfs, но, к сожалению, в текущем ядре исключена поддержка aufs.