понедельник, 2 февраля 2009 г.

Создание LiveCD для различных целей


(на основе CentOS)
Перевод заметок из вики wiki.centos.org/Projects, искажённый и дополненный.

Подготовка

Объяснения, что такое LiveCD и зачем они нужны, опустим и перейдём к подготовке системы в которой будем собирать их.
Для начала изучим страницу проекта по созданию LiveCD в вики centos.org и выделим следующие моменты:

  • временно не работает с lvm, возможно делается через установку патчей (написано что проблема в mkinitrd, но после замены его на тот, что идёт с rhel5.3 beta, диск собрался но не работал);
  • требует включеный selinux в режиме permissive.

1 Установка необходимых программ

С сайта, с одной из первых страниц wiki забирается описание репозитория для yum. В усечённом состоянии выглядит так:

# Name: CentOS LiveCD repository
[livecd]
name = CentOS $releasever - LiveCD
baseurl=http://www.nanotechnologies.qc.ca/propos/linux/centos-live/$basearch/live
enabled=1
protect=0
gpgkey=http://www.nanotechnologies.qc.ca/propos/linux/RPM-GPG-KEY-PGuay

когда это будет сделано запускаем

# yum install livecd-tools syslinux

для тех у кого море дополнительных пакетов (или чтобы в сеть не лазить каждый раз из-за мелочей) устанавливаем ещё и createrepo.


2 Создание минимальной версии

Первое что нам понадобится это kickstart файл, для того чтобы скрипт livecd-creator по нему сделал нам что нибудь. Там же на сайте есть два примера - минимум и нечто с графическим интерфейсом.
Начнём с минимального, сделаем копию с centos-livecd-minimal.ks и в ней
исправим lang на ru_RU.UTF-8 и timezone на кто где живёт. И... заменим ссылки репозиториев на те что ближе (стоит начать с путешествия по директориям на mirror.yandex.ru, там можно найти epel и atrpms и родные репы CentOS).

# sudo livecd-creator --config=d41-min-01.ks --fslabel=d41-min-01

ждём, долго =(


3 Навешиваем пользу
Примечание: полное руководство по созданию ks файлов искать в документе
Installation Guide ru_RU.

Так как последствие centos-livecd-minimal.ks представляет из себя жалкое зрелище,даже от букв великого и могучего остались лишь квадратики,
начинаем искать пути исправления ситуации. Как всегда, поиски начнём с comps.xml из инсталляционного диска. Причёсываем файл регулярными выражениями пока не останется только русский и английский языки. Ищем группу которая начинается с <id>core</id>, она настолько default что даже не uservisible, изучаем её состав. Заодно смотрим на файл centos-livecd-desktop.ks точнее на то что из @core там убрали, а также разглядываем anaconda-ks.cfg из /root и заменяем секцию %packages на следующее чудо:

%packages
syslinux
kernel

@core
-ed
-gnu-efi
-libhugetlbfs
-Deployment_Guide-en-US

@russian-support
-Deployment_Guide-ru-RU

Делаем новую сборку.
Cмотрим на появившиеся, уже читаемые надписи. Размышляем на тему зачем нам yum на живом диске.
Первый шаг сделан, теперь надо добавить на диск что нибудь полезное =)
Начнём с того что поставим mc, elinks и прикрутим переключение раскладок клавиатуры.

  • mc добавляется просто, одной строкой в списке пакетов (я взял форк от
    redhat-club, и сделал из него реп)
  • с elinks придётся подшаманить секцию %post для того чтобы у него всегда были вменяемые настройки, и соответственно русские меню и страницы.

    mkdir /root/.elinks
    cat > /root/.elinks/elinks.conf <<EOF_elinks
    set config.saving_style_w = 1
    set terminal.linux.charset = "koi8-r"
    set terminal.linux.type = 3
    set ui.language = "System"
    EOF_elinks

  • и последнее это изменение раскладок. для этого мы меняем в начале файла строку keyboard us на keyboard ru
час молитвы... в смысле сборка и тестирование.
Поигрались, переходим к следующей стадии. Для начала докинем:
  • alsa - звук и управление им
  • mpg123 - мп3 плеер
  • vim - редактор с подсветкой синтаксиса
  • rsync - мало ли пригодится, репы вытягивать
  • wget - скачивание файлов и тестирование списка ссылок
  • lftp - фтп клиент
  • naim/mcabber - им клиенты к аське и джабберу (но как пользоваться ими не представляю, хотя подключиться у меня получилось)
  • man и man-pages + manpages-ru - а где ещё мы будем читать о том как пользоваться этой аськой

После этого делаем замену основного ядра на ядро из centosplus репозитория и добавляем антивирус.
  • chntpw - меняет пароли в виндовс
  • drweb/clamav - у кого что есть тот то и ставит
  • ipw3945 - вайфай (есть у моего бука такая проблема)
  • pptp - ибо интернет через него
  • rp-pppoe - ибо где-то интернет через него

Пачка скриптов для автоматической настройки сети, запуска плеера и тп.
И в итоге у нас получается что то типа этого:

# recreated 'cause previous was deleted. lucky me.
lang ru_RU.UTF-8
keyboard ru
timezone Asia/Yekaterinburg
auth --useshadow --enablemd5
selinux --enforcing
firewall --disabled

repo --name=base --baseurl=file:///home/d41/CentOS-media/
repo --name=updates --baseurl=file:///home/d41/CentOS-updates/
repo --name=extras --baseurl=file:///home/d41/CentOS-extras/
#repo --name=plus --baseurl=file:///home/d41/CentOS-plus/
repo --name=epel --baseurl=file:///home/d41/epel/
repo --name=rhc --baseurl=file:///home/d41/redhatclub/
repo --name=misc --baseurl=file:///home/d41/misc/
repo --name=live --baseurl=file:///home/d41/CentOS-live/

%packages
# base pack
syslinux
kernel-2.6.18-92.1.18.el5.centos.plus
man
man-pages
man-pages-ru
@core
-ed
-gnu-efi
-libhugetlbfs
-Deployment_Guide-en-US
@russian-support
-Deployment_Guide-ru-RU

## software for use
## simple
mc
vim-enhanced
alsa-lib
alsa-utils
mpg123
## web
elinks
lftp
rsync
wget
naim
mcabber
## archivers
unrar
bzip2
unzip
p7zip
## other
chntpw
drweb-base
drweb-scanner
drweb-updater
ipw3945-1.2.0-18.4.0.1.el5
ipw3945d-1.7.22-4.at
ipw3945-kmdl-2.6.18-92.1.18.el5.centos.plus-1.2.0-18.4.0.1.el5
ipw3945-ucode-1.14.2-4.0.1
ieee80211
wireless-tools
system-config-network-tui
pptp
ppp
rp-pppoe

# configuration after install
%post

# initscript absolutely useless right now
cat > /etc/rc.d/init.d/livecd << EOF_initscript

#!/bin/bash

# chkconfig: 345 00 99
# description: Init script for live image
. /etc/rc.d/init.d/functions

RETVAL=0

start() {
chkconfig yum-updatesd off &> /dev/null
chkconfig crond off &> /dev/null
chkconfig atd off &> /dev/null
chkconfig anacron off &> /dev/null
# chkconfig mcstrans off &> /dev/null
chkconfig readahead_early off &> /dev/null
chkconfig readahead_later off &> /dev/null

# addon
modprobe ipw3945
modprobe mac80211
ipw3945d
/root/bin/mount-points
}

stop() {
echo
}

restart() {
stop
start
}

case "\$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo \$"Usage: \$0 {start|stop|restart}"
exit 1
esac

exit $RETVAL

EOF_initscript

chmod 755 /etc/rc.d/init.d/livecd
/sbin/chkconfig --add livecd

##
## environment setup
##

# параметры, те что в начале файла, не применялись =(
cfg=/etc/selinux/config
sed 's/^SELINUX=.*/SELINUX=disabled/' $cfg > /tmp/sel
mv /tmp/sel $cfg

# disable bell at autocompletion in bash
echo "set bell-style none" >> /etc/inputrc

# setting up elinks
mkdir /root/.elinks
cat > /root/.elinks/elinks.conf <<EOF_elinks
set config.saving_style_w = 1
set terminal.linux.charset = "koi8-r"
set terminal.linux.type = 3
set ui.language = "System"
EOF_elinks

##
## drweb
##
/usr/bin/wget -O /opt/drweb/drweb32.key http://localhost/unix/drweb32.key
files="drw44460.vdb drw44461.vdb drw44462.vdb drw44463.vdb drw44464.vdb drw44465.vdb drw44466.vdb drw44467.vdb drwebase.vdb"
for file in $files;
do
/usr/bin/wget -O /var/drweb/bases/$file http://localhost/bases/$file;
done

##
## user scripts and links
##
mkdir /root/bin/
ln -s /usr/sbin/system-config-network-tui /root/bin/network-config
ln -s /usr/bin/alsamixer /root/bin/sound-control

cat > /root/bin/mount-points <<EOF

#!/usr/bin/python

import os,re

def _get_labels():
parts = {}
labpath = "/dev/disk/by-label"
for labname in os.listdir(labpath):
parts[os.path.realpath(os.path.join(labpath,labname))] = labname
return parts

def _get_ids():
parts = {}
remove = set([])
labpath = "/dev/disk/by-id"
for labname in os.listdir(labpath):
rp = os.path.realpath(os.path.join(labpath,labname))
parts[rp] = labname.split('-',1)[1]
if re.search("[0-9]+$",rp):
remove.add(rp[:8])
for i in remove:
parts.pop(i, "")
return parts

def create_new_media():
parts = _get_ids()
labels = _get_labels()
for i in labels:
parts[i] = labels[i]

splitter = "# d41:section:"
fsaddon = [splitter]
for i in parts:
os.mkdir(os.path.join("/media",parts[i]))
fsaddon.append("%s /media/%s auto noauto,user 0 0"%(i,parts[i]))

text = open("/etc/fstab","rt").read()
open("/etc/fstab","wt").write( text.split(splitter)[0]+("\n".join(fsaddon))+"\n" )

def remove_old_media():
names = os.listdir("/media")
for name in names:
os.popen("umount /media/%s"%name)
os.rmdir("/media/%s"%name)

if "__main__"==__name__:
remove_old_media()
create_new_media()

EOF
chmod u+x /root/bin/mount-points

cat > /root/bin/play-this <<EOF
#!/bin/bash
ls -b | grep -i "\.mp3$" | xargs mpg123
EOF
chmod u+x /root/bin/play-this

cat > /root/README.wifi.txt <<EOF
# get networks list
iwlist scan
# connect to network by essid
iwconfig eth0 essid "home-net"
# bring up interface
ifconfig eth0 up
# get ip address
dhclient eth0
EOF

/usr/bin/wget -O /root/README.pptp.txt http://localhost/unix/pptp.txt
/usr/bin/wget -O /root/README.pptp2.txt http://localhost/unix/pptp2.txt
/usr/bin/wget -O /root/README.pptp3.txt http://localhost/unix/pptp3.txt
/usr/bin/wget -O /root/README.pptp4.txt http://localhost/unix/pptp4.txt

cat > /root/bin/wifi-home <<EOF
#!/bin/bash
iwconfig eth0 essid "home-net"
ifconfig eth0 up
dhclient eth0
EOF
chmod u+x /root/bin/wifi-home

cat > /root/bin/scan-this <<EOF
#!/bin/bash
/opt/drweb/drweb -ar- -cud -icd -adwi -dlsi -hcki -joki -rski -ni -path=\`pwd\`
EOF
chmod u+x /root/bin/scan-this

##
## pptp default options
##
cfg=/etc/ppp/options.pptp
sed 's/^\(refuse-.*\)/# \1/' $cfg > /tmp/pptp
mv /tmp/pptp $cfg

cat > /etc/ppp/peers/vpn <<EOF
maxfail 0
lcp-echo-interval 60
lcp-echo-failure 4
defaultroute
pty "pptp vpn.tyumen.ru --nolaunchpppd"
name d41mpd
remotename PPTP
+chap
file /etc/ppp/options.pptp
ipparam vpn
EOF

cat > /etc/ppp/chap-secrets <<EOF
d41mpd PPTP password *
EOF

cp /usr/share/doc/ppp-2.4.4/scripts/pon \
/usr/share/doc/ppp-2.4.4/scripts/poff \
/root/bin/
chmod u+x /root/bin/pon
chmod u+x /root/bin/poff

Основной вывод по kickstart файлу:
самая частая ошибка - не эскейпированые управляющие символы в скриптах создаваемых с помощью cat.
По это этой причине лучше сразу поднять apache и с помощью wget просто скачивать все что длиннее трёх строк, это избавит от кучи ошибок и лишних
пересборок. И, если если собираете диск на слабой машине, можете сразу найти себе книжку,
за время пересборок успеете пару-тройку сотен страниц прочитать.


4 Делаем графический пользовательский интерфейс

Делается по аналогии с предыдущим пунктом и за основу берётся centos-livecd-desktop.ks. Также имеет смысл использовать легковесные оболочки типа fluxbox, windowmaker, lxde, xfce и им подобные.


5 Закатываем это на флэшку

После подключения флэшки (создания резервной копии с неё), определяем название устройства и запускаем

# livecd-iso-to-disk <имя диска> <имя раздела устройства>

Иногда бывает сообщение про checkisomd5 - чёрт с ним, эту команду добавили в более поздних версиях анаконды.
Если вам сказали что раздел не отмечен как загрузочный, то сделайте его
таковым через

# parted <имя устройства>
(parted) toggle <номер раздела> boot
(parted) quit

Номер раздела получается в parted командой print.
Радуемся жизни ... и помним что главное это не тупить (по крайней мере не более трёх раз подряд).


6 Сделано по материалам

Ярлыки: ,

Комментариев нет:

Отправить комментарий