Загрузка Linux по сети Kubuntu 7.10

 

     
 
 

Загрузка Linux ( Kubuntu 7.10 ) по сети.


Возникла необходимость загрузки линуксовых тонких клиентов по сети, используя PXE в обучающих классах. Выбор линукса в силу некоторых причин пал на Kubuntu 7.10, а загружаться они у нас должны с сервера FreeBSD. Линуксы должны грузиться в read only, для того чтобы пользователи не могли испортить систему, что несколько усложняет ситуацию.

Итак, с чего начнем... Начнём с установки Kubuntu на жеский диск обычного компьютера. Эта процедура крайне несложная и расписывать её смысла нет никакого. По умолчанию, система ставится целиком в /, то есть диск на партиции не разбивается и вся структура каталогов находится в корне, что в принципе, нас устраивает. Единственное, что можно сделать при такой установке отключить swap раздел, так как использовать мы его все равно не будем. И еще для установки системы не стоит выделять более 3-4 Гб места на жестком диске, если мы хотим скопировать образ диска целиком. Если же планируется копировать файлы установленной системы, тогда размер раздела не принципиален.

Теперь пора разобраться как у нас будет загружаться система по сети.
1. Компьютер (клиент) стартует и, если сетевая карта поддерживает PXE, отправляется DHCPREQUEST на DHCP-сервер.
2. DHCP-сервер определяет клиента по MAC-адресу и выдает ему ip-адрес и указание (filename) откуда брать загрузчик линукса (pxelinux.0).
3. Клиент получает указание filename и пытается скачать его используя протокол TFTP
4. Скачав загрузчик, клиент может скачать ядро (vmlinuz) и структуру системы (initrd)  из той же директории, что и загрузчик. используя тот же TFTP.
5. После того как vmlinuz и initrd скачаны и запущены, остальная часть системы монтируется по NFS.
В результате мы имеем рабочую систему, работающую с NFS разделом как с собственным жестким диском.

Итак система у нас установлена.
Теперь необходимо её настроить. Собственно здесь мы можем убрать ненужные рюшечки, для ускорения загрузки  и работы системы, удалить ненужные пакеты и добавить нужные (например Firefox + flash), сделать автологин в KDE, записать MAC-адрес. Самое главное - это установить пакеты portmap и nfs-common для работы с шарами nfs. В нашем случае это делается командой из консоли sudo apt-get install portmap nfs-common После того как мы настроили систему под себя пора скопировать её образ.

Смотрим вывод команды mount:


user@diskless:~$ mount
/dev/sda1 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nodev)
/sys on /sys type sysfs (rw,noexec,nodev)
-----------------------------------------------
***********************************************
-----------------------------------------------


в нашем конкретном случае Kubuntu встала целиком на раздел /dev/sda1 его и будем копировать.

Загружаемся с LiveCD можно того же Kubuntu и, не монтируя /dev/sda1, начинаем копировать весь раздел на... собственно куда нам надо.
Можно скопировать на другой раздел:


ubuntu@livecd# sudo cp /dev/sda1 /mnt/newhdd/obraz_kubuntu.image


а можно и сразу на наш сервер через ssh


ubuntu@livecd# sudo scp /dev/sda1 admin@server:obraz_kubuntu.image



Если наш раздел составляет 3-4 Гб, то по локальной сети образ перепишется минут за 5-10, что очень даже недолго.

Так... переписали. Пробуем смонтировать:


