Table of Contents

Сборка установочного образа ALT Linux без mkimage-profiles

Для вашего собственного дистрибутива, мы предлагаем вам основываться на самой минимальной сборке ALT Linux - jeos-sysv, вы можете найти её по этой ссылке. Этот дистрибутив надо будет установить непосредственно на компьютер или на виртуальную машину, далее удалить из него лишние на ваш взгляд пакеты и установить все нужные лично вам. По ходу выполнения данной задачи, рекомендуем сохранять в какой-нибудь текстовый файл имена пакетов, которые вы устанавливаете, и полные имена конфигурационных файлов, которые вы модифицируете. Они вам могут пригодиться в будущем.

Поскольку мы не приемлим использование таких команд как sudo и su для повышения полномочий обычного пользователя, в наших дистрибутивах их нет. Если они вам нужны (знал бы чёрт зачем), вы можете их установить их для себя также, как и все другие программы.

В случает сборки установочного образа по данной инструкции, мы предлагаем вам после установки всех нужных вам пакетов, которые попадут в установочный образ, открыть данную инструкцию и выполнять все команды от имени суперпользователя в графической сессии. Для удобства вы можете расположить инструкцию в одной половине экрана, а в другой открыть терминал и залогиниться под root'ом следующим образом

ssh root@localhost

Далее вы можете просто выделять команды и вставлять их в терминал, поправляя их местами, если если это необходимо. Можно вставлять в темринал сразу несколько команд, в том числе и многострочные команды

cat <<EOF > anyfile
foo
bar
baz
EOF

Их надо выделять от первой до последней строки и полностью вставлять в командрую строку.

Выделяемые команды из инструкции одинакого хорошо можно вставлять в терминал как с помощью средней кнопки мыши, так и с помощью сочетания Shift+Insert.

Настройка apt

BRANCH=p10
ARCH=i586
BITS=32

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

NB: Лучше собирать установочный образ на p10, потому что из p11 был удалён lilo и перестал работать Xorg. Вредители, млять.

mkdir ~/apt
mkdir -p ~/apt/lists/partial
mkdir -p ~/apt/cache/${BRANCH}/archives/partial
if [ "$ARCH" = "x86_64" ]; then
    IF_X86_64_ARCH=x86_64-i586
else
    IF_X86_64_ARCH=$ARCH
fi
cat <<EOF > ~/apt/apt.conf.${BRANCH}.${ARCH}
Dir::Etc::SourceList "$PWD/apt/sources.list.${BRANCH}.${ARCH}";
Dir::Etc::SourceParts /var/empty;
Dir::Etc::main "/dev/null";
Dir::Etc::parts "/var/empty";
APT::Architecture "${BITS}";
Dir::State::lists "$PWD/apt/lists/";
Dir::Cache "$PWD/apt/cache/${BRANCH}/";
EOF
cat <<EOF > ~/apt/sources.list.${BRANCH}.${ARCH}
rpm http://mirror.yandex.ru/altlinux ${BRANCH}/branch/${ARCH} classic
rpm http://mirror.yandex.ru/altlinux ${BRANCH}/branch/${IF_X86_64_ARCH} classic
rpm http://mirror.yandex.ru/altlinux ${BRANCH}/branch/noarch classic
EOF
apt-get -c ~/apt/apt.conf.${BRANCH}.${ARCH} update

Последнюю команду выполнить три раза, потому что первые два раза команда выдаёт ошибки по неизвестной причине.

Подготовка локального репозитория бинарных пакетов

Установить в операционную систему все нужные пакеты, удалить ненужные.

Далее нужно выкачать rpm-пакеты из центрального репозитория

Команда rpm -qa выдаёт список всех пакетов, установленных в системе, однако не все из них присутствуют локально на диске в виде бинарных rpm-пакетов

Так можно записать список пакетов в файл pkglist:

rpm -qa --queryformat '%{NAME}\n' > pkglist

В названиях пакетов не будет информации о версии и информации об архитектуре, что позволит выкачать их с помощью apt

Убрать из pkglist упоминания branding* и basesystem, если не хотим проблем с интеллектуальной собственностью фирмы Base ALT


Для сборки конкретно Necromant

Возьмите готовый pkglist и отредактируйте его при необходимости. Когда скачаете этот файл, удалите суффикс из имени.

pkglist.rpm

grep -vE '^\[.*\]$|^$' pkglist

После выполнения слудующих команд все rpm'ки будут находится в каталоге ~/apt/cache/$BRANCH/archives.

apt-get -c ~/apt/apt.conf.${BRANCH}.${ARCH} -d install --reinstall -o "RPM::RootDir=/tmp" -y $(cat pkglist)

Возможно потребуется разрешить конфликты между версиями некоторых пакетов путём явного указания версии пакета.

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

Создаём файл образа с запасом по размеру

dd if=/dev/zero of=Necromant_Linux.img bs=1024M count=2

Настраиваем петлевое (loopback) устройство, чтобы использовать файл Necromant_Linux.img как блочное устройство

losetup -D
LOOP_DEVICE=$(losetup -f)
losetup -P ${LOOP_DEVICE} Necromant_Linux.img

Создаём раздел на loopback-устройстве

sfdisk ${LOOP_DEVICE} << EOF
,,83,*
EOF

Форматируем раздел

mkfs.ext4 ${LOOP_DEVICE}p1

Монтируем loopback-устройство

mount ${LOOP_DEVICE}p1 /mnt/
mkdir /mnt/proc /mnt/dev/ /mnt/sys /mnt/tmp
mount --bind /proc /mnt/proc
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount --bind /tmp /mnt/tmp

Выполняем установку минимальной системы, под управлением которой будет исполняться скрипта установщика

apt-get install -c ~/apt/apt.conf.${BRANCH}.${ARCH} -o "RPM::RootDir=/mnt" -y lilo gzip e2fsprogs sfdisk rpm sysvinit startup mingetty login apt

Скопировать файлы vmlinuz, initrd.img, заранее извлечённые из iso-образа jeos. Загрузочная система будет жаловаться на отсутствие модулей в каталоге /lib/modeles/…, но это не критично, так как все возможные модули для работы с дисковыми устройствами уже встроены в initrd, вроде бы.

cp vmlinuz initrd.img /mnt/boot

Устанавливаем загрузчик. Отредактировать lilo.conf. Прописать в append=“root=…” UUID корневого раздела. Его можно узнать через lsblk.

ROOT_UUID=$(lsblk -f ${LOOP_DEVICE}p1 | awk 'NR==2 {print $4}')
cat <<EOF > /mnt/etc/lilo.conf
lba32
map = /boot/map
timeout = 50
prompt
vga = normal
compact

bitmap=/boot/FreeCrunchTime.bmp
bmp-colors=6,0,0,6,0,2
bmp-table=10p,10p
bmp-timer=20p,50p,6,0,0

### LILO per-image section ###

image = /boot/vmlinuz
        label = "Install_Necromant_Linux"
        read-only
        initrd = /boot/initrd.img
        append="root=/dev/disk/by-uuid/${ROOT_UUID} earlyprintk=ttyS0"
EOF
cp FreeCrunchTime.bmp /mnt/boot/FreeCrunchTime.bmp

Примечание: earlyprintk=ttyS0 - нужный параметр, без него может возникнуть kernel offset. Часто этот параметр помогает, но может и не помочь.

Создать /etc/fstab

cat <<EOF > /mnt/etc/fstab
proc            /proc                   proc    nosuid,noexec,gid=proc                          0 0
devpts          /dev/pts                devpts  nosuid,noexec,gid=tty,mode=620,ptmxmode=0666    0 0
tmpfs           /tmp                    tmpfs   nosuid                                          0 0
UUID=${ROOT_UUID}       /       ext4    noatime 1       1
EOF

Скопировать локальный репозиторий rpm-пакетов в образ

mkdir -p /mnt/source/rpms
cp ~/apt/cache/$BRANCH/archives/*.rpm /mnt/source/rpms

К сожалению в p11 нет пакета с драйверами на видеокарт nvidia, эти пакеты были вытащены из образа alt gnustep, их тоже надо включить в образ

cp kernel-image-std-def-i586.rpm kernel-modules-drm-std-def-i586.rpm kernel-modules-drm-nouveau-std-def-i586.rpm /mnt/source/rpms

Скопировать подготовленные специфичные для дистрибутива файлы

mkdir /mnt/source/files ; cd /mnt/source/files
cp -r /home/lamer/.icewm/ ./icewm
cp -r /home/lamer/.idesktop/ ./idesktop/
cp /home/lamer/.xxkbrc ./xxkbrc
cp /home/lamer/.ideskrc ./ideskrc
mkdir idesk_images
cp /usr/bin/ptrscr.h ./ptrscr.h
cp /usr/local/share/idesk/* idesk_images/
cp /etc/locale.conf ./
cp /etc/sysconfig/i18n ./
cp /etc/sysconfig/clock ./
cp /etc/chrony.conf ./
cp -r /home/lamer/.config/xfe/ ./
mkdir xfe_pixmaps 
cp /usr/share/pixmaps/xfe* ./xfe_pixmaps
cp -r /usr/share/xfe/icons/necromant-theme ./
cp /etc/X11/xorg.conf.d/10-evdev.conf ./
cp /etc/X11/wdm/wdm-config ./
cp /usr/share/pixmaps/wdm/herzen_ai.jpeg ./
cp -r /etc/apt ./
cp /etc/inittab ./
cp /etc/rc.d/rc.sysinit ./
cp /boot/FreeCrunchTime.bmp ./
cp /etc/resolv.conf ./
cp /usr/bin/simplebrowser ./
cp /etc/udev/rules.d/10-local-usb-storage.rules ./
cp /usr/bin/media-mount ./
cd ~/

Скопировать скрипт установщика в образ

cp necromant-install /mnt/bin/necromant-install
chroot /mnt chmod +x /bin/necromant-install

Задать пустой пароль root'у

chroot /mnt usermod -p "" root

Запись образа на флешку

umount -l /mnt
losetup -D
FLASH_DEVICE=/dev/sdX # Подставить своё значение
dd if=Necromant_Linux.img of=${FLASH_DEVICE} bs=4M status=progress conv=fsync

Установка загрузчика на флешку

mount ${FLASH_DEVICE}1 /mnt
mount --bind /proc /mnt/proc
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
chroot /mnt lilo -b ${FLASH_DEVICE}
umount -l /mnt

Получение загружаемого установочного образа

Есть проблемы с созданием загрузочной записи непосредственно на петлевом устройстве. Проще всего создать её на физическом устройстве и записать образ с загрузочной записью с флешки обратно в файл.

dd if=${FLASH_DEVICE} of=Necromant_Linux_bootable.img bs=1024M count=2 conv=fsync

Скрипт установщика

#!/bin/bash

WARN_COLOR='\033[1;31m'
NO_COLOR='\033[0m'

# Ожидаем от пользователя подтверждения желания установить систему
echo ""
echo -en "${WARN_COLOR}Do you realy want to install the system? This will erase all the data on the your hard drive.${NO_COLOR}"
while [ "$ANSW" != "no" ] && [ "$ANSW" != "yes" ]
do
    echo ""
    read -p "Enter 'yes' or 'no': " ANSW
done

if [ "$ANSW" = "no" ]
then
    echo ""
    echo -en "${WARN_COLOR}I will be glad to see you again${NO_COLOR}"
    echo ""
    /sbin/poweroff
    exit
fi

# Создать разделы на диске и отформатировать их
# Х3 как создать 5 разделов
echo ""
echo -en "${WARN_COLOR}Parting hard drive.${NO_COLOR}"
echo ""
echo -en "${WARN_COLOR}Your disk structure:${NO_COLOR}"
echo ""

lsblk

echo ""
echo -en "${WARN_COLOR}Enter the name of the disk to be partitioned (for example /dev/sda): ${NO_COLOR}"
read DISK_NAME

# Зачистка сигнатур файловых систем на разделах

PARTS_CNT=$( expr $(lsblk ${DISK_NAME} | grep -v NAME | wc -l) - 1 )
if [ "$PARTS_CNT" != "0" ]
then
  for (( i=1; i<=PARTS_CNT; i++ )); do
    dd if=/dev/zero of=${DISK_NAME}$i bs=4K count=1
    sync
  done
fi

# Зачистка таблицы разделов
dd if=/dev/zero of=${DISK_NAME} bs=4K count=1
sync

sfdisk ${DISK_NAME} << EOF
,2G,82
,15G,83,*
,15G,83
,,83
EOF

echo ""
echo ""
echo -en "${WARN_COLOR}Formating created partitions.${NO_COLOR}"
echo ""

mkswap -q ${DISK_NAME}1
mkfs.ext4 -q -F ${DISK_NAME}2
mkfs.ext4 -q -F ${DISK_NAME}3
mkfs.ext4 -q -F ${DISK_NAME}4

echo ""
echo -en "${WARN_COLOR}Partitioning and formatting are completed.${NO_COLOR}"
echo ""
echo -en "${WARN_COLOR}Press any key to continue.${NO_COLOR}"
echo ""
read

# Примонтировать разделы диска
mkdir /mnt/destination/
mount ${DISK_NAME}2 /mnt/destination/
mkdir -p /mnt/destination/var
mount ${DISK_NAME}3 /mnt/destination/var
mkdir -p /mnt/destination/home
mount ${DISK_NAME}4 /mnt/destination/home
mkdir -p /mnt/destination/dev
mkdir -p /mnt/destination/proc
mkdir -p /mnt/destination/sys
mkdir -p /mnt/destination/tmp
mount --bind /proc /mnt/destination/proc
mount --bind /dev /mnt/destination/dev
mount --bind /sys /mnt/destination/sys
mount --bind /tmp /mnt/destination/tmp

echo ""
echo -en "${WARN_COLOR}Mounting is completed.${NO_COLOR}"
echo ""
echo -en "${WARN_COLOR}Press any key to continue.${NO_COLOR}"
echo ""
read

# Установка пакетов в корень будущей системы на жёсткий диск
echo ""
echo -en "${WARN_COLOR}Installing packages on a hard drive in the name of all that is holy!${NO_COLOR}"
echo ""

apt-get install -o "RPM::RootDir=/mnt/destination" -y $(ls /source/rpms/*.rpm)

echo ""
echo -en "${WARN_COLOR}Installing packages is completed.${NO_COLOR}"
echo ""

cat <<EOF > /mnt/destination/etc/fstab
# <fs>       <mountpoint>    <type>    <opts>      <dump/pass>
proc         /proc           proc      nosuid,noexec,gid=proc      0 0
devpts       /dev/pts        devpts    nosuid,noexec,gid=tty,mode=620,ptmxmode=0666 0 0
tmpfs        /tmp            tmpfs     nosuid        0 0
${DISK_NAME}1    swap            swap      defaults    0 0
${DISK_NAME}2    /               ext4      noatime     1 1
${DISK_NAME}3    /var            ext4      nosuid,noatime    1 2
${DISK_NAME}4    /home           ext4      nosuid,noatime    1 2
EOF

sleep 20s

# Копирование специфичных для дистрибутива файлов
echo ""
echo -en "${WARN_COLOR}Copying distribution-specific files${NO_COLOR}"
echo ""
echo -en "${WARN_COLOR}Press any key to continue.${NO_COLOR}"
echo ""
read


# TODO: Заменить начала имён на переменные окружения
cp -rf /source/files/icewm /mnt/destination/etc/skel/.icewm
cp -rf /source/files/idesktop /mnt/destination/etc/skel/.idesktop
cp -f /source/files/ideskrc /mnt/destination/etc/skel/.ideskrc
cp -f /source/files/xxkbrc /mnt/destination/etc/skel/.xxkbrc
cp -f /source/files/ptrscr.h /mnt/destination/usr/bin/ptrscr.h
cp -rf /source/files/idesk_images/ /mnt/destination/usr/local/share/idesk
cp -rf /source/files/xfe/ /mnt/destination/etc/skel/.config/xfe
cp -f /source/files/xfe_pixmaps/xfe* /mnt/destination/usr/share/pixmaps/
cp -rf /source/files/necromant-theme /mnt/destination/usr/share/xfe/icons/necromant-theme
cp -f /source/files/locale.conf /mnt/destination/etc/locale.conf
cp -f /source/files/i18n /mnt/destination/etc/sysconfig/i18n
cp -f /source/files/clock /mnt/destination/etc/sysconfig/clock
cp -f /source/files/chrony.conf /mnt/destination/etc/chrony.conf
cp -f /source/files/10-evdev.conf /mnt/destination/etc/X11/xorg.conf.d/10-evdev.conf
cp -f /source/files/wdm-config /mnt/destination/etc/X11/wdm/wdm-config
cp -f /source/files/herzen_ai.jpeg /mnt/destination/usr/share/pixmaps/wdm/herzen_ai.jpeg
cp -f /source/files/inittab /mnt/destination/etc/inittab
cp -f /source/files/rc.sysinit /mnt/destination/etc/rc.d/rc.sysinit
#cp -f /source/files/resolv.conf /mnt/destination/etc/resolv.conf
cp -f /source/files/simplebrowser /mnt/destination/usr/bin/simplebrowser
cp -f /source/files/FreeCrunchTime.bmp /mnt/destination/boot/FreeCrunchTime.bmp
cp -rf /source/files/apt /mnt/destination/etc/
cp -f /source/files/10-local-usb-storage.rules /mnt/destination/etc/udev/rules.d/10-local-usb-storage.rules
cp -f /source/files/media-mount /mnt/destination/usr/bin/media-mount

echo ""
echo -en "${WARN_COLOR}Copying is completed${NO_COLOR}"
echo ""

# Назначение имени хоста
echo ""
echo -en "${WARN_COLOR}Enter the hostname: ${NO_COLOR}"
read HOSTNAME
echo ""

cat <<EOF > /mnt/destination/etc/hostname
${HOSTNAME}
EOF

cat <<EOF > /mnt/destination/etc/sysconfig/network
NETWORKING=yes
CONFMETHOD=etcnet
HOSTNAME=${HOSTNAME}
RESOLV_MODS=yes
EOF

# Выполняем действия непосредсвенно на жёстком диске с помощью chroot

# Настройка сети
echo ""
echo -en "${WARN_COLOR}Network setup. Unfortunately, at the moment, the installer can only set up a wired connection using DHCP.${NO_COLOR}"
echo ""
echo -en "${WARN_COLOR}All network interfaces of your computer:${NO_COLOR}"
echo ""
chroot /mnt/destination ifconfig -a | grep Link | grep -v Loopback
echo ""
echo -en "${WARN_COLOR}Now select the wired interface. It can be called as enpX lily ethX.${NO_COLOR}"
echo ""
echo -en "${WARN_COLOR}Enter the interface name: ${NO_COLOR}"
read NETINTERFACE

cat <<EOF > /mnt/destination/etc/init.d/network_dhcp_up
#!/bin/bash

ifconfig lo up
ifconfig lo 127.0.0.1
ifconfig ${NETINTERFACE} up
dhcpcd ${NETINTERFACE}
EOF

chmod +x /mnt/destination/etc/init.d/network_dhcp_up

# Настройка часового пояса

chroot /mnt/destination ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

# Назначение пароля руту и создание обычного пользователя

echo ""
echo -en "${WARN_COLOR}Assigning password for root.${NO_COLOR}"
echo ""
chroot /mnt/destination passwd root

echo ""
echo -en "${WARN_COLOR}Enter the name of the your user: ${NO_COLOR}"
read USER_NAME
echo ""
chroot /mnt/destination adduser ${USER_NAME}
chroot /mnt/destination passwd ${USER_NAME}


# Перегенерировать initrd, подставив свою версию ядра

echo ""
echo -en "${WARN_COLOR}Generation initrd ${NO_COLOR}"
echo ""
echo -en "${WARN_COLOR}Press any key to continue.${NO_COLOR}"
echo ""
read

KERNEL_VERSION=6.1.111-std-def-alt0.p11.1
chroot /mnt/destination make-initrd --kernel=${KERNEL_VERSION}

chroot /mnt/destination xsetup-monitor -d nouveau


# Установка загрузчика

echo ""
echo -en "${WARN_COLOR}Installing The LILO bootloader${NO_COLOR}"
echo ""
echo -en "${WARN_COLOR}Press any key to continue.${NO_COLOR}"
echo ""
read

cat <<EOF > /mnt/destination/etc/lilo.conf
lba32
boot = ${DISK_NAME}
root = ${DISK_NAME}2
map = /boot/map
timeout = 30
prompt
vga = normal
compact

bitmap=/boot/FreeCrunchTime.bmp
bmp-colors=6,0,0,6,0,2
bmp-table=10p,10p
bmp-timer=20p,50p,6,0,0

### LILO per-image section ###

image = /boot/vmlinuz
        label = "Necromant_Linux"
        read-only
        initrd = /boot/initrd.img
        append = "root=/dev/disk/by-uuid/$(lsblk -f ${DISK_NAME}2 | awk 'NR==2 {print $4}')"
EOF

chroot /mnt/destination /sbin/lilo

# Eщё кое-что по мелочи

# Создаём символическую ссылку для запуска network_dhcp_up на пятом ранлевеле
chroot /mnt/destination ln -s /etc/init.d/network_dhcp_up /etc/rc5.d/S10network_dhcp_up
# Задаём свою очерёдность запуска для дисплейного менеджера
chroot /mnt/destination rm -f /etc/rc5.d/S*dm
chroot /mnt/destination ln -s /etc/init.d/dm /etc/rc5.d/S01dm

chroot /mnt/destination chmod u+s /sbin/poweroff /sbin/reboot
chroot /mnt/destination chmod +x /usr/bin/simplebrowser
chroot /mnt/destination chmod +x /etc/rc.d/rc.sysinit

chroot /mnt/destination rm -rf /usr/share/X11/icewm/themes/AltClearlooks

chroot /mnt/destination rm -f /etc/init.d/netfs
chroot /mnt/destination rm -f /etc/rc5.d/S*netfs
mkdir -p /mnt/destination/var/lock/subsys/

echo ""
echo -en "${WARN_COLOR}Unmounting resouces and hard drive then reboot. ${NO_COLOR}"
echo ""
echo -en "${WARN_COLOR}Press any key to continue.${NO_COLOR}"
echo ""
read


umount -l /mnt/destination/var /mnt/destination/home /mnt/destination/dev /mnt/destination/sys /mnt/destination/proc /mnt/destination/tmp /mnt/destination/
rm -rf /mnt/destination
/sbin/reboot


# TODO:
# Установка времени должна быть первым делом
# Установка дистрибутива на свободное место на жёстком диске