#!/bin/bash
# Minimal загружаемый Linux образ за 5 минут
# Работает на Debian/Ubuntu. Для других дистрибутивов поменяй apt на свой пакетный менеджер
set -e # остановка при любой ошибке
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'
echo -e "${GREEN}[1/6] Установка зависимостей...${NC}"
sudo apt update
sudo apt install -y gcc make git libelf-dev libssl-dev bc bison flex qemu-system-x86 wget
# Создаём временную папку
WORK_DIR="$HOME/minimal-linux"
mkdir -p "$WORK_DIR"
cd "$WORK_DIR"
echo -e "${GREEN}[2/6] Скачивание и сборка BusyBox...${NC}"
if [ ! -d busybox ]; then
git clone --depth=1 https://git.busybox.net/busybox
fi
cd busybox
make allyesconfig
# Включаем статическую линковку
sed -i 's/# CONFIG_STATIC is not set/CONFIG_STATIC=y/' .config
make oldconfig
make -j$(nproc)
make install
cd ..
echo -e "${GREEN}[3/6] Создание rootfs...${NC}"
rm -rf rootfs
mkdir -p rootfs
cp -r busybox/_install/* rootfs/
cd rootfs
mkdir -p proc sys dev etc/init.d
# Создаём init скрипт
cat > init << 'EOF'
#!/bin/sh
# Монтируем псевдо-файловые системы
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
echo "=== Minimal Linux System ==="
echo "Это не полноценный LFS, но рабочий shell!"
echo "Доступные команды: ls, ps, cat, echo, mount, и др."
echo "Для выхода наберите 'poweroff -f'"
echo "============================"
# Запускаем shell
exec /bin/sh
EOF
chmod +x init
cd ..
echo -e "${GREEN}[4/6] Скачивание и сборка ядра...${NC}"
if [ ! -d linux ]; then
git clone --depth=1 https://github.com/torvalds/linux
fi
cd linux
make defconfig
# Конфигурируем ядро для работы с initramfs
scripts/config --enable CONFIG_BLK_DEV_INITRD
scripts/config --enable CONFIG_INITRAMFS_SOURCE
scripts/config --set-str CONFIG_INITRAMFS_SOURCE "$WORK_DIR/rootfs"
scripts/config --enable CONFIG_DEVTMPFS
scripts/config --enable CONFIG_TTY
scripts/config --enable CONFIG_SERIAL_8250
scripts/config --enable CONFIG_SERIAL_8250_CONSOLE
make olddefconfig
make -j$(nproc) bzImage
cd ..
echo -e "${GREEN}[5/6] Создание загрузочного ISO (опционально)...${NC}"
# Создаём простой ISO через syslinux (если нужно)
if command -v xorriso &> /dev/null; then
mkdir -p iso_root/boot/syslinux
cp linux/arch/x86/boot/bzImage iso_root/boot/vmlinuz
cat > iso_root/boot/syslinux/syslinux.cfg << 'EOF'
DEFAULT linux
LABEL linux
KERNEL /boot/vmlinuz
APPEND console=tty0 console=ttyS0
EOF
xorriso -as mkisofs -b boot/syslinux/isolinux.bin \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-o minimal-linux.iso iso_root/ 2>/dev/null || true
echo -e "${GREEN}ISO создан: minimal-linux.iso${NC}"
else
echo "Установи xorriso для создания ISO: sudo apt install xorriso"
fi
echo -e "${GREEN}[6/6] Запуск в QEMU...${NC}"
echo -e "${GREEN}Система загрузится через 2 секунды...${NC}"
echo "Для выхода из QEMU нажми Ctrl+A, затем X"
sleep 2
qemu-system-x86_64 \
-kernel linux/arch/x86/boot/bzImage \
-append "console=ttyS0 panic=-1" \
-nographic \
-m 256M \
-no-reboot