root@server# mdconfig -a -t vnode -f /home/admin/obraz_kubuntu.image -u 9
md9
root@server# mount_ext2fs /dev/md9 /share/kubuntu/
root@server# ls -la /share/kubuntu/
total 102
drwxr-xr-x   22 root  wheel   4096 Apr 15 12:44 .
drwxrwxr-x    5 root  wheel    512 Apr  9 19:32 ..
drwxr-xr-x    2 root  wheel   4096 Apr 10 13:11 bin
drwxr-xr-x    3 root  wheel   4096 Apr  8 13:01 boot
lrwxrwxrwx    1 root  wheel     11 Apr  8 12:27 cdrom -> media/cdrom
drwxr-xr-x    4 root  wheel   4096 Oct 16 22:11 dev
drwxr-xr-x  107 root  wheel   4096 Apr 14 20:33 etc
drwxr-xr-x    3 root  wheel   4096 Apr 14 20:28 home
drwxr-xr-x    2 root  wheel   4096 Oct 16 22:04 initrd
lrwxrwxrwx    1 root  wheel     33 Apr  8 13:01 initrd.img -> boot/initrd.img-2.6.22-14-generic
drwxr-xr-x   17 root  wheel   8192 Apr  9 12:21 lib
drwx------    2 root  wheel  16384 Apr  8 12:27 lost+found
drwxr-xr-x    3 root  wheel   4096 Apr  8 14:06 media
drwxr-xr-x    2 root  wheel   4096 Oct  8  2007 mnt
drwxr-xr-x    2 root  wheel   4096 Oct 16 22:04 opt
drwxr-xr-x    2 root  wheel   4096 Oct  8  2007 proc
drwxr-xr-x    7 root  wheel   4096 Apr 14 14:42 root
drwxr-xr-x    2 root  wheel   4096 Apr  9 14:05 sbin
drwxr-xr-x    2 root  wheel   4096 Oct 16 22:04 srv
drwxr-xr-x    2 root  wheel   4096 Oct  4  2007 sys
drwxrwxrwt    2 root  wheel   4096 Apr  9 05:53 tmp
drwxr-xr-x   12 root  wheel   4096 Apr 14 15:00 usr
drwxr-xr-x    4 root  wheel   4096 Apr 10 17:45 var
drwxr-xr-x   14 root  wheel   4096 Apr 10 15:38 var2
lrwxrwxrwx    1 root  wheel     30 Apr  8 13:01 vmlinuz -> boot/vmlinuz-2.6.22-14-generic



Что ж прекрасно, имеем рабочую систему. Надо слегка её подредактировать.
Во первых, местный fstab


root@localhost# cat /share/kubuntu/etc/fstab
# /etc/fstab: static file system information.
#
#               
proc            /proc           proc    defaults        0       0
/dev/nfs        /               nfs     defaults        1       1
#none           /tmp            tmpfs   defaults        0       0
#none           /var/run        tmpfs   defaults        0       0
#none           /var/lock       tmpfs   defaults        0       0
#none           /var/tmp        tmpfs   defaults        0       0


Самое главное для нас здесь - указание /dev/nfs.

Во вторых, необходимо внести изменение в /share/kubuntu/etc/initramfs-tools/initramfs.conf
BOOT=nfs

В третьих, для отключения swap правим /share/kubuntu/etc/sysctl.conf вставляем туда строчку
vm.swappiness = 0

В четвертых, можно подредактировать /share/kubuntu/etc/X11/xorg.conf и установить драйвер vesa, для корректной работы с разными видеокартами.


Для загрузки в read only этих настроек недостаточно, зато этого хватит для загрузки в read/write и тестирования имеющейся системы, а так же подшлифовки напильником, если что не так.

Теперь настраиваем наш FreeBSD сервер
1. Редактируем настройки DHCP. Файл /usr/local/etc/dhcpd.conf, надо добавить следующее


#diskless configuration
filename "pxelinux.0";
option root-path "192.168.0.1:/share/kubuntu";



Перезапускаем демон командой /usr/local/etc/rc.d/isc-dhcpd.sh restart

2. Настраиваем первичную загрузку по TFTP.
Проверяем /etc/rc.conf опция inetd_enable="YES" должна присутсвовать.
Редактируем /etc/inetd.conf раскоментируем строчку:

tftp    dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s /tftpboot


Которая, будет запускать демон tftpd и расшаривать директорию /tftpboot на сервере.
Перезапускаем inetd командой /etc/rc.d/inetd restart

3. Кладём в эту директорию
а) загрузчик линукса по PXE файл pxelinux.0 из комплекта syslinux,
домашняя страница здесь,
скачать можно с kernel.org здесь.
б) копируем в эту директорию ядро линукса

root@server# cp /share/kubuntu/boot/vmlinuz-2.6.22-14-generic /tftpboot/vmlinux-kubuntu
root@server# cp /share/kubuntu/boot/initrd.img-2.6.22-14-generic /tftpboot/initrd-kubuntu


в) Создаём директорию(!) /tftpboot/pxelinux.cfg и кладём туда файл default со следующим содержимым:

LABEL linux              
KERNEL vmlinuz-kubuntu                      
APPEND root=/dev/nfs initrd=initrd-kubuntu nfsroot=SERVER:/share/kubuntu ip=dhcp ro


где nfsroot=SERVER:/share/kubuntu - это NFS шара на машине SERVER (можно просто ip-адрес указать вместо имени)

4. создаём NFS шару для продолжения загрузки
а) проверяем /etc/rc.conf, строка nfs_server_enable="YES" должна присутствовать
б) Редактируем файл /etc/exports

/share/kubuntu    -maproot=0     -network 192.168.0.0 -mask 255.255.255.0


в) Перезапускаем mountd командой killall -HUP mountd

Пробуем запустить тонкого клиента, если все правильно было сделано, он загрузится. Но загрузится он с правами read/write. Теперь переходим к самому интересному, а именно построению клиента, который может работать полностью в read only режиме.

Не смотря на специфичность нашего дистрибутива, наверняка найдутся общие моменты и для других Linux систем. Конкретно с Kubuntu невозможно полностью загрузить систему в read only. Необходимы права на запись в разделы /var (самые важные /var/run, /var/log, /var/lock), /tmp и в домашнюю директорию пользователя (предположим /home/user) от которого стартует KDE.
Вероятным решением этой проблемы является создание в оперативной памяти разделов и монтирование их в указанные директории. По умолчанию, ramdisk-и создаются при запуске initrd. В нашем случае по умолчанию все рамдиски равны 64 Mb, что нас очень даже устраивает. Поменять размер рамдиска можно добавив в файл /tftpboot/pxelinux.cfg/default в строку APPEND параметр ramdisk_size=16000, получатся рамдиски по 16Mb. Но, повторюсь, нас устроят как раз рамдиски на 64 Mb.

Использовать мы будем два рамдиска, первый под раздел /tmp, второй для /var и /home/user
Если с /tmp всё более-менее понятно, так как он и должен стартовать пустым, то что делать с /var и /home не свосем ясно. Не долго думая, было принято решение держать эти директории в другом месте, а при старте системы копировать их содержимое в рамдиск. Вообще не совсем понятно что в /var делает директория lib причем, весьма немаленькая. Убираем её на /usr а в /var делаем на неё симлинк.

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

root@server# cd /share/kubuntu
root@server# mv var/lib usr/local/varlib
root@server# cp -rp var usr/local
root@server# ln -s /usr/local/varlib var/lib
root@server# cp -rp home/user usr/local/var
root@server# rm -rf home/user
root@server# ln -s /var/user home/user


Таким образом, мы скопировали интересующие нас эталонные директории в usr/local линукс системы. Домашняя диретория пользователя будет храниться в /var на линуксовом рамдиске, а в директории /home будет присутсвовать симлинк на /var/user.
Теперь создадим скрипт в /share/kubuntu/etc/rcS.d/S00diskless, который будет подготовливать систему к загрузке в read only:

root@server# cat /share/kubuntu/etc/rcS.d/S00diskless
#!/bin/sh
#script for mounting diskless workstations
/sbin/mke2fs -q -m 0 /dev/ram0
/sbin/mke2fs -q -m 0 /dev/ram1

/bin/mount /dev/ram0 /var
/bin/mount /dev/ram1 /tmp

/bin/chown root:root /var
/bin/chmod 0755 /var
# Необходимо для корерктной загрузки системы
/bin/mkdir /var/tmp && chmod 4777 /var/tmp
/bin/mkdir /var/lock
/bin/mkdir /var/run
/bin/mkdir /var/log

/bin/chown root:root /tmp
/bin/chmod 0777 /tmp

/bin/cp -a /usr/local/var/* /var/



Решение несколько грубоватое, но ничего лучше в голову не пришло. Вроде работает и не жужжит, так что оставил как есть

Последнее изменение: Tue Sep 30 10:46:38 2008

Автор: Dark

источник http://www.ounix.ru/index.php?page=article&id=28

Яндекс.Метрика