Коротко — два рабочих пути:
- самый надёжный и простой: оставить маленькую SD‑карту только с загрузочной FAT‑частью (boot/firmware), а корневой раздел перенести на SSD; загрузчик (файлы в FAT) остаётся на SD, ядро и initramfs загружаются с SD, а root= в cmdline указывает на SSD; это срабатывает практически всегда;
- полностью без SD (чистая загрузка с PCIe/SATA/NVMe) — зависит от того, поддерживает ли ROM/EEPROM Raspberry Pi ваш PCIe‑контроллер как устройство для первичной загрузки. Для многих PCIe→SATA контроллеров (и некоторых NVMe) «родной» загрузчик платы не умеет обращаться к ним на ранней стадии, поэтому нативная загрузка с них может быть невозможна или требует перепрошивки/обновления загрузчика/EEPROM/установки UEFI. Это менее универсально и требует проверки совместимости.
Далее — подробные инструкции и команды, что именно нужно сделать (и проверить) в вашем случае (Pi 5 + PCIe→SATA HAT).
1) Сначала — проверить: видит ли ядро контроллер и SSD, когда вы загружаетесь с SD
- загрузитесь с SD, подключите HAT/SSD;
- проверьте PCIe и контроллер:
- lspci -vvv
- dmesg | egrep -i 'ahci|ata|nvme|pci'
- lsblk / blkid
Если контроллер и диск видны и доступны (появился /dev/sda, /dev/nvme0n1 и т.д.), значит Linux умеет с ним работать — это уже 80% успеха для переноса rootfs.
2) Перенос системы на SSD (примерный алгоритм)
- смонтируйте разделы SSD (создайте на SSD разделы boot и root как в текущей системе);
- скопируйте содержимое корня: rsync -aAX --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /mnt/ssd_root
- получите UUID корневого раздела: blkid /dev/sdXn
- в файле cmdline.txt (на FAT‑разделе /boot или /boot/firmware — зависит от дистрибутива) замените root=/dev/mmcblk0p2 на root=UUID=ваш‑UUID и добавьте параметры rootwait и (при необходимости) rootdelay=10
- пример: root=UUID=1111-2222 ro rootwait rootdelay=10
- в /etc/fstab на SSD укажете UUID вместо /dev/… чтобы при загрузке монтировался корректно
- если дистрибутив использует initramfs (Rocky Linux — dracut, Debian — initramfs-tools), нужно убедиться, что в initramfs включены модули для доступа к диску (ahci, nvme и т.д.)
- Для Rocky (dracut): chroot в SSD и выполнить dracut --regenerate-all --force
- Для Debian: update-initramfs -u
- Если модули не включились автоматически — явно добавить их в конфиги dracut/ initramfs
3) Настройки загрузки/firmware (если хотите совсем без SD)
- Убедитесь, что EEPROM/BOOT ROM обновлены до последней версии (используйте официальную инструкцию Raspberry Pi для обновления firmware/bootloader). На Pi4 это делается rpi-eeprom-update; для Pi5 следуйте официальной странице Raspberry Pi 5 firmware. Обновлённый загрузчик может поддерживать больше источников загрузки.
- Проверьте «порядок загрузки» (boot order) в EEPROM: он должен включать USB/PCIe/массовые устройства. На Pi4 это делается через конфигурацию EEPROM (BOOT_ORDER) — для Pi5 возможны отличия, смотрите официальную документацию.
- Но: даже с обновлённым EEPROM контроллер PCIe→SATA должен быть «видим» ROM на ранней стадии и поддерживать протокол mass‑storage; некоторые SATA чипы (особенно старые/бюджетные) не поддерживаются ROM и будут доступны только после загрузки ядра -> тогда нативная загрузка невозможна. В таком случае единственный рабочий путь — маленькая SD с файлом загрузки.
4) Конкретные доработки config.txt/параметров
- Файл config.txt нужен только при загрузке с firmware на SD (в него записываются параметры виде/дров/переключения интерфейсов).
- Для PCIe на Pi5 обычно не нужно писать dtparam=pciex1 — неверные параметры только мешают. Конкретные ключи зависят от образа/прошивки. Если у вас есть готовое описание HAT от производителя — используйте dtoverlay, который даёт производитель. Универсального dtparam, «включающего» PCIe, для всех случаев нет.
- Если ядро не видит контроллер без специальных overlay — проверьте документацию HAT и/или производителя чипа (например, ASMedia, JMicron и т.д.) на предмет dtoverlay или дополнительных параметров.
5) Отладка — что смотреть, если не загружается
- Если при попытке загрузки без SD вы получаете ошибку early boot, скорее всего ROM не может прочитать загрузочные файлы с PCIe‑устройства. Это подтверждается отсутствием активности контроллера в dmesg на ранней стадии.
- Лог при загрузке с SD: dmesg | grep -i pci ; journalctl -k — покажет, какие модули грузятся и видит ли ядро диск.
- Если при загрузке с SD диск виден, а при попытке загрузиться с него напрямую — нет, то причина в загрузчике/ROM, а не в Linux.
6) Коротко про Orange Pi (на будущее)
- На платах Orange Pi аплинч U‑Boot/EEPROM различен. Чтобы загрузать систему с NVMe внутри платы, обычно надо: иметь U‑Boot (в SPI/eMMC) с поддержкой NVMe, и настроить U‑Boot env (bootcmd) на загрузку с nvme. Часто проще оставить маленькую SD или прошить U‑Boot в SPI, но это специфично для модели и требует инструкций от производителя/сообщества Orange Pi.
Резюме и рекомендации для вашего случая
- Самый быстрый путь: оставить маленькую SD (несколько мегабайт/несколько сотен МБ) с /boot (firmware) и cmdline указывать root=UUID вашего SSD. Убедитесь, что initramfs включает драйверы ahci/nvme. Это надёжно и работает без танцев с EEPROM.
- Если хотите полностью без SD — проверьте/обновите EEPROM Raspberry Pi, проверьте boot order, прочитайте документацию по вашему PCIe→SATA контроллеру. Но часто контроллеры не поддерживаются ROM, и тогда без SD никак.
Если хотите — помогу конкретно:
- приведите выводы команд (после загрузки с SD): sudo lspci -nnk ; lsblk ; sudo dmesg | egrep -i 'ahci|ata|nvme|pci' ; sudo blkid
- и содержание /boot/cmdline.txt (или /boot/firmware/cmdline.txt) и /etc/fstab — тогда я подскажу точные правки, необходимые для перехода на SSD (с сохранением SD как загрузочного) или оценю шанс на 100% без‑SD загрузку.