- PVSM.RU - https://www.pvsm.ru -

Живой Debian

Доброго всем времени суток!

Представьте ситуацию: у вас есть хорошо настроенная и отлаженная система под управлением Debian. В какой-то момент вы хотите сделать так, чтобы эта система установленная на HDD начала загружаться с флешки или с CD-диска и работать в режиме ReadOnly. Типичное применение подобного решения это различные уличные киоски или тонкие клиенты, состояние которых сбрасывается в исходное при каждой перезагрузке.

Сегодня я хочу рассказать о том, как добиться подобного результата, но сначала немного теории.
Как известно, операционная система Linux Debian будучи установленной на HDD состоит из 4 достаточно независимых компонентов, каждый из которых можно подобрать или настроить по своему вкусу, а именно:

1. Загрузчик — то, что отрабатывает после BIOS и загружает Debian. По умолчанию используется «GRUB», но можно использовать любой другой. Мы будем использовать Syslinux, т.к. умеет грузить ОС с флешки, CD-диска и по сети.
2. Kernel или «ядро» — собственно центральная часть ОС, вокруг которой все крутится. Будем использовать то, что идет в составе дистрибутива.
3. initrd — промежуточная файловая система, которая помогает ядру найти RootFS. Требует небольшой модификации, к счастью не ручной.
4. RootFS — корневая ФС. Вот ее то нам и предстоит преобразовать так, что бы ОС могла грузиться в режиме RO.

Считаем, что у вас уже есть система, со всеми программами и пакетами которые вас интересуют. Разберем работу скрипта, который сделает для нас все что нужно:

#!/bin/bash
# Задаем имя ядра и файла initrd из каталога "/boot", а также папку, где будет собираться наш проект
VMLINUZ="vmlinuz-3.2.0-4-amd64"
INITRD="initrd.img-3.2.0-4-amd64"
ISO="iso"<source lang="bash">

# Устанавливаем дополнительные пакеты, котрые будут нужны в процессе работы:
apt-get install  squashfs-tools
apt-get install  live-boot live-boot-initramfs-tools
apt-get install  mtools syslinux dosfstools

# Подготавливаем структуру каталогов для нашего проекта
[ -d /$ISO ] && rm -rf /$ISO
mkdir /$ISO
mkdir /$ISO/binary
mkdir /$ISO/binary/live
mkdir /$ISO/binary/syslinux
mkdir /$ISO/fscopy

# Создаем копию оригинальной RootFS и в копии удаляем ненужные вещи
tar -cpf - --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=boot --exclude=$ISO . | tar xf - -C /$ISO/fscopy/

rm -r /$ISO/fscopy/tmp/*  /$ISO/fscopy/var/tmp/*
rm /$ISO/fscopy/var/cache/apt/archives/*.deb
rm /$ISO/fscopy/etc/udev/rules.d/*-persistent-net.rules
rm /$ISO/fscopy/initrd.img  /$ISO/fscopy/vmlinuz
> /$ISO/fscopy/etc/fstab
mkdir /$ISO/fscopy/proc
mkdir /$ISO/fscopy/sys
mkdir /$ISO/fscopy/dev/pts

# Переносим копию RootFS на файловую систему squashfs 
mksquashfs /$ISO/fscopy/* /$ISO/binary/live/filesystem.squashfs

# Копируем ядро и initrd в структуру проекта
cp /boot/$INITRD  /$ISO/binary/live/initrd.img
cp /boot/$VMLINUZ /$ISO/binary/live/vmlinuz

# Создаем конфигурационный файл "syslinux.cfg" для занрузчика Syslinux
cat > /$ISO/binary/syslinux/syslinux.cfg <<EOF
CONSOLE 0
default linux
label linux
  kernel /live/vmlinuz
  append initrd=/live/initrd.img boot=live quiet splash noconfig ro
EOF

# Из файлов, которые лежат в папке "/iso/binary/" формируем образ, который потом с помощью dd можно записать на флешку
# Список того, что к этому времени лежит в папке "/iso/binary/"
# /iso/binary/live/vmlinuz — ядро
# /iso/binary/live/initrd.img — initrd, который знает как работать с файловой системой Squashfs
# /iso/binary/live/filesystem.squashfs — RootFS в сжатом виде
# /iso/binary/syslinux/syslinux.cfg — конфигурационный файл загрузчика

dd if=/dev/zero of=/$ISO/Debian_ro.img bs=10M count=35
LOFI=`losetup -f`
losetup $LOFI /$ISO/Debian_ro.img
mkdosfs -I $LOFI
syslinux $LOFI
TMP_DIR="/tmp/$$"
mkdir $TMP_DIR
mount $LOFI $TMP_DIR
cp -r /$ISO/binary/* $TMP_DIR
umount $TMP_DIR; rm -r $TMP_DIR
losetup -d $LOFI

# По окончанию работы скрипта имеем файл "Debian_ro.img", который готов к записи на флешку

Некоторые полезные ссылки:

Достаточно подробное описание на русском особенностей ФС Squashfs: ru.wikipedia.org/wiki/Squashfs [1]
Описание всех дополнительных параметров, которые можно передать ядру: live.debian.net/manpages/2.x/en/html/live-boot.7.html [2]

P.S. Если наберется достаточно большое количество желающих, то тему можно продолжить статьями «Живой CentOS» и «Живой Solaris 10».

Автор: RomaU

Источник [3]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linux/62870

Ссылки в тексте:

[1] ru.wikipedia.org/wiki/Squashfs: http://ru.wikipedia.org/wiki/Squashfs

[2] live.debian.net/manpages/2.x/en/html/live-boot.7.html: http://live.debian.net/manpages/2.x/en/html/live-boot.7.html

[3] Источник: http://habrahabr.ru/post/226973/