Для вашего собственного дистрибутива, мы предлагаем вам основываться на самой минимальной сборке ALT Linux - jeos-sysv, вы можете найти её по этой ссылке. Этот дистрибутив надо будет установить непосредственно на компьютер или на виртуальную машину, далее удалить из него лишние на ваш взгляд пакеты и установить все нужные лично вам. По ходу выполнения данной задачи, рекомендуем сохранять в какой-нибудь текстовый файл имена пакетов, которые вы устанавливаете, и полные имена конфигурационных файлов, которые вы модифицируете. Они вам могут пригодиться в будущем.
Поскольку мы не приемлим использование таких команд как sudo и su для повышения полномочий обычного пользователя, в наших дистрибутивах их нет. Если они вам нужны (знал бы чёрт зачем), вы можете их установить их для себя также, как и все другие программы.
В случает сборки установочного образа по данной инструкции, мы предлагаем вам после установки всех нужных вам пакетов, которые попадут в установочный образ, открыть данную инструкцию и выполнять все команды от имени суперпользователя в графической сессии. Для удобства вы можете расположить инструкцию в одной половине экрана, а в другой открыть терминал и залогиниться под root'ом следующим образом
ssh root@localhost
Далее вы можете просто выделять команды и вставлять их в терминал, поправляя их местами, если если это необходимо. Можно вставлять в темринал сразу несколько команд, в том числе и многострочные команды
cat <<EOF > anyfile foo bar baz EOF
Их надо выделять от первой до последней строки и полностью вставлять в командрую строку.
Выделяемые команды из инструкции одинакого хорошо можно вставлять в терминал как с помощью средней кнопки мыши, так и с помощью сочетания Shift+Insert.
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
Возьмите готовый pkglist и отредактируйте его при необходимости. Когда скачаете этот файл, удалите суффикс из имени.
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
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
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:
# Установка времени должна быть первым делом
# Установка дистрибутива на свободное место на жёстком диске