wzooff 13.08.2012 16:21

How-to`sНастройка бездисковых клиентов

Выдалось тут мне настраивать загрузку клиентов через сеть :) дай, думаю, напишу как делал и заодно укреплю в голове процесс. На просторах можно много почитать про реализацию отдельных частей, но статей с описанием от А до Я не очень много находить я. А что находить - копипастил и переделывал под себя.

Буду рассматривать конкретную реализацию, может с небольшими отступлениями на лирику. Если думаете, что статья не полная - пишите, будем дополнять вместе. Но всё таки для подробных мануалов есть опеннет и тд, а я хотел бы как можно короче и чтоб работало в результате.

ltsp не подходит, тк не вижу смысла перенос вычислительных мощностей на один сервер, когда клиенты вполне могут справляться с заданными задачами.

Итак, что надо получить на выходе?


Поехали!

Установка системы для клиентов


За основу взял вот этот мануал.
Создаем папочки для нашей системы
1
2
3
mkdir /diskless
mkdir /diskless/root
mkdir /diskless/home


Скрипт установки:
 1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
ARCH=i386
OS=debian
DISTRO=wheezy
TARGET=/diskless/root

debootstrap --include=sudo,nano,wget --arch $ARCH $DISTRO $TARGET http://mirror.yandex.ru/$OS/

## строчки ниже трогать не нужно, они монтируют системные директории в новый /
mount -o bind /dev $TARGET/dev
mount -o bind /sys $TARGET/sys



Редактируем /etc/apt/sources.list и fstab нашей будущей системы. Мои получились такими
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wzooff@wzooff-lnx:~$ cat /diskless/root/etc/apt/sources.list
deb http://mirror.yandex.ru/debian wheezy main
wzooff@wzooff-lnx:~$ cat /diskless/root/etc/fstab
# fstab for diskless default
#--------------------------------------------------------------------------
# Device Mountpoint FStype Options Dump Pass#
#--------------------------------------------------------------------------
/dev/nfs / nfs ro 0 0
proc /proc proc defaults 0 0
none /etc aufs br:/mnt/tmp/etc=rw:/etc=ro,noxino 0 0
none /root aufs br:/mnt/tmp/root=rw:/root=ro,noxino 0 0
tmpfs /tmp tmpfs defaults,noatime,mode=1777
none /var aufs br:/mnt/tmp/var=rw:/var=ro,noxino 0 0
tmpfs /var/tmp tmpfs defaults,noatime,mode=1777
tmpfs /var/run tmpfs defaults,noatime,mode=1777

192.168.0.1:/diskless/home /home nfs defaults,noatime 0 0


Данный fstab будет играть роль только при загрузке с тонкого клиента. Нужные нам фс мы смонтировали скриптом и смонтируем из chroot. Делаем скрипт для установки и конфигурации в chroot
Содержимое скрипта:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash

## обновление индекса репозитария
apt-get update

## настройка часовых поясов
dpkg-reconfigure tzdata

## монтирование файловых систем
mount -t proc /proc /proc
mount -a

## русский язык в консоли, русская локаль
## при настройке console-cyrillic лучше выбрать, как шрифт, UniCyr, а на последний вопрос ответить «Да»

apt-get -y install locales console-cyrillic
dpkg-reconfigure locales
dpkg-reconfigure console-cyrillic

## установка hostname, обязательный шаг
HOST='mysuperpc'

echo "$HOST" > /etc/hostname
echo -e "\n127.0.0.1 localhost $HOST" >> /etc/hosts

## добавление пользователя, добавление его в sudo
USER='mynotsuperuser'

echo 'Добавление пользователя'

adduser $USER
usermod -a -G sudo $USER

## установка пароля root

echo 'Установка пароля root'
passwd
apt-get -y install linux-base
apt-get -y install firmware-linux firmware-ralink firmware-realtek
apt-get -y install pulseaudio
apt-get install xorg xfce4 smbnetfs language-pack-ru gvfs-backends mc rar unrar ssh freerdp-x11 xsane hplip libreoffice-writer libreoffice-calc libreoffice-gtk libreoffice-l10n-ru epdfview geeqie pinta thunar-archive-plugin squeeze xfce4-xkb-plugin xfce4-datetime-plugin nfs-common aufs-tools chromium slim


Создаем и кладем в корень нашей будущей системы
1
2
3
4
mcedit /diskless/root/script.sh
chmod +x /diskless/root/script.sh
chroot /diskless/root
./script.sh


В дальнейшем содержимое /etc/hostname надо будет удалить, тк у меня тогда не резолвились хостнеймы от dhcp сервера, а наличие разных хостнеймов требуется для доступа к виндовым шарам

Находясь в chroot делаем следующее:
1
apt-get install linux-image-3.2.0-3-686-pae linux-headers-3.2.0-3-686-pae


Почему не скриптом? Потому что я не знаю как определить текущие доступные версии ядра :)

aufs


Помните мой хитрый fstab? Так вот... Рут у нас же монтируется в режиме только чтения, но юзер во время сеанса должен же где то хранить конфиги и временные файлы? Вот мы и сделаем такую штуку:
1
mcedit /diskless/root/sbin/stateless.sh


а в скрипт закинем
 1
2
3
4
5
6
7
8
9
10
#!/bin/sh

mkdir -p /mnt/tmp
mount -t tmpfs /dev/shm /mnt/tmp
mkdir -p /mnt/tmp/etc
mkdir -p /mnt/tmp/var
mkdir -p /mnt/tmp/tmp
mkdir -p /mnt/tmp/root
echo "stateless.sh finished"
exec /sbin/init



Теперь делаем его исполняемым
1
chmod +x /diskless/root/sbin/stateless.sh


В дальнейшем мы этот скрип укажем в параметрах загрузки PXE

Инфу нашел тут

Настройка PXE загрузчика


Можно почитать тут(wiki) и тут(habr). Делал почти все по последней ссылке. Вот кстати еще пост на welinux по настройке загрузки по сети.

Создаем папочку, в которую положим наш загрузчик
1
2
3
mkdir /home/share/tftpboot
chmod -R 777 /home/share/tftpboot
chown -R nobody /home/share/tftpboot


В этой папке будут лежать следующие файлы:
vmlinuz
initrd.img
pxelinux.0

и еще две папки - boot и pxelinux.cfg
В первую мы положим vesamenu.c32 чтобы можно было рисовать няшные меню, а во вторую конфиг нашего загрузчика - текстовый файл default

Вот вам архив с моим конфигом без initrd и vmlinuz.
Содержимое конфига
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
default /boot/vesamenu.c32
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color disabled 0 #ffffffff #00000000
menu color timeout_msg 0 #ffffffff #00000000
menu color timeout 0 #ffffffff #00000000
menu background #1F45A5

menu title Network Boot Menu


prompt 0
timeout 1200

LABEL Debian Workplace
KERNEL vmlinuz
APPEND root=/dev/nfs initrd=initrd.img nfsroot=192.168.0.1:/diskless/root ip=dhcp init=/sbin/stateless.sh

## можно еще дописать пару пунктов по подобию, а чтобы выбрать дефолтный
## следует указать в параметрах "menu default"
## тогда будет подсвечена строка с этим параметром


DHCP + шлюз



Устанавливаем вторую сетевую карту и назначаем ей ip 192.168.0.1

Ставим необходимые пакеты
1
aptitude install isc-dhcp-server dnsmasq


Правим /etc/default/isc-dhcp-server чтобы dhcp работал именно на нужном нам интерфейсе
1
INTERFACES="eth1"


Правим /etc/dhcp/dhcpd.conf
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
default-lease-time 600;
max-lease-time 7200;

#Сервер в сети основной
authoritative;

option domain-name "wzooffsdomain.com";
option domain-name-servers 192.168.0.1,10.10.10.10;
option routers 192.168.0.1;

#Получать хостнеймы от дхцп сервера
use-host-decl-names on;
get-lease-hostnames true;

subnet 192.168.0.0 netmask 255.255.0.0 {
#диапазон выдаваемых ip
range 192.168.0.10 192.168.0.99;
option subnet-mask 255.255.0.0;
option broadcast-address 192.168.0.255;
#наш tftp сервер файл загрузчика
next-server 192.168.0.1;
filename "pxelinux.0";
#Путь до root, это для всех, но можно указать другой уже в pxe-конфиге
option root-path "192.168.0.1:/diskless/root";

#указываем вручную хосты и айпи для наших машинок
host pc01 {hardware ethernet 00:11:22:33:44:55;fixed-address 192.168.0.2;}
host pc02 {hardware ethernet 00:11:22:33:44:56;fixed-address 192.168.0.3;}
host pc03 {hardware ethernet 00:11:22:33:44:57;fixed-address 192.168.0.4;}
host pc04 {hardware ethernet 00:11:22:33:44:58;fixed-address 192.168.0.5;}
}


Правим /etc/rc.local
1
2
3
iptables -A FORWARD -i eth0 -o eth1 -s 192.168.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -j MASQUERADE


Раскомментируем в /etc/sysctl.conf строку
1
net.ipv4.ip_forward=1


Выполняем для применения изменений без перезагрузки
1
sudo sysctl -w net.ipv4.ip_forward=1


TFTP


Ставим пакеты
1
apt-get install xinetd atftpd tftp


Правим /etc/xinetd.d/tftp на свой вкус.
 1
2
3
4
5
6
7
8
9
10
11
service tftp
{
protocol = udp
port = 69
socket_type = dgram
wait = yes
user = nobody
server = /usr/sbin/in.tftpd
server_args = /home/share/tftpboot <-- папочка нашего сервера
disable = no
}


Правим /etc/default/atftpd, чтобы было так
1
USE_INETD=false


тк по дефолту atftpd запускается через initd, а нам нужен xinitd

Стартуем наш сервер
1
/etc/init.d/xinetd restart


Вернее рестартуем xinitd, который заодно и dhcp сервер перезагрузит

Проверяем что порт tftp-сервера прослушивается (tftp работает на порту 69)
1
2
# netstat -nlp | grep :69
udp 0 0 0.0.0.0:69 0.0.0.0:* 1062/xinetd


Как то так.

Настройка NFS


Правим /etc/exports
1
2
/diskless/root 192.168.0.2/24(ro,sync,no_root_squash,no_subtree_check)
/diskless/home 192.168.0.2/24(rw,sync,no_root_squash,no_subtree_check)


root у нас будет в режиме для чтения, ибо нефиг :)
Синхронизируем настройки
1
exportfs -rv


перегружаем NFS-сервер
1
/etc/init.d/nfs-kernel-server restart


Заключение



Вроде бы должно заработать :) Выставляем на клиенте загрузку по сети и в бой. Кстати да, есть еще недоработки, тут можно еще оптимизировать и оптимизировать. Может кто чего посоветует?

Список использованных ссылок, которые сохранил и вспомнил
http://forum.lafox.net/index.php?showtopic=18927
http://irclog.ru/freenode-debian-russian-2012-01-23/
http://www.rzhevskiy.info/journal/dima/entry/diskless_stateless_linux_mouted_on
http://mozart.informatik.fh-kl.de/download/Software/GentooDiskless/diskless2_en.pdf
http://www.gentoo.ru/node/11838
http://habrahabr.ru/post/147522/
http://www.rzhevskiy.info/journal/dima/entry/diskless_stateless_linux_mouted_on


Тэги: aufs diskless howto netboot pxe pxelinux
+ 13 -
Похожие Поделиться

space 13.08.2012 16:33 #
Для временных файлов можно использовать tmpfs.
wzooff 13.08.2012 16:58 #
Так у меня и используется, просто клиентам иногда нужно иметь доступ в /etc и /var. Имено aufs и помогает нам слить систему в ro и возможность "записи" в нее. Только после ребута все такое же будет.
mealsforall 13.08.2012 16:42 #
Хорошая статья.
Зря так сразу LTSP отбросил, там уже тыщу лет есть Local Apps. Пишешь просто в конфиге Local_Apps = TRUE и вперед. Например, ltsp-localapps firefox запустит Firefox локально, причем вместо со всеми плагинами, включая тяжелый Flash и поддержку локального железа.
wzooff 13.08.2012 17:03 #
У нас не будет выделяться отдельный сервер для этого. У нас просто есть сетевое хранилище и dhcp/tftp сервер. В дальнейшем, если будет время, попробую на стенде поганять LTSP.
mealsforall 13.08.2012 16:43 #
А почему вдруг no_root_squash ?
wzooff 13.08.2012 16:56 #
Потому что так было в примере :-D я знаю, что это неправильно - делать с бухты барахты, но надо было быстро сделать, чтобы работало.
wzooff 13.08.2012 17:12 #
Убрал - вылезла ошибка связанная с aufs. Пролетел ворнинг, но я не успел увидеть и стал невозможным логин. Вернул обратно запись - всё стало на свои места :)
mealsforall 13.08.2012 16:47 #
Про linux-image & headers:

apt-get install linux-image-generic-pae linux-headers-generic-pae установит поcледнюю версию -pae (тебе нужно pae?)
wzooff 13.08.2012 16:54 #
В том то и дело, что я отказался от скрипта, на основе которого делал, именно изза того, что оно не ставит так у меня. Не находит пакетов. Может изза того, что у меня подключено только одно зеркало? Я делаю так:
 1
2
3
4
5
6
7
8
9
10
11
12
13
root@wzooff-lnx:/# apt-get install linux-image
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Пакет linux-image — виртуальный, его функции предоставляются пакетами:
linux-image-3.2.0-3-rt-686-pae 3.2.21-3
linux-image-3.2.0-3-amd64 3.2.21-3
linux-image-3.2.0-3-686-pae 3.2.21-3
linux-image-3.2.0-3-486 3.2.21-3
Вы должны явно указать, какой именно вы хотите установить.

E: Для пакета «linux-image» не найден кандидат на установку
root@wzooff-lnx:/#


и уже из этого списка выбираю нужный мне пакет
Sergey Vlasenko 15.08.2012 10:42 #
а в сторону thinstation(http://thinstation.org/) не смотрели? я его использую
wzooff 15.08.2012 23:17 #
Смотрел. Thinstation больше подходит для запуска рдп сессии, а мне требуется полноценный десктоп, с браузером, либрофисом и гимпом :)
Sergey Vlasenko 15.08.2012 10:43 #
что за десктопы на атомах? где брали? сколько стоят?
wzooff 15.08.2012 23:24 #
В мелкий корпус засунули вот такую мамку и 2 гб рам. Но они дико греются, тк радиатор не справляется летом. На некоторые даже кулера ставили. Это только для экономии места делалось. Там где можно разгуляться ставим самый дешевый по конфигу системник.
wzooff 15.08.2012 23:31 #
Корпуса эти мелкие выходят раза в два дороже обычных, но, повторюсь, у них проблемы с вентиляцией. По крайней мере в наших моделях. Как называются - не знаю, тк покупалось до того как я пришел в организацию. Так что по деньгам и практичности выгоднее брать обычный корпус, если место не критично.

Цена атомных матерей что то в пределах 800~1200 грн, в зависимости от модели атома. В принципе это примерно 4 гб рам + семпрон + не самая дешевая мать