cloudosсправочник

cloudos справочник

установка cloudos 1.0 на x86_64.

1. о cloudos

cloudos это минимальный linux, который ты собираешь сам. после установки в системе только консоль.

параметрзначение
архитектураx86_64
libcglibc
initopenrc
ядрованильное с kernel.org
загрузчикlimine
файловые системыext4 и btrfs
пакетытолько из исходников, команда cloudpkg
заметкаhandbook рассчитан на тех, кто готов разбираться. для быстрой установки есть мастер установки: он выдаёт готовый скрипт под твой диск, а здесь описан каждый шаг.

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
initopenrc 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 чего в системе нет

1.4 порядок установки

  1. загрузись с live iso, проверь сеть и режим загрузки
  2. размеч диск и создай файловые системы
  3. скачай и распакуй stage 3
  4. зайди в chroot и настрой сборку
  5. собери ядро
  6. сделай initramfs, fstab и поставь limine
  7. задай пароль, включи службы и перезагрузись
  8. настрой систему после первой загрузки

1.5 как пользоваться справочником

в левой панели сверху переключатель uefi и bios. выбери свой режим, и в справочнике останутся только нужные команды. выбор запоминается в браузере.

поиск открывается кнопкой в шапке или клавишами ctrl + k. у каждого блока с командой справа сверху кнопка копирования.

в командах встречаются заглушки, их надо заменить на свои значения:

заглушкачто подставить
/dev/sda, /dev/sda1, /dev/sda2свой диск и разделы из lsblk. у nvme имена другие, смотри приложение а
ROOT_UUIDuuid корневого раздела из blkid
ESP_UUID, BOOT_UUIDuuid раздела /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
режимтаблицаразделы
uefigptsda1 512 мб, тип efi system. sda2 остальное
biosdossda1 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 пример схемы

разделразмертипточка монтированияфайловая система
sda1512 мбefi system/bootfat32
sda2остальноеlinux filesystem/ext4 или btrfs
разделразмерфлагточка монтированияфайловая система
sda1512 мбbootable/bootfat32
sda2остальное-/ext4 или btrfs

если нужен swap-раздел, сделай его третьим, а не первым. подробнее про swap в 10.7. swap можно сделать и файлом уже после установки, тогда отдельный раздел не нужен.

3.5 проверка

убедись, что всё смонтировано как надо:

lsblk -f
findmnt /mnt/cloudos
findmnt /mnt/cloudos/boot

корень должен быть на втором разделе, /boot на первом. если одна из команд ничего не вывела, раздел не смонтирован.

заметкаесли корень на btrfs и ты хочешь подтома, смотри приложение б до монтирования.

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
ВАЖНО вам нужно использовать везде имя диска на который вы хотите ставить, узнать можно с помощью команды lsblk(опять же, диск может называться /dev/nvme0n1 /dev/sda /dev/sdb

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_NVMEnvme диски
ATA, SATA_AHCI, BLK_DEV_SDsata диски
USB_XHCI_HCD, USB_XHCI_PCI, USB_HIDusb порты и клавиатура
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вывод консоли на экран без драйвера видеокарты
заметкадрайверы видеокарт (amdgpu, i915, nouveau) требуют файлы прошивок 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 должны совпадать.

заметкане хочешь искать драйверы в menuconfig? помощник по ядру по твоему железу выдаёт готовую команду настройки.

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
}
заметкавместо ESP_UUID и ROOT_UUID подставь значения из 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
заметкадругих пользователей cloudos не создаёт!), пользователя и doas добавишь сам.
важнодиск на который вы ставите может быть как NVME так и sda sdb, тестил на 7 5700X(AMD) RX9060XT(AMD) и на sda(не nvme limine выбрал изза скорости и удобства, поддержка grub ВОЗМОЖНО будет.

9.1 проверка служб

перед перезагрузкой убедись, что службы добавлены:

rc-update show

в списке должны быть dhcpcd и журнал в уровне default.

9.2 первая загрузка

после перезагрузки вытащи флешку и выбери диск в меню загрузки, если он не выбрался сам. появится приглашение login: на tty1. введи root и пароль, который задал командой passwd.

дальше настрой систему, это описано в главе 10.

заметкав stage 3 уже есть dhcpcd, sysklogd, dracut и doas, ставить их через cloudpkg не нужно. вместо syslog-ng в системе работает sysklogd. cloudpkg работает поверх portage: 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.

ВАЖНОcloudpkg в разработке. подписей пакетов пока нет, целостность исходников проверяется только по sha256 из рецепта. часть рецептов может потребовать правок.

11.1 команды

командачто делает
cloudpkg syncобновляет список рецептов
cloudpkg install имясобирает и ставит пакет вместе с зависимостями
cloudpkg remove имяудаляет пакет
cloudpkg upgradeобновляет установленные пакеты до новых версий
cloudpkg cleanчистит скачанные исходники и временные файлы сборки

11.2 как проходит установка

  1. читается рецепт пакета и список его зависимостей
  2. исходники скачиваются через curl
  3. проверяется sha256
  4. пакет собирается с твоими флагами из /etc/cloudpkg/make.conf
  5. результат ставится в систему

сборка занимает время и место на диске. большие пакеты вроде компиляторов собираются долго, это нормально.

11.3 примеры

cloudpkg sync
cloudpkg install limine
cloudpkg install dracut
cloudpkg install nano

11.4 если пакет не собрался

  1. прочитай последние строки с error
  2. если ошибка про стандарт си, поставь CC="gcc -std=gnu17", смотри 6.4
  3. если сборка падает с killed, уменьши -j в MAKEOPTS
  4. попробуй cloudpkg sync и повтори, возможно рецепт уже исправлен
  5. напиши на форум в раздел с вопросами, приложив последние 10-15 строк вывода

12. обслуживание

12.1 обновление пакетов

cloudpkg sync
cloudpkg upgrade
cloudpkg clean

12.2 обновление ядра

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

  1. скачай и распакуй новое ядро в /usr/src, как в главе 7
  2. возьми старый конфиг за основу и подтяни новые опции:
cd /usr/src/linux-НОВАЯ
cp /boot/config-СТАРАЯ .config
make olddefconfig
  1. собери и установи:
make -j$(nproc)
make modules_install
cp arch/x86/boot/bzImage /boot/vmlinuz-НОВАЯ
cp .config /boot/config-НОВАЯ
dracut --kver НОВАЯ /boot/initramfs-НОВАЯ.img
  1. добавь второй пункт в /boot/limine.conf, как в 8.6, и перезагрузись
  2. если всё работает, старые файлы можно удалить:
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 помощь и обратная связь

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:

  1. загрузись с live iso и проверь сеть
  2. смонтируй разделы и войди в chroot по 5.3
  3. исправь конфиг, пересобери initramfs командой dracut --kver 6.18.10 /boot/initramfs-6.18.10.img --force или поправь limine.conf
  4. выйди из chroot, размонтируй и перезагрузись

14.10 как сообщить об ошибке

чтобы тебе быстро помогли, приложи:

14.11 мастер установки и grub

нет диска /dev/sda или нет разделов (сообщение скрипта мастера)

скрипт не нашёл диск или разделы. проверь имя диска и что у разделов правильные имена (у nvme добавляется буква p: nvme0n1p1):

lsblk
partprobe /dev/sda

если имя другое, поправь поле «диск» в мастере и скопируй скрипт заново.

скрипт мастера сразу завершается и не спрашивает yes

скрипт запущен не из терминала (через конвейер или с подменённым вводом), поэтому не может прочитать ответ. запускай напрямую:

bash /root/cloudos-s1.sh
limine не найден в живой системе или grub не найден в живой системе

в живом образе нет выбранного загрузчика. выбери в мастере другой или поставь загрузчик по справочнику уже внутри chroot (8.7 для grub). проверь, что есть в живой системе:

ls /usr/share/limine
command -v grub-install
curl: (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
boot
grub: error: file '/vmlinuz-6.18.10' not found

версия в grub.cfg не совпадает с файлом ядра. посмотри, что лежит в /boot, и поправь имена в конфиге:

ls /boot
nano /boot/grub/grub.cfg
efibootmgr: 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 doctor
cloudpkg doctor пишет НЕТ у профиля (make.profile)

ссылка на профиль создаётся после первой синхронизации. создай её вручную:

ln -sfn /var/db/repos/gentoo/profiles/default/linux/amd64/23.0 /etc/portage/make.profile
emerge: command not found или ModuleNotFoundError: No module named 'portage'

portage не установлен или сломан. запусти автоустановку из репозитория или поставь заново:

python3 -m pip install --force-reinstall --index-url https://mirrors.aliyun.com/pypi/simple/ portage
cloudpkg: нужны права 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
blkiduuid и тип файловой системы разделов
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

образ готовится после выхода stage 3 и появится на странице релизов. до этого можно использовать любой live linux с набором утилит из 1.1.

что значит 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)старая прошивка, загрузчик пишется в начало диска или раздела
espefi system partition, раздел fat32 с загрузчиком для uefi
initramfsмаленькая временная система, которая загружается перед основной и находит корневой раздел
uuidуникальный идентификатор раздела, не меняется при смене имени диска
limineзагрузчик, который читает /boot/limine.conf
dracutпрограмма, которая собирает initramfs
openrcсистема инициализации и управления службами
doasзапуск команд от root, замена sudo
рецептописание пакета для cloudpkg: откуда взять исходники и как собрать
подтом (subvolume)отдельная ветка файловой системы btrfs, для которой можно делать снимки