Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Мелочи —> LiveCD

LiveCD

Автор: Morty.


Решился наконец написать еще одну статью на тему 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 - файл конфиг который будет использовать csup
make.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

и распаковываем его
tar -xjf isonew.tbz

Далее правим конфиг ядра 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;



размещено: 2009-11-12,
последнее обновление: 2009-11-12,
автор: Morty


Артем, 2009-11-12 в 13:26:34

Ай спасибо! Давно хотел попробовать собрать

luckyredhot, 2009-11-12 в 13:32:13

Спасибо за статью, в ближайшем времени испытаем :)

Nemanov, 2009-11-13 в 3:10:29

Спасибо автору, многим это поможет спать спокойно



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0758 секунд
Из них PHP: 55%; SQL: 45%; Число SQL-запросов: 77 шт.
Исходный размер: 48725; Сжатая: 10699