Решился наконец написать еще одну статью на тему LiveCD. В какой-то
мере она основана на докладе Коли Маржана с конференции kiyvbsd09, за что
ему отдельное спасибо. А где-то на старой статье. Но методика и идея
сохранилась старая. Тоесть у нас будет два ключевых этапа: 1) сам LiveCD от
которого мне нужно только возможность загрузиться с него, определить
устройства, подготовить жесткий диск для дальнейшего разворачивания на него
дампа системы и базовая настройка системы которую мы развернем. 2) сам дамп
предустановленной системы. Данная картинка представляет
приблизительную "схему" того что мы будем дальше делать. А делать все будем
скриптами ;) iso -> ----------------- |1) LiveCD |
| |---------- | 2) dump |
----------------- Немного о файлах и их значении 1) 1.minsys -
главный скрипт который и будет собирать исошку
./1 .minsys
--> Specify arch - amd64 or i386
--> Example: ./1 .minsys i386 or ./1 .minsys amd64
при таком запуске он попросит указать архитектуру. По
большому счету здесь имееться ввиду файл конфиг ядра для amd64 или
i386. Файлы ядра находяться в этой же папке. GENERICamd64 ,
GENERICi386 переименовывать их не нужно.cvsupfile - файл
конфиг который будет использовать csupmake.conf - без коментариев, на
момент написания статьи практического применения ему не нашел ,(поэтому он
пустой) но оставил - ведь всё может быть :)src.conf - опции для
сборки мира...Стоит заглянуть возможно вам нужны маны или еще
что-то.packages.sh - в данной статье не используеться.
setup - его задача развернуть дамп готовой системы и прописать
базовые настройкиИтак приступим к первому этапу - созданию
LiveCD Качаем архив со скриптами
fetch ftp ://ftp.lissyara.su/users/morty/isonew/isonew.tbz
isonew.tbz 100% of 8625 B 38 kBps
и распаковываем его
Далее правим конфиг ядра amd64 или i386 в
зависимости от того что вы используете.src.conf - комментируем что-то
если не устраивает, либо можно его полностью очистить.cvsupfile -
если хотим указать то зеркало cvs которое к нам ближе. Можно запускать : (не
забываем перед этим установить cdrtools)
./1 .minsys i386
--------------------------
--> Dirs are present, creation don't needed
--> cvsup run not needed
--> Skiping build of world...
--> Kernel build don't needed
--> minsys.tbz, creation don't needed
--> You already have CD , /usr/iso/data/live.iso
И пойдет процесс сборки мира, ядра и т.д. у меня этого не
видно т.к. я уже это все сделал. Для удобства я добавил файлы-флаги которые
находятся тут :
ll /usr/iso/tmp/
total 0
-rw-r--r-- 1 root wheel 0 Oct 2 21 :53 1_iso.world
-rw-r--r-- 1 root wheel 0 Oct 2 22 :45 2_iso.kernel
-rw-r--r-- 1 root wheel 0 Oct 2 22 :46 3_iso.minsys
-rw-r--r-- 1 root wheel 0 Oct 2 22 :46 4_iso.livecd
по ним можно контролировать процесс либо если нужно
пересобрать только начиная с определенного момента , например с ядра то нужно удалить флаги 2,3,4. Либо если нужно просто перепаковать исо то
удаляем 4ый флаг и запускаем скрипт поновой.В результате имеем
следующее:
ls -lahF /usr/iso/ /usr/iso/data/
/usr/iso/:
total 16
drwxr-xr-x 8 root wheel 512B Oct 2 19 :53 ./
drwxr-xr-x 17 root wheel 512B Oct 1 22 :19 ../
drwxr-xr-x 3 root wheel 512B Oct 5 12 :24 data/
drwxr-xr-x 3 root wheel 512B Oct 2 19 :53 obj/
drwxr-xr-x 22 root wheel 512B Oct 1 22 :27 src/
drwxr-xr-x 2 root wheel 512B Oct 5 12 :12 stuff/
drwxr-xr-x 3 root wheel 512B Oct 1 22 :19 sup/
drwxr-xr-x 2 root wheel 512B Oct 2 22 :46 tmp/
/usr/iso/data/:
total 86214
drwxr-xr-x 3 root wheel 512B Oct 5 12 :24 ./
drwxr-xr-x 8 root wheel 512B Oct 2 19 :53 ../
drwxr-xr-x 16 root wheel 512B Oct 2 22 :45 chroot_dir/
-rw-r--r-- 1 root wheel 55M Oct 2 22 :46 live.iso
-rw-r--r-- 1 root wheel 29M Oct 2 22 :46 minsys.tbz
Создание CD за 5 минут На этом первый
этап заканчивается. Если нет желания(времени) собирать "подложку" (мир и
ядро)для LiveCD, пакет minsys.tbz можно скачать здесь PS: собран он на FreeBSD 7.2-RELEASE-p4 i386 Либо
использовать скрипт 9.lazy (он предпологает что СД будет с дампом на
борту) Он сам скачает minsys.tbz и попытается создать CD в 9-ом скрипте
рабочая директория задана переменной ${dir1} - для удобства Второй
этап: снятие дампа ФС с готовой системы. Подразумеваеться что система
установлена одним разделом - / Монтируем флэшку: (Либо другое устройство куда
будем снимать дамп) и запускаем второй скрипт
mount_msdosfs /dev/da0s1 /mnt/
./2 .dump
DUMP : Date of this level 0 dump : Mon Oct 5 13 :08 :25 2009
DUMP : Date of last level 0 dump : the epoch
DUMP : Dumping snapshot of /dev/ad0s1a (/) to standard output
DUMP : mapping (Pass I) [regular files]
DUMP : mapping (Pass II) [directories]
DUMP : estimated 5037154 tape blocks.
DUMP : dumping (Pass III) [directories]
или так
dump -0ua -L -f- /dev/ad0s1a | bzip2 > /mnt/dump_root.img.bz2
копируем дамп и установщик в "рут"
cp ./dump_root.img.bz2 /usr/iso/data/chroot_dir/root/
cp ./setup /usr/iso/data/chroot_dir/root/
удаляем флаг на создание исошки и запускаем по-новой
скрипт
rm /usr/iso/tmp/4_iso.livecd
./1 .minsys i386
В результате мы получаем СД
ls -lah /usr/iso/data/live.iso
-rw-r--r-- 1 root wheel 547M Oct 5 14 :33 /usr/iso/data/live.iso
загрузившись с которого вызываем наш скрипт
setup
/root/setup
------------- !Warning! ---------------------
Preparing for installation...
YES - will proceed installation of system
NO - reboot the system
---------------------------------------------
Do you want to start the installation:
разворачиваем систему с нашего дампа который был сделан
ранее На этом все ... Далее выкладываю 2 основных скрипта : 1.minsys
и setup целиком можно скачать тут 1.minsys
#!/bin/sh
#
# October 2009
# Script of real black magic :)
#
#world_tar:
if [ $# -ge 1 ];
then echo "--------------------------"
else
echo " --> Specify arch - amd64 or i386"
echo " --> Example: ./1 .minsys i386 or ./1 .minsys amd64"
exit 1
fi ;
arch =$1
#
if [ -d /usr/iso ]; then \
echo " --> Dirs are present, creation don't needed"; \
else
mkdir -p /usr/iso/data
mkdir -p /usr/iso/stuff
mkdir -p /usr/iso/obj
mkdir -p /usr/iso/tmp
cp ./* /usr/iso/stuff/
fi ;
#
export MAKEOBJDIRPREFIX=/usr/iso/obj
export BUILDNAME=7 .2 -RELEASE
export RELEASETAG=RELENG_7_2_0_RELEASE
export SRCCONF=/usr/iso/stuff/src.conf
export MAKE_CONF=/usr/iso/stuff/make.conf
export CVSROOT=/usr/iso/src
#export WORLD_FLAGS='-j16'
#export KERNEL_FLAGS='-j16'
#export KERNCONF=/usr/iso/stuff/GENERIC
#export LOCAL_PATCHES /usr/iso/stuff/local.patch
#export EXTPORTSDIR /usr/ports
#
if [ -d /usr/iso/src ]; then \
echo " --> cvsup run not needed"; \
else
/usr/bin/csup /usr/iso/stuff/cvsupfile
fi ;
#
if [ -f /usr/iso/tmp/1_iso.world ]; then \
echo " --> Skiping build of world..."; \
else
rm -rf /usr/iso/obj
mkdir -p /usr/iso/obj
chflags -R noschg /usr/iso/data/chroot_dir/
rm -rf /usr/iso/data/
mkdir -p /usr/iso/data
cd /usr/iso/src
cp /usr/iso/stuff/GENERIC$arch /usr/iso/src/sys/$arch /conf/GENERIC
#patch < /usr/iso/stuff/local.patch
make -j16 buildworld
mkdir -p /usr/iso/data/chroot_dir
make DESTDIR=/usr/iso/data/chroot_dir installworld
cd /usr/iso/src/etc
make DESTDIR=/usr/iso/data/chroot_dir distribution
touch /usr/iso/tmp/1_iso.world
fi ;
#
if [ -f /usr/iso/tmp/2_iso.kernel ]; then \
echo " --> Kernel build don't needed"; \
else
cd /usr/iso/src
make -j16 buildkernel
make DESTDIR=/usr/iso/data/chroot_dir installkernel
touch /usr/iso/tmp/2_iso.kernel
fi ;
#
cd /usr/iso/data/chroot_dir
/usr/bin/find . -name lib\*.a -delete
/usr/bin/find . -name *.pyc -delete
/usr/bin/find . -name *.pyo -delete
/usr/bin/find . -name "*~" -delete
rm -rf usr/include
rm -rf usr/local/include
rm -rf usr/share/dict
rm -rf usr/share/examples
rm -rf usr/share/doc
rm -rf usr/local/man
rm -rf usr/local/info
rm -rf usr/local/share/doc
rm -rf usr/share/man
rm -rf usr/share/groff_font
rm -rf usr/share/syscons
rm -rf usr/local/share/locale
rm -rf usr/local/share/gettext
rm -rf usr/share/locale/[^e]*
rm -rf usr/share/nls/[^e]*
rm -rf usr/share/calendar
rm -rf usr/share/sendmail
rm -rf usr/share/isdn
rm -rf usr/share/misc/[^tp]*
rm -rf usr/share/tmac
rm -rf usr/share/misc/pcvtfonts
rm -rf usr/libexec/cc*
rm -rf usr/libexec/f771
rm -rf rescue
#
if [ -f /usr/iso/tmp/3_iso.minsys ]; then \
echo " --> minsys.tbz, creation don't needed"; \
else
cd /usr/iso/data
tar -cjf minsys.tbz chroot_dir/
touch /usr/iso/tmp/3_iso.minsys
sleep 5
fi ;
#world_tar_fin:
#mv /usr/iso/data/chroot_dir/boot/kernel/kernel /usr/iso/data/
#rm -rf /usr/iso/data/chroot_dir/boot/kernel/*
#mv /usr/iso/data/kernel /usr/iso/data/chroot_dir/boot/kernel/
#livecd:
if [ -f /usr/iso/tmp/4_iso.livecd ]; then \
echo " --> You already have CD , /usr/iso/data/live.iso" ; \
else
cat > /usr/iso/data/chroot_dir/boot/loader.conf << EOF
boot_cdrom="YES"
autoboot_delay="0 "
beastie_disable="YES"
EOF
cat > /usr/iso/data/chroot_dir/etc/fstab << EOF
# Device Mountpoint FStype Options Dump Pass#
md /tmp mfs rw,-s32m 0 0
EOF
cat > /usr/iso/data/chroot_dir/etc/rc.conf << EOF
dmesg_file="/tmp/dmesg.boot"
sendmail_enable="NONE"
EOF
cat > /usr/iso/data/chroot_dir/etc/rc << EOF
#!/bin/sh
export TERM=cons25
export PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin
/sbin/mount /tmp
/sbin/ifconfig lo0 127 .0 .0 .1
#FIRST_IF=\`/sbin/ifconfig | /usr/bin/head -1 | /usr/bin/cut -d : -f 1\`
#/sbin/dhclient -l /tmp/dhclient.leases \$FIRST_IF
/etc/rc.d/dmesg start
#mkdir /tmp/etc
#mount_nullfs /tmp/etc /etc
/usr/libexec/getty autologin ttyv1 &
/usr/libexec/getty autologin ttyv2 &
/usr/libexec/getty autologin ttyv3 &
/usr/libexec/getty autologin ttyv0
/sbin/reboot
EOF
#/usr/iso/stuff/packages.sh
#rsync -aHv --delete /usr/iso/data/packages/ \
#/usr/iso/data/chroot_dir/packages/
#mount -t devfs devfs /usr/iso/data/chroot_dir/dev
#chroot /usr/iso/data/chroot_dir pkg_add \
# /packages/Latest/smartmontools.tbz /packages/Latest/python25.tbz
#umount /usr/iso/data/chroot_dir/dev
#cp /usr/iso/data/minsys.tbz /usr/iso/data/chroot_dir/
#cp /usr/iso/stuff/setup.sh /usr/iso/data/chroot_dir/sbin/
mkisofs -b boot/cdboot -no-emul-boot \
-r -J -V Setup -quiet -o /usr/iso/data/live.iso /usr/iso/data/chroot_dir
touch /usr/iso/tmp/4_iso.livecd
fi ;
setup
#!/bin/sh
dist_dir="/root"
iface=`ifconfig -l | cut -f1 -d' '`
#${mdmfs} -M -s 3m md1 /mnt
#------------------
tmp_dir="/tmp"
# Destination of installation system
mnt2="/tmp/mnt2"
#root_size="256" # Mb 384
swap_size="256 " # Mb 1024
#
echo "
------------- !Warning! ---------------------
Preparing for installation...
YES - will proceed installation of system
NO - reboot the system
---------------------------------------------
"
echo -n "Do you want to start the installation: "
read answer
# verify answer
case ${answer} in
[Yy][Ee][Ss])
# yes. continue....
echo""
echo "Running installation ... "
;;
*)
# perdumal:)
echo "You answered '${answer} '. Server reboots..."
shutdown -r now
exit ;
;;
esac
# --------------------------
# Detect Hdd
DISK=`(dmesg | grep -E '^ar'; \
dmesg | grep -E '^ad'; \
dmesg | grep -E '^da') | \
head -1 | cut -f1 -d:`
echo "
"
##
## Full name of hdd
DISKMARK=`(dmesg | grep -E '^ar'; \
dmesg | grep -E '^ad'; \
dmesg | grep -E '^da') | \
head -1`
echo "Detected hard drive for working:"
echo $DISKMARK
echo "Detected network card:"
echo $iface
#
# fdisk
# Uto4naem razmer /
echo -n "Enter size of / (root) partition in Mbytes: "
read root_size
#
echo "Creating partitions..."
/sbin/fdisk -I -i -B /dev/${DISK}
echo "# /dev/${DISK}s1:
2 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: ${root_size}M 0 4 .2BSD 2048 16384 32776
b: ${swap_size}M * swap
" > ${tmp_dir} /bsdlabel.txt
# bsdlabel
/sbin/bsdlabel -R ${DISK}s1 ${tmp_dir} /bsdlabel.txt >/dev/null 2 >&1
/sbin/bsdlabel -B ${DISK}s1 >/dev/null 2 >&1
# newfs
echo "Creating filesystem..."
/sbin/newfs /dev/${DISK}s1a >/dev/null 2 >&1
#
echo "HDD formated..."
/bin/mkdir -p ${mnt2}
#
# restore /
echo "Restoring '/' filesystem..."
/sbin/mount /dev/${DISK}s1a ${mnt2}
cd ${mnt2}
/usr/bin/bunzip2 --stdout ${dist_dir} /dump_root.img.bz2 \
| /sbin/restore -rf - >/dev/null 2 >&1
#
echo "Rewriting /etc/fstab for device ${DISK} "
echo "# Device Mountpoint FStype Options Dump Pass#
/dev/${DISK}s1b none swap sw 0 0
/dev/${DISK}s1a / ufs rw 1 1
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
" > ${mnt2} /etc/fstab
cp /usr/share/zoneinfo/Europe/Kiev ${mnt2} /etc/localtime
#
#
echo -n "Do you want static IP-address(YES ) or use DHCP(NO ) : "
read answer2
# verify answer
case ${answer2} in
[Yy][Ee][Ss])
# yes. use static IP-address
echo "Your answer '${answer2} ' "
echo "Static ip-address will be used "
echo "Example for enter - 192 .168 .10 .15 "
echo -n "Enter ip-address for this computer : "
read ipaddr
echo -n "Enter default router :"
read defroute
echo -n "Enter 1fst dns ip-address server : "
read dns1
echo -n "Enter 2nd dns ip-address server : "
read dns2
echo -n "Enter hostname (exmpl:dsk1.domain.local ) : "
read hsname
echo 'ifconfig_'${iface} '="inet '${ipaddr} ' \
netmask 255 .255 .255 .0 "' >> ${mnt2} /etc/rc.conf
echo "hostname =$hsname
defaultrouter=$defroute
sshd_enable=\"YES\" " >> ${mnt2} /etc/rc.conf
echo "nameserver $dns1 " > ${mnt2} /etc/resolv.conf
echo "nameserver $dns2 " >> ${mnt2} /etc/resolv.conf
echo "
::1 localhost localhost.my.domain
127 .0 .0 .1 localhost localhost.my.domain
$ipaddr $hsname .
" > ${mnt2} /etc/hosts
;;
*)
# use DHCP address for network interface
echo ""
echo "You answered '${answer2} '. Now we use DHCP "
echo ""
echo ifconfig_$iface ="DHCP" >> ${mnt2} /etc/rc.conf
echo "Don't forget to set (check) hostname in rc.conf and hosts file ^_^"
exit ;
;;
esac
echo -n "Enter user name : "
read nickname
/usr/sbin/chroot ${mnt} id ${nickname} || echo newpass | /usr/sbin/chroot \
${mnt2} pw useradd ${nickname} -g wheel -s /bin/tcsh -m -h 0
#
echo "System restored!"
/bin/sync
bin/umount ${mnt2}
/sbin/shutdown -r now
exit ;
Источник: http://www.lissyara.su/?id=1984