====== Сборка установочного образа ALT Linux без mkimage-profiles ====== Для вашего собственного дистрибутива, мы предлагаем вам основываться на самой минимальной сборке ALT Linux - jeos-sysv, вы можете найти её по [[https://nightly.altlinux.org/p10/release/|этой ссылке]]. Этот дистрибутив надо будет установить непосредственно на компьютер или на виртуальную машину, далее удалить из него лишние на ваш взгляд пакеты и установить все нужные лично вам. По ходу выполнения данной задачи, рекомендуем сохранять в какой-нибудь текстовый файл имена пакетов, которые вы устанавливаете, и полные имена конфигурационных файлов, которые вы модифицируете. Они вам могут пригодиться в будущем. Поскольку мы не приемлим использование таких команд как sudo и su для повышения полномочий обычного пользователя, в наших дистрибутивах их нет. Если они вам нужны (знал бы чёрт зачем), вы можете их установить их для себя также, как и все другие программы. В случает сборки установочного образа по данной инструкции, мы предлагаем вам после установки всех нужных вам пакетов, которые попадут в установочный образ, открыть данную инструкцию и выполнять все команды от имени суперпользователя в графической сессии. Для удобства вы можете расположить инструкцию в одной половине экрана, а в другой открыть терминал и залогиниться под root'ом следующим образом ssh root@localhost Далее вы можете просто выделять команды и вставлять их в терминал, поправляя их местами, если если это необходимо. Можно вставлять в темринал сразу несколько команд, в том числе и многострочные команды cat < anyfile foo bar baz EOF Их надо выделять от первой до последней строки и полностью вставлять в командрую строку. Выделяемые команды из инструкции одинакого хорошо можно вставлять в терминал как с помощью средней кнопки мыши, так и с помощью сочетания Shift+Insert. ===== Настройка apt ===== BRANCH=p10 ARCH=i586 BITS=32 Чтобы собрать образ для другой архитектуры, вы должны подставить другие значения указанным выше переменным. Возможные значения: * для BRANCH - p11 p10 p9 sisyphus * для ARCH - i586 x86_64 * для BITS - 32 64 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 < ~/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 < ~/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 < /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 < /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 < /mnt/destination/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 ${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 < /mnt/destination/etc/hostname ${HOSTNAME} EOF cat < /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 < /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 < /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: # Установка времени должна быть первым делом # Установка дистрибутива на свободное место на жёстком диске