cloudos справочник
установка cloudos 1.0 на x86_64.
1. о cloudos
cloudos это минимальный linux, который ты собираешь сам. после установки в системе только консоль.
| параметр | значение |
|---|---|
| архитектура | x86_64 |
| libc | glibc |
| init | openrc |
| ядро | ванильное с kernel.org |
| загрузчик | limine |
| файловые системы | ext4 и btrfs |
| пакеты | только из исходников, команда cloudpkg |
1.1 что нужно
| что | ориентир |
|---|---|
| процессор | x86_64. arm не поддерживается |
| озу | от 2 гб, для сборки ядра и пакетов лучше 4 гб и больше |
| диск | от 10 гб, под сборку пакетов лучше 20 гб и больше |
| загрузка | uefi или старый bios |
| сеть | проводная, адрес по dhcp |
| носитель | флешка с live iso cloudos |
цифры примерные, жёстких проверок нет.
1.2 что внутри stage 3
stage 3 собран с нуля по lfs 12.4 (sysv-вариант) и дополнен всем, что нужно для установки и сборки пакетов. версии указаны для cloudos 1.0.
| часть | что внутри |
|---|---|
| инструментарий | gcc 15.2.0, glibc 2.42, binutils 2.45, python 3.13.7 |
| init | openrc 0.63, /sbin/init указывает на openrc-init |
| устройства и консоль | udev, agetty на tty1 |
| журнал | sysklogd |
| сеть | dhcpcd 10.1.0, curl 8.15.0, git 2.51.0, ca-certificates |
| права | opendoas 6.8.2 вместо sudo |
| редактор | nano 8.4 |
| диски | dosfstools 4.2, btrfs-progs 6.16.1, ext4 из e2fsprogs |
| загрузка | dracut-ng для initramfs. ядра и загрузчика в stage 3 нет |
1.3 чего в системе нет
- графики и окружений рабочего стола. после установки только консоль
- man-страниц. справка это этот справочник и ключ
--help - ssh-сервера и фаервола
- sudo. вместо него doas
- пользователей кроме root, локалей и swap. их создаёшь сам
- загрузчика и ядра. ядро собираешь, загрузчик ставишь через пакетный менеджер
1.4 порядок установки
- загрузись с live iso, проверь сеть и режим загрузки
- размеч диск и создай файловые системы
- скачай и распакуй stage 3
- зайди в chroot и настрой сборку
- собери ядро
- сделай initramfs, fstab и поставь limine
- задай пароль, включи службы и перезагрузись
- настрой систему после первой загрузки
1.5 как пользоваться справочником
в левой панели сверху переключатель uefi и bios. выбери свой режим, и в справочнике останутся только нужные команды. выбор запоминается в браузере.
поиск открывается кнопкой в шапке или клавишами ctrl + k. у каждого блока с командой справа сверху кнопка копирования.
в командах встречаются заглушки, их надо заменить на свои значения:
| заглушка | что подставить |
|---|---|
/dev/sda, /dev/sda1, /dev/sda2 | свой диск и разделы из lsblk. у nvme имена другие, смотри приложение а |
ROOT_UUID | uuid корневого раздела из blkid |
ESP_UUID, BOOT_UUID | uuid раздела /boot из blkid |
6.18.10 | версия ядра, если собираешь другую |
2. подготовка
загрузись с live iso cloudos и проверь сеть.
dhcpcd
ping -c1 github.com
определи режим загрузки.
[ -d /sys/firmware/efi ] && echo uefi || echo bios
2.1 дата и время
если дата в системе неверная, https-сертификаты не пройдут проверку и скачивание будет падать с непонятными ошибками. проверь дату:
date
если она сильно отличается от настоящей, выставь вручную (формат год-месяц-день час:минуты:секунды):
date -s "YYYY-MM-DD HH:MM:SS"
2.2 диски
посмотри диски и разделы. нужное имя диска дальше подставляется везде вместо /dev/sda.
lsblk -f
sata и usb диски называются sda, sdb, nvme это nvme0n1, виртуальные vda. узнать, какой из них флешка с live iso, можно по размеру.
2.3 сеть
проверь, что интерфейс виден и получил адрес:
ip link
ip addr
если адреса нет, запусти dhcpcd ещё раз для нужного интерфейса (имя смотри в ip link):
dhcpcd eth0
из коробки настроена только проводная сеть. wifi в live iso не настраивается.
2.4 если сайты не открываются
github, kernel.org и некоторые зеркала могут быть недоступны из твоей сети. тогда скачай файл на другом устройстве и перенеси на флешку:
mkdir -p /mnt/usb
mount /dev/sdb1 /mnt/usb
ls /mnt/usb
вместо /dev/sdb1 подставь раздел своей второй флешки из lsblk. для ядра есть зеркала, смотри 7.3.
3. диск и файловые системы
3.1 разметка
cfdisk /dev/sda
| режим | таблица | разделы |
|---|---|---|
| uefi | gpt | sda1 512 мб, тип efi system. sda2 остальное |
| bios | dos | sda1 512 мб, флаг bootable, это /boot. sda2 остальное |
3.2 файловые системы
для uefi раздел /boot форматируется в fat32:
mkfs.fat -F32 /dev/sda1для bios раздел /boot всегда fat32:
mkfs.fat -F32 /dev/sda1корневой раздел форматируй в ext4:
mkfs.ext4 /dev/sda2
или в btrfs:
mkfs.btrfs /dev/sda2
3.3 монтирование
mkdir -p /mnt/cloudos
mount /dev/sda2 /mnt/cloudos
mkdir -p /mnt/cloudos/boot
mount /dev/sda1 /mnt/cloudos/boot
3.4 пример схемы
| раздел | размер | тип | точка монтирования | файловая система |
|---|---|---|---|---|
| sda1 | 512 мб | efi system | /boot | fat32 |
| sda2 | остальное | linux filesystem | / | ext4 или btrfs |
| раздел | размер | флаг | точка монтирования | файловая система |
|---|---|---|---|---|
| sda1 | 512 мб | bootable | /boot | fat32 |
| sda2 | остальное | - | / | ext4 или btrfs |
если нужен swap-раздел, сделай его третьим, а не первым. подробнее про swap в 10.7. swap можно сделать и файлом уже после установки, тогда отдельный раздел не нужен.
3.5 проверка
убедись, что всё смонтировано как надо:
lsblk -f
findmnt /mnt/cloudos
findmnt /mnt/cloudos/boot
корень должен быть на втором разделе, /boot на первом. если одна из команд ничего не вывела, раздел не смонтирован.
4. stage 3
stage 3 это готовая базовая система cloudos без ядра и загрузчика. файлы лежат в разделе releases репозитория.
github.com/wh1laye/cloudos-repo/releases
cloudos-stage3-1.0-x86_64.tar.xz
cloudos-stage3-1.0-x86_64.tar.xz.sha256
4.1 проверка(можно пропустить)
sha256sum -c cloudos-stage3-1.0-x86_64.tar.xz.sha256
4.2 распаковка
tar xpvf cloudos-stage3-1.0-x86_64.tar.xz --xattrs-include='*.*' --numeric-owner -C /mnt/cloudos
4.3 скачивание
скачивай прямо на корневой раздел, в live-системе мало места в памяти:
cd /mnt/cloudos
curl -LO https://github.com/wh1laye/cloudos-repo/releases/download/cloudos/cloudos-stage3-1.0-x86_64.tar.xz
curl -LO https://github.com/wh1laye/cloudos-repo/releases/download/cloudos/cloudos-stage3-1.0-x86_64.tar.xz.sha256
потом сделай проверку из 4.1 и распаковку из 4.2. распаковку запускай из той же папки, где лежит архив.
4.4 после распаковки
архив больше не нужен, удали его, чтобы не занимал место:
rm /mnt/cloudos/cloudos-stage3-1.0-x86_64.tar.xz*
ls /mnt/cloudos
в списке должны быть bin, boot, etc, usr, var и другие системные папки. если папка пустая, архив распаковался не туда.
5. вход в chroot
mount --types proc /proc /mnt/cloudos/proc
mount --rbind /sys /mnt/cloudos/sys
mount --make-rslave /mnt/cloudos/sys
mount --rbind /dev /mnt/cloudos/dev
mount --make-rslave /mnt/cloudos/dev
cp --dereference /etc/resolv.conf /mnt/cloudos/etc/
chroot /mnt/cloudos /bin/bash
source /etc/profile
5.1 что делают команды
| команда | зачем |
|---|---|
mount --types proc | даёт системе в chroot доступ к информации о процессах |
mount --rbind /sys, /dev | пробрасывает устройства и sysfs из live-системы внутрь |
--make-rslave | чтобы размонтирование внутри chroot не затронуло live-систему |
cp --dereference /etc/resolv.conf | переносит настройки dns, без них внутри chroot не будет имён сайтов |
chroot /mnt/cloudos /bin/bash | делает /mnt/cloudos корнем и запускает в нём bash |
source /etc/profile | подтягивает пути и переменные окружения cloudos |
5.2 приглашение
чтобы не забыть, что ты в chroot, поменяй приглашение:
export PS1="(cloudos chroot) $PS1"
5.3 войти повторно
если ты перезагрузил live iso или вышел из chroot, снова смонтируй разделы и повтори вход. архив заново распаковывать не нужно:
mount /dev/sda2 /mnt/cloudos
mount /dev/sda1 /mnt/cloudos/boot
mount --types proc /proc /mnt/cloudos/proc
mount --rbind /sys /mnt/cloudos/sys
mount --make-rslave /mnt/cloudos/sys
mount --rbind /dev /mnt/cloudos/dev
mount --make-rslave /mnt/cloudos/dev
cp --dereference /etc/resolv.conf /mnt/cloudos/etc/
chroot /mnt/cloudos /bin/bash
source /etc/profile
так же заходишь в систему для починки, если она перестала грузиться, смотри 14.9.
5.4 выход
exit
umount -R /mnt/cloudos
если размонтирование пишет target is busy, закрой все окна терминала, где ты был в chroot, и повтори.
6. настройка сборки
флаги сборки задаются в одном файле, /etc/cloudpkg/make.conf:
CC="gcc"
CFLAGS="-O2 -march=native"
MAKEOPTS="-j$(nproc)"
USE=""
для clang поставь CC="clang". потом обнови список рецептов:
cloudpkg sync
6.1 локали
echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
localedef -i en_US -f UTF-8 en_US.UTF-8
echo "LANG=en_US.UTF-8" > /etc/locale.conf
6.2 флаги сборки
| параметр | что значит |
|---|---|
CC | компилятор: gcc или clang |
CFLAGS | флаги компиляции. -O2 это обычная оптимизация |
-march=native | код под процессор этой машины. быстрее, но не запустится на более старом процессоре |
-march=x86-64 | универсальный код, запустится на любом x86_64 |
MAKEOPTS | параметры make. -j это число параллельных задач |
USE | переключатели возможностей пакетов, по умолчанию пусто |
если собираешь на той же машине, где будешь работать, оставь -march=native. если потом перенесёшь диск на другой компьютер, замени на -march=x86-64. сам stage 3 собран с универсальными флагами.
6.3 параллельная сборка
-j$(nproc) запускает столько задач, сколько у процессора потоков. при малом объёме озу сборка может упасть с сообщением killed. тогда уменьши число:
MAKEOPTS="-j2"
6.4 gcc 15 и ошибки сборки
gcc 15 по умолчанию использует стандарт c23, и некоторые старые пакеты с ним не собираются. типичные признаки: ошибки про bool, true, false или объявления функций без аргументов. в этом случае верни прежний стандарт:
CC="gcc -std=gnu17"
меняй значение CC в /etc/cloudpkg/make.conf и повтори установку пакета.
7. ядро
ядро берётся с kernel.org и настраивается вручную
cd /usr/src
curl -LO https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.18.10.tar.xz
tar xf linux-6.18.10.tar.xz
cd linux-6.18.10
make menuconfig
make -j$(nproc)
make modules_install
cp arch/x86/boot/bzImage /boot/vmlinuz-6.18.10
7.1 что включить в menuconfig
в make menuconfig поиск открывается клавишей /, там можно найти любую опцию по имени. ядро без нужных драйверов не загрузится, поэтому проверь хотя бы эти пункты. звёздочка [*] значит встроено в ядро, M значит модуль.
| опция | зачем |
|---|---|
DEVTMPFS, DEVTMPFS_MOUNT | каталог /dev, нужен udev |
BLK_DEV_INITRD | загрузка с initramfs |
RD_GZIP, RD_XZ, RD_ZSTD | распаковка initramfs. включи все три, чтобы не гадать, как его сжал dracut |
EXT4_FS, BTRFS_FS | корневая файловая система. включай встроенно, не модулем |
VFAT_FS, FAT_FS, NLS_CODEPAGE_437, NLS_ISO8859_1 | раздел /boot на fat32 |
TMPFS, PROC_FS, SYSFS | базовые виртуальные файловые системы |
BLK_DEV_NVME | nvme диски |
ATA, SATA_AHCI, BLK_DEV_SD | sata диски |
USB_XHCI_HCD, USB_XHCI_PCI, USB_HID | usb порты и клавиатура |
NET, INET, PACKET, UNIX | сеть. без PACKET не заработает dhcpcd |
| драйвер сетевой карты | например E1000E у intel, R8169 у realtek. узнай свою карту командой lspci в live iso |
INOTIFY_USER, SIGNALFD, TIMERFD, EPOLL, FHANDLE | нужны udev |
CGROUPS | нужны openrc |
VT, VT_CONSOLE, FRAMEBUFFER_CONSOLE, DRM_SIMPLEDRM | вывод консоли на экран без драйвера видеокарты |
firmware, которых в stage 3 нет. без драйвера консоль всё равно работает через DRM_SIMPLEDRM.удобный старт: если live iso собран с поддержкой /proc/config.gz, возьми его конфиг за основу и дополни:
zcat /proc/config.gz > .config
make olddefconfig
make menuconfig
7.2 что делают команды сборки
| команда | зачем |
|---|---|
make menuconfig | настройка ядра, результат пишется в файл .config |
make -j$(nproc) | сборка ядра, занимает от нескольких минут до часа в зависимости от процессора |
make modules_install | ставит модули в /lib/modules/6.18.10, они нужны dracut |
cp arch/x86/boot/bzImage | кладёт само ядро в /boot |
сохрани конфиг и карту символов, они пригодятся при обновлении ядра:
cp .config /boot/config-6.18.10
cp System.map /boot/System.map-6.18.10
7.3 зеркала ядра
если cdn.kernel.org не открывается, скачай тот же архив с зеркала:
curl -LO https://mirrors.aliyun.com/linux-kernel/v6.x/linux-6.18.10.tar.xz
curl -LO https://mirrors.ustc.edu.cn/kernel.org/linux/kernel/v6.x/linux-6.18.10.tar.xz
пути на зеркалах иногда меняются. если ссылка не работает, открой каталог зеркала в браузере и найди файл вручную.
7.4 другая версия ядра
во всех командах замени 6.18.10 на свою версию. имена файлов в /boot, в initramfs и в limine.conf должны совпадать.
8. загрузчик
8.1 initramfs
cloudpkg install dracut
dracut --kver 6.18.10 /boot/initramfs-6.18.10.img
8.2 fstab
uuid разделов покажет blkid. файл /etc/fstab для uefi:
UUID=ROOT_UUID / ext4 defaults 0 1
UUID=ESP_UUID /boot vfat defaults 0 2
для bios:
UUID=ROOT_UUID / ext4 defaults 0 1
UUID=BOOT_UUID /boot vfat defaults 0 2
если корень на btrfs, замени ext4 в первой строке на btrfs.
8.3 limine
cloudpkg install limine
файл /boot/limine.conf одинаковый для uefi и bios:
timeout: 5
/CloudOS
protocol: linux
path: boot():/vmlinuz-6.18.10
cmdline: root=UUID=ROOT_UUID rw
module_path: boot():/initramfs-6.18.10.img
установка для uefi:
mkdir -p /boot/EFI/BOOT
cp /usr/share/limine/BOOTX64.EFI /boot/EFI/BOOT/BOOTX64.EFIустановка для bios, ставь на раздел:
cp /usr/share/limine/limine-bios.sys /boot/
limine bios-install /dev/ (твое имя диска /dev/sda1 /dev/sdb1 /dev/nvme0n1)8.4 проверка перед перезагрузкой
посмотри, что лежит в /boot:
ls -l /boot
должны быть vmlinuz-6.18.10, initramfs-6.18.10.img, limine.conf и папка EFI/BOOT с файлом BOOTX64.EFI.
должны быть vmlinuz-6.18.10, initramfs-6.18.10.img, limine.conf и limine-bios.sys.
сверь uuid в конфигах с настоящими:
blkid
grep UUID /etc/fstab /boot/limine.conf
uuid корневого раздела в limine.conf и в fstab должны совпадать с выводом blkid. большинство неудачных первых загрузок из-за опечатки здесь.
8.5 запись в nvram (только uefi, по желанию)
в режиме bios этот шаг не нужен.
файл BOOTX64.EFI в EFI/BOOT прошивка находит сама, и этого достаточно. если хочешь отдельный пункт в меню загрузки, создай его командой из live iso (не из chroot):
efibootmgr --create --disk /dev/sda --part 1 --loader '\EFI\BOOT\BOOTX64.EFI' --label CloudOS
для диска nvme: --disk /dev/nvme0n1 --part 1. в настройках прошивки отключи secure boot, limine без подписи не загрузится.
8.6 несколько ядер
перед обновлением ядра добавь второй пункт в /boot/limine.conf, а старый не удаляй. если новое ядро не загрузится, выберешь старое в меню:
timeout: 5
/CloudOS
protocol: linux
path: boot():/vmlinuz-NEW
cmdline: root=UUID=ROOT_UUID rw
module_path: boot():/initramfs-NEW.img
/CloudOS (старое ядро)
protocol: linux
path: boot():/vmlinuz-OLD
cmdline: root=UUID=ROOT_UUID rw
module_path: boot():/initramfs-OLD.img
вместо NEW и OLD подставь версии ядер.
8.7 grub вместо limine
если хочешь grub, поставь его вместо limine (внутри chroot, после установки ядра и initramfs):
cloudpkg sync
cloudpkg install sys-boot/grub
для uefi:
grub-install --target=x86_64-efi --efi-directory=/boot --boot-directory=/boot --removableдля bios:
grub-install --target=i386-pc --boot-directory=/boot /dev/sdaконфиг пишется вручную в /boot/grub/grub.cfg:
set timeout=5
menuentry "CloudOS" {
search --no-floppy --fs-uuid --set=root ESP_UUID
linux /vmlinuz-6.18.10 root=UUID=ROOT_UUID rw
initrd /initramfs-6.18.10.img
}
blkid (раздел /boot и корневой раздел). с btrfs добавь в строку linux параметр rootflags=subvol=@. мастер установки на сайте делает всё это сам.9. завершение
включи сеть и журнал, задай пароль root:
cloudpkg install dhcpcd
cloudpkg install syslog-ng
rc-update add dhcpcd default
rc-update add syslog-ng default
passwd
выйди из chroot, размонтируй и перезагрузись:
exit
umount -R /mnt/cloudos
reboot
9.1 проверка служб
перед перезагрузкой убедись, что службы добавлены:
rc-update show
в списке должны быть dhcpcd и журнал в уровне default.
9.2 первая загрузка
после перезагрузки вытащи флешку и выбери диск в меню загрузки, если он не выбрался сам. появится приглашение login: на tty1. введи root и пароль, который задал командой passwd.
дальше настрой систему, это описано в главе 10.
cloudpkg sync обновляет дерево рецептов, cloudpkg install имя ставит из исходников, cloudpkg doctor проверяет настройку.10. первая загрузка
после установки в системе только консоль и root. эта глава про то, что стоит сделать сразу.
10.1 вход
на приглашении login: введи root и пароль, который задал в главе 9. если не задал, пароль пустой, задай его сразу командой passwd.
10.2 пользователь и doas
работать под root постоянно небезопасно. создай обычного пользователя и разреши группе wheel пользоваться doas:
grep wheel /etc/group || groupadd wheel
useradd -m -G wheel -s /bin/bash имя
passwd имя
echo "permit :wheel" > /etc/doas.conf
chmod 0400 /etc/doas.conf
вместо имя подставь своё. дальше команды от root выполняются так:
doas cloudpkg install nano
если не хочешь вводить пароль каждый раз, замени правило на permit nopass :wheel. это удобнее, но безопаснее с паролем.
10.3 имя компьютера
echo "cloudos" > /etc/hostname
echo 'hostname="cloudos"' > /etc/conf.d/hostname
rc-update add hostname boot
если служба hostname уже включена, последняя команда сообщит об этом и ничего не изменит. вместо cloudos можно написать любое имя латиницей.
10.4 часовой пояс
ls /usr/share/zoneinfo
ln -sfv /usr/share/zoneinfo/Europe/Moscow /etc/localtime
вместо Europe/Moscow выбери свой пояс из списка. проверь результат командой date.
10.5 сеть
dhcpcd получает адрес и dns автоматически. проверь:
ip addr
ping -c1 github.com
если нужен постоянный адрес, добавь в /etc/dhcpcd.conf (имя интерфейса смотри в ip link):
interface eth0
static ip_address=192.168.1.50/24
static routers=192.168.1.1
static domain_name_servers=1.1.1.1 8.8.8.8
потом перезапусти службу: rc-service dhcpcd restart.
10.6 службы openrc
| команда | что делает |
|---|---|
rc-status | показывает запущенные службы |
rc-update show | показывает службы и уровни, на которых они включены |
rc-update add имя default | включает службу при загрузке |
rc-update del имя default | выключает автозапуск |
rc-service имя start | запускает службу сейчас |
rc-service имя stop | останавливает |
rc-service имя restart | перезапускает |
rc-service имя status | показывает состояние |
уровни: boot для того, что нужно на раннем этапе (например имя компьютера), default для обычных служб.
10.7 swap
swap не обязателен, но помогает при сборке больших пакетов на малом объёме озу. проще всего файлом.
для ext4:
dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
для btrfs (подходит и для ext4):
btrfs filesystem mkswapfile --size 4g /swapfile
swapon /swapfile
чтобы swap включался сам, добавь строку в /etc/fstab:
/swapfile none swap defaults 0 0
swap-раздел делают так: mkswap /dev/sda3, swapon /dev/sda3 и строка в fstab с UUID=... вместо /swapfile.
11. пакеты и cloudpkg
все пакеты в cloudos собираются из исходников. этим занимается менеджер cloudpkg. рецепты для него берутся из gentoo.
11.1 команды
| команда | что делает |
|---|---|
cloudpkg sync | обновляет список рецептов |
cloudpkg install имя | собирает и ставит пакет вместе с зависимостями |
cloudpkg remove имя | удаляет пакет |
cloudpkg upgrade | обновляет установленные пакеты до новых версий |
cloudpkg clean | чистит скачанные исходники и временные файлы сборки |
11.2 как проходит установка
- читается рецепт пакета и список его зависимостей
- исходники скачиваются через curl
- проверяется sha256
- пакет собирается с твоими флагами из
/etc/cloudpkg/make.conf - результат ставится в систему
сборка занимает время и место на диске. большие пакеты вроде компиляторов собираются долго, это нормально.
11.3 примеры
cloudpkg sync
cloudpkg install limine
cloudpkg install dracut
cloudpkg install nano
11.4 если пакет не собрался
- прочитай последние строки с
error - если ошибка про стандарт си, поставь
CC="gcc -std=gnu17", смотри 6.4 - если сборка падает с
killed, уменьши-jвMAKEOPTS - попробуй
cloudpkg syncи повтори, возможно рецепт уже исправлен - напиши на форум в раздел с вопросами, приложив последние 10-15 строк вывода
12. обслуживание
12.1 обновление пакетов
cloudpkg sync
cloudpkg upgrade
cloudpkg clean
12.2 обновление ядра
новую версию ставят рядом со старой. старое ядро не удаляй, пока не убедишься, что новое загружается.
- скачай и распакуй новое ядро в
/usr/src, как в главе 7 - возьми старый конфиг за основу и подтяни новые опции:
cd /usr/src/linux-НОВАЯ
cp /boot/config-СТАРАЯ .config
make olddefconfig
- собери и установи:
make -j$(nproc)
make modules_install
cp arch/x86/boot/bzImage /boot/vmlinuz-НОВАЯ
cp .config /boot/config-НОВАЯ
dracut --kver НОВАЯ /boot/initramfs-НОВАЯ.img
- добавь второй пункт в
/boot/limine.conf, как в 8.6, и перезагрузись - если всё работает, старые файлы можно удалить:
rm /boot/vmlinuz-СТАРАЯ /boot/initramfs-СТАРАЯ.img /boot/config-СТАРАЯ
rm -r /lib/modules/СТАРАЯ
вместо НОВАЯ и СТАРАЯ подставь версии, например 6.18.10.
12.3 резервная копия
полная копия системы одним архивом с теми же ключами, что и при распаковке stage 3. сохраняй её на другой диск или флешку:
tar cpf /mnt/usb/cloudos-backup.tar.xz --xattrs-include='*.*' --numeric-owner --one-file-system -I xz /
для btrfs есть снимки, они быстрее и занимают меньше места, смотри приложение б.
12.4 очистка места
df -h
cloudpkg clean
du -sh /usr/src/* /var/* 2>/dev/null
старые папки ядер в /usr/src можно удалять, если у тебя сохранены их конфиги в /boot.
13. что дальше
cloudos ставится минимальным. всё остальное ты добавляешь по мере необходимости.
| что | как |
|---|---|
| звук | pipewire ставишь сам через cloudpkg install, если для него есть рецепт |
| графика и окружение | по умолчанию нет. ставь компоненты вручную из рецептов, нужны будут драйвер видеокарты в ядре и файлы прошивок |
| ssh-сервер | по умолчанию нет. поставь пакет и включи службу через rc-update add |
| фаервол | по умолчанию нет |
| другие редакторы и утилиты | через cloudpkg install |
| man-страницы | не ставятся. используй команда --help и этот справочник |
13.1 другие локали
в главе 6.1 создана одна локаль. чтобы добавить ещё, например русскую:
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
echo "LANG=ru_RU.UTF-8" > /etc/locale.conf
в консоли ядра кириллица может отображаться некорректно без отдельного шрифта, поэтому для консоли безопаснее оставить en_US.UTF-8.
13.2 помощь и обратная связь
- вопросы и обсуждение на форуме
- новые версии и образы на странице релизов
- ошибки и предложения в issues на github
14. ошибки и решения
нажми на текст ошибки, чтобы увидеть причину и что делать. если твоей ошибки нет в списке, воспользуйся поиском.
14.1 live iso, сеть и время
ping: connect: network is unreachable или нет ответа
интерфейс не получил адрес. проверь кабель, потом:
ip link
dhcpcd eth0
имя интерфейса возьми из ip link. если интерфейса нет в списке, в live iso нет драйвера твоей сетевой карты.
ping по ip работает, по имени нет (temporary failure in name resolution)
не настроен dns. в live iso он берётся от dhcpcd. внутри chroot проверь, что был выполнен cp --dereference /etc/resolv.conf /mnt/cloudos/etc/.
certificate verify failed или ssl certificate problem
почти всегда неверная дата. выставь её по 2.1 и повтори. если не помогает, скачай файл на другом устройстве и перенеси на флешке.
curl: (6) could not resolve host или (7) failed to connect
нет сети или сайт недоступен из твоей сети. проверь ping на другой сайт. для github и kernel.org см. 2.4.
14.2 разметка и файловые системы
mount: unknown filesystem type или wrong fs type
раздел не отформатирован или ты указал не тот раздел. проверь lsblk -f: в колонке FSTYPE должна быть файловая система. если пусто, повтори форматирование из 3.2.
mount: special device does not exist
неверное имя раздела. nvme называются nvme0n1p1, а не nvme0n11, смотри приложение а.
mkfs.fat: command not found или mkfs.btrfs: command not found
в live iso нет нужной утилиты. dosfstools и btrfs-progs должны входить в образ, проверь, что у тебя актуальный iso.
cfdisk не видит диск
в live iso нет драйвера контроллера диска. для виртуалки выбери sata или nvme диск, а не нестандартный контроллер.
14.3 скачивание и распаковка
sha256sum: WARNING: 1 computed checksum did NOT match
файл скачался не полностью или повреждён. удали архив и скачай заново. убедись, что .sha256 файл и архив лежат в одной папке и имена совпадают.
tar: Unexpected EOF in archive или xz: file format not recognized
архив обрезан. скачай заново и сравни размер с тем, что указан на странице релизов.
tar: No space left on device
на разделе не хватило места или архив лежал в оперативной памяти live iso. скачивай прямо в /mnt/cloudos, как в 4.3, и проверь размер раздела командой df -h /mnt/cloudos.
14.4 chroot
chroot: failed to run command '/bin/bash': No such file or directory
stage 3 не распакован или распакован в другую папку. выполни ls /mnt/cloudos/bin. если папка пуста, вернись к 4.2.
mount: /mnt/cloudos/proc: mount point does not exist
то же самое, stage 3 не распакован, поэтому папок proc, sys, dev ещё нет.
внутри chroot не открываются сайты
скопируй dns-настройки ещё раз: cp --dereference /etc/resolv.conf /mnt/cloudos/etc/ (выполняется вне chroot).
umount: target is busy
какая-то программа ещё использует файлы. закрой все терминалы, где ты был в chroot, и повтори umount -R /mnt/cloudos.
14.5 сборка пакетов
ошибки про bool, true, false, prototype
старый пакет не собирается со стандартом c23, который включён в gcc 15. добавь в make.conf CC="gcc -std=gnu17", смотри 6.4.
gcc: fatal error: Killed signal terminated program cc1
не хватило оперативной памяти. уменьши -j в MAKEOPTS или включи swap, смотри 10.7.
sha256 не совпадает при скачивании исходников
файл на источнике мог измениться или скачался с ошибкой. запусти cloudpkg sync и повтори установку. если ошибка повторяется, напиши об этом на форуме.
No space left on device во время сборки
кончилось место. выполни cloudpkg clean и проверь df -h. под сборку пакетов лучше иметь 20 гб и больше.
14.6 ядро
make menuconfig: Unable to find the ncurses libraries
в системе нет ncurses с заголовками. поставь пакет через cloudpkg или используй make config (долго) либо перенеси готовый .config.
dracut: Cannot find module directory /lib/modules/6.18.10
ты не выполнил make modules_install или версия в команде не совпадает с собранной. выполни ls /lib/modules и используй имеющуюся версию.
make: *** No rule to make target ...
ты запустил make не в папке с исходниками ядра. перейди в /usr/src/linux-6.18.10 и повтори.
14.7 загрузка
после перезагрузки no bootable device или сразу загружается другая система
проверь, что есть файл /boot/EFI/BOOT/BOOTX64.EFI, что раздел 1 имеет тип efi system и что в прошивке выключен secure boot. выбери диск в меню загрузки вручную (обычно клавиша f12 или esc при включении).
проверь, что раздел /boot помечен флагом bootable и что выполнена команда limine bios-install для нужного диска или раздела. в настройках прошивки включи режим legacy или csm.
limine показывает меню, но ядро не стартует (file not found)
путь в limine.conf не совпадает с именем файла. проверь ls /boot и поправь path: и module_path:.
Kernel panic: VFS: Unable to mount root fs on unknown-block
ядро не нашло корневой раздел. самые частые причины:
- неверный
ROOT_UUIDвcmdline, сверь сblkid - в ядре нет драйвера диска (
BLK_DEV_NVMEилиSATA_AHCI) или файловой системы (EXT4_FS,BTRFS_FS) - не указан
module_pathс initramfs вlimine.conf
загрузись с live iso, зайди в chroot (14.9), поправь и пересобери.
dracut: ждёт root устройство и падает в консоль dracut
initramfs не нашёл корень. сверь uuid, а также проверь, что в ядре встроены драйвер диска и файловая система корня.
пустой экран после выбора пункта limine
скорее всего консоль не выводится. включи в ядре DRM_SIMPLEDRM, FRAMEBUFFER_CONSOLE, VT_CONSOLE, смотри 7.1. драйверы видеокарт без файлов прошивок могут давать чёрный экран, тогда не включай их.
Kernel panic: No init found
корень смонтировался, но в нём нет /sbin/init. проверь, что stage 3 распакован полностью и что раздел с корнем именно тот.
14.8 после загрузки
login incorrect
неверный пароль или он не был задан. загрузись с live iso, зайди в chroot и задай пароль заново командой passwd.
нет сети после загрузки
проверь rc-status. если dhcpcd не запущен, выполни rc-update add dhcpcd default и rc-service dhcpcd start. если интерфейса нет в ip link, в ядре нет драйвера карты.
doas: Operation not permitted
пользователь не в группе wheel или нет файла /etc/doas.conf. проверь по 10.2: id имя должен показать группу wheel.
setlocale: LC_ALL: cannot change locale
указанная локаль не создана. создай её командой localedef из 6.1 или смени LANG на существующую.
служба не запускается: rc-service ... start
посмотри вывод команды и журнал. список службы с ошибкой даёт rc-status --crashed.
14.9 аварийный вход в систему
если система не загружается, почти всегда её можно починить из live iso:
- загрузись с live iso и проверь сеть
- смонтируй разделы и войди в chroot по 5.3
- исправь конфиг, пересобери initramfs командой
dracut --kver 6.18.10 /boot/initramfs-6.18.10.img --forceили поправьlimine.conf - выйди из chroot, размонтируй и перезагрузись
14.10 как сообщить об ошибке
чтобы тебе быстро помогли, приложи:
- какую главу справочника ты выполнял и на какой команде всё упало
- строки с
errorили последние 10-15 строк вывода - режим загрузки (uefi или bios), имя диска (sda или nvme) и файловую систему корня
- вывод
dmesg | tail -50, если ошибка после загрузки
14.11 мастер установки и grub
нет диска /dev/sda или нет разделов (сообщение скрипта мастера)
скрипт не нашёл диск или разделы. проверь имя диска и что у разделов правильные имена (у nvme добавляется буква p: nvme0n1p1):
lsblk
partprobe /dev/sdaесли имя другое, поправь поле «диск» в мастере и скопируй скрипт заново.
скрипт мастера сразу завершается и не спрашивает yes
скрипт запущен не из терминала (через конвейер или с подменённым вводом), поэтому не может прочитать ответ. запускай напрямую:
bash /root/cloudos-s1.shlimine не найден в живой системе или grub не найден в живой системе
в живом образе нет выбранного загрузчика. выбери в мастере другой или поставь загрузчик по справочнику уже внутри chroot (8.7 для grub). проверь, что есть в живой системе:
ls /usr/share/limine
command -v grub-installcurl: (22) The requested URL returned error: 404 при скачивании stage 3
имя файла или тег релиза изменились. открой страницу релизов, скопируй точное имя файла и подставь его в начале скрипта (переменная STAGE), потом запусти скрипт снова.
curl: (28) connection timed out при скачивании ядра на шаге 2
зеркало недоступно. скрипт пробует три адреса подряд. если все не отвечают, скачай linux-6.18.10.tar.xz в браузере (с vpn), положи в /mnt/cloudos/usr/src и запусти шаг 2 снова: скачивание будет пропущено.
menuconfig: Your display is too small to run Menuconfig
терминал слишком маленький. нужно минимум 80 колонок и 19 строк. увеличь окно или уменьши шрифт и запусти шаг 2 снова.
grub-install: error: cannot find EFI directory
раздел /boot не смонтирован или живой образ загружен в режиме bios, а не uefi. проверь:
ls /sys/firmware/efi
mountpoint /mnt/cloudos/bootесли папки efi нет, перезагрузись в uefi-режиме (в настройках прошивки), если /boot не смонтирован, смонтируй раздел и повтори.
grub-install: warning: this GPT partition label contains no BIOS Boot Partition
ты ставишь grub в режиме bios на диск с таблицей gpt. для bios cloudos использует таблицу dos (mbr). пересоздай разметку в режиме bios (мастер делает это сам) или добавь маленький раздел типа bios boot (ef02) и повтори установку grub.
grub: error: no such partition и приглашение grub rescue
grub не нашёл свои файлы. в строке rescue введи (подставь свой раздел):
ls
set root=(hd0,msdos1)
set prefix=(hd0,msdos1)/grub
insmod normal
normalпосле загрузки зайди в систему и переустанови grub по 8.7. для uefi вместо msdos1 используй gpt1.
приглашение grub> вместо меню (нет grub.cfg)
grub установлен, но конфига нет. загрузи систему вручную (подставь свои версию и раздел), потом создай /boot/grub/grub.cfg по 8.7:
ls
set root=(hd0,msdos1)
linux /vmlinuz-6.18.10 root=/dev/sda2 rw
initrd /initramfs-6.18.10.img
bootgrub: error: file '/vmlinuz-6.18.10' not found
версия в grub.cfg не совпадает с файлом ядра. посмотри, что лежит в /boot, и поправь имена в конфиге:
ls /boot
nano /boot/grub/grub.cfgefibootmgr: EFI variables are not supported on this system
система загружена в режиме bios. перезагрузись в uefi-режиме. сам загрузчик при этом ставится и без efibootmgr: запись в nvram нужна только по желанию.
14.12 cloudpkg и portage
cloudpkg: ни одно зеркало не ответило
снимок дерева не скачался. включи vpn и повтори cloudpkg sync, либо скачай portage-latest.tar.xz (папка snapshots на любом зеркале gentoo) в браузере, положи в /var/cache/distfiles и запусти sync снова.
!!! Invalid Repository Location (not a dir): '/var/db/repos/gentoo'
дерево рецептов ещё не загружено. выполни:
cloudpkg sync
cloudpkg doctorcloudpkg doctor пишет НЕТ у профиля (make.profile)
ссылка на профиль создаётся после первой синхронизации. создай её вручную:
ln -sfn /var/db/repos/gentoo/profiles/default/linux/amd64/23.0 /etc/portage/make.profileemerge: command not found или ModuleNotFoundError: No module named 'portage'
portage не установлен или сломан. запусти автоустановку из репозитория или поставь заново:
python3 -m pip install --force-reinstall --index-url https://mirrors.aliyun.com/pypi/simple/ portagecloudpkg: нужны права root
установка, удаление, обновление и очистка работают только от root. зайди под root или выполни через doas:
doas cloudpkg install имяemerge: there are no ebuilds to satisfy ...
такого пакета нет или имя неполное. найди точное имя вместе с категорией:
cloudpkg search имя
cloudpkg install категория/имяесли дерево старое, сначала cloudpkg sync.
The following keyword changes are necessary to proceed (masked by ~amd64)
нужная версия есть только в ветке testing. если согласен на менее проверенную версию, добавь ключ -t:
cloudpkg install -t категория/имяemerge хочет пересобрать glibc, gcc или bash (blocked packages, slot conflict)
portage не знает, что эти пакеты уже собраны вручную. пакет надо объявить в /etc/portage/profile/package.provided (одна строка на пакет, с версией):
echo "sys-libs/glibc-2.42" >> /etc/portage/profile/package.provided
cloudpkg install -p имяверсия должна быть не ниже той, что требует пакет.
Fetch failed for ... или Digest verification failed
исходники не скачались или скачались битыми. очисти кеш и повтори. если зеркало не отвечает, поменяй порядок адресов в GENTOO_MIRRORS в /etc/portage/make.conf:
cloudpkg clean
cloudpkg install имя* ERROR: ... failed (compile phase)
пакет не собрался. путь к журналу сборки написан в сообщении (файл build.log). покажи последние строки:
tail -n 30 /var/tmp/portage/категория/имя/temp/build.logчастая причина: новый gcc 15. в make.conf уже стоит CC="gcc -std=gnu17", проверь, что строка на месте. приложи последние 15 строк, когда будешь сообщать об ошибке.
15. шпаргалка
15.1 диски
| команда | что делает |
|---|---|
lsblk -f | диски, разделы, файловые системы, uuid |
blkid | uuid и тип файловой системы разделов |
fdisk -l | таблицы разделов подробно |
cfdisk /dev/sda | разметка диска меню |
mount /dev/sda2 /mnt/cloudos | смонтировать раздел |
umount -R /mnt/cloudos | размонтировать всё рекурсивно |
findmnt | что и куда смонтировано |
df -h | свободное место на разделах |
du -sh папка | сколько занимает папка |
15.2 сеть
| команда | что делает |
|---|---|
ip link | список сетевых интерфейсов |
ip addr | адреса интерфейсов |
ip route | маршруты и шлюз |
dhcpcd eth0 | получить адрес на интерфейсе |
ping -c1 github.com | проверить связь и имена |
curl -LO ссылка | скачать файл |
15.3 система
| команда | что делает |
|---|---|
dmesg | tail -50 | последние сообщения ядра |
free -h | память и swap |
top | процессы и загрузка |
uname -r | версия запущенного ядра |
lsmod | загруженные модули ядра |
lspci | устройства pci, видно сетевую и видеокарту |
date | дата и время |
reboot, poweroff | перезагрузка и выключение |
15.4 файлы и архивы
| команда | что делает |
|---|---|
tar xf архив.tar.xz | распаковать архив |
tar cf архив.tar.xz папка -I xz | создать архив xz |
cp -a что куда | копировать с сохранением прав |
nano файл | открыть редактор. сохранить ctrl + o, выйти ctrl + x |
grep текст файл | найти строку в файле |
15.5 btrfs
| команда | что делает |
|---|---|
btrfs filesystem df / | занятое место по типам данных |
btrfs subvolume list / | список подтомов |
btrfs subvolume snapshot -r источник цель | снимок подтома только для чтения |
btrfs scrub start / | проверка целостности данных |
15.6 cloudpkg
| команда | что делает |
|---|---|
cloudpkg sync | обновить рецепты |
cloudpkg install имя | поставить пакет |
cloudpkg remove имя | удалить пакет |
cloudpkg upgrade | обновить пакеты |
cloudpkg clean | очистить кеш сборки |
службы openrc собраны в таблице 10.6.
16. вопросы и ответы
почему cloudos собирается вручную, есть ли установщик
идея в том, чтобы понимать каждый шаг и контролировать систему целиком. установка проходит как в gentoo: разметка, stage 3, chroot, ядро, загрузчик.
если не хочется вводить команды по одной, воспользуйся мастером установки на сайте: он собирает скрипт под твой диск. понимать шаги всё равно полезно.
какой загрузчик используется, есть ли grub
поддерживаются limine и grub. limine ставится по умолчанию: он быстрый и настраивается одним файлом. grub описан в 8.7, а мастер установки умеет ставить любой из двух.
почему openrc, а не systemd
openrc простой, без лишних зависимостей и подходит для минимальной системы. init в cloudos это openrc-init.
можно ли установить на arm
нет, поддерживается только x86_64, в режимах uefi и старый bios.
какой пароль у root после распаковки stage 3
пароль пустой. задай его в главе 9 командой passwd.
почему нет man-страниц
они убраны, чтобы система была меньше. справка это справочник и ключ --help у команд.
можно ли использовать sudo
вместо него используется doas, он проще и меньше. правила лежат в /etc/doas.conf, смотри 10.2.
как поставить графическую среду
по умолчанию её нет. её нужно собрать вручную через cloudpkg, а в ядре понадобится драйвер видеокарты с файлами прошивок, смотри главу 13.
какая лицензия
собственные части проекта под mit, нужно сохранять имя автора и название проекта. рецепты пакетов основаны на gentoo и остаются под gpl-2.
где взять live iso
что значит beta в названии релиза
система рабочая, но проект молодой: cloudpkg и живой iso ещё в разработке. подробнее на странице нового.
приложение а. имена дисков
имя раздела зависит от типа диска. у nvme перед номером раздела добавляется буква p.
| тип диска | диск | первый раздел | второй раздел |
|---|---|---|---|
| sata, usb | /dev/sda | /dev/sda1 | /dev/sda2 |
| nvme | /dev/nvme0n1 | /dev/nvme0n1p1 | /dev/nvme0n1p2 |
| виртуальный (virtio) | /dev/vda | /dev/vda1 | /dev/vda2 |
если ты ставишь на nvme, замени /dev/sda1 на /dev/nvme0n1p1 и /dev/sda2 на /dev/nvme0n1p2 во всех командах.
приложение б. btrfs с подтомами
необязательно. подтома позволяют делать быстрые снимки системы и откатываться. описано для схемы из 3.4.
б.1 создание подтомов
mkfs.btrfs /dev/sda2
mount /dev/sda2 /mnt/cloudos
btrfs subvolume create /mnt/cloudos/@
btrfs subvolume create /mnt/cloudos/@home
umount /mnt/cloudos
б.2 монтирование
mount -o subvol=@ /dev/sda2 /mnt/cloudos
mkdir -p /mnt/cloudos/boot /mnt/cloudos/home
mount /dev/sda1 /mnt/cloudos/boot
mount -o subvol=@home /dev/sda2 /mnt/cloudos/home
б.3 fstab и загрузчик
UUID=ROOT_UUID / btrfs subvol=@,noatime 0 0
UUID=ROOT_UUID /home btrfs subvol=@home,noatime 0 0
UUID=ESP_UUID /boot vfat defaults 0 2
в /boot/limine.conf в строке cmdline добавь параметр подтома:
cmdline: root=UUID=ROOT_UUID rootflags=subvol=@ rw
б.4 снимок системы
mkdir -p /mnt/top
mount -o subvolid=5 /dev/sda2 /mnt/top
btrfs subvolume snapshot -r /mnt/top/@ /mnt/top/@-snap-1
umount /mnt/top
снимок лежит рядом с подтомом @ и не занимает места, пока данные не изменятся.
приложение в. словарь
| слово | что значит |
|---|---|
| stage 3 | готовая базовая система в одном архиве, без ядра и загрузчика |
| chroot | запуск оболочки с другим корневым каталогом. так ты работаешь в новой системе, пока загружен live iso |
| uefi | современная прошивка. загружается с раздела esp |
| bios (legacy, csm) | старая прошивка, загрузчик пишется в начало диска или раздела |
| esp | efi system partition, раздел fat32 с загрузчиком для uefi |
| initramfs | маленькая временная система, которая загружается перед основной и находит корневой раздел |
| uuid | уникальный идентификатор раздела, не меняется при смене имени диска |
| limine | загрузчик, который читает /boot/limine.conf |
| dracut | программа, которая собирает initramfs |
| openrc | система инициализации и управления службами |
| doas | запуск команд от root, замена sudo |
| рецепт | описание пакета для cloudpkg: откуда взять исходники и как собрать |
| подтом (subvolume) | отдельная ветка файловой системы btrfs, для которой можно делать снимки |