LINUX.ORG.RU
ФорумTalks

NixOS 25.05 (Warbler) на Raspberry Pi 5

 , ,


1

1

Если внезапно кто-то захочет пройти этим путём… В общем держу в курсе.

OS и софт:

NixOS with Flakes, Disko, impermanence rootless (aka Erase your darlings), home-manager а главное Nix flake for a fully declarative NixOS on Raspberry Pi

Ванильное ядро Linux не увидит PCIe а соотвественно и nvme/ssd диски. В то же время nvmd/nixos-raspberrypi сделал нам хорошо опакетив форк ядра и загрузчик от малины.

Использованное железо:

https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#enable-pcie

В configtxt.nix

  pciex1 = {
    enable = true;
    value = "on";
  };

https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#pcie-gen-3-0

В configtxt.nix

  pciex1_gen = {
    enable = true;
    value = "3";
  };

https://www.raspberrypi.com/documentation/computers/configuration.html usb_max_current_enable

Zero if the USB port current limiter was set to the low-limit during boot; or non-zero if the high limit was enabled. The high level is automatically enabled if the power supply claims 5A max-current OR usb_max_current_enable=1 is forced in config.txt

В configtxt.nix

  usb_max_current_enable = {
    enable = lib.mkDefault true;
    value = lib.mkDefault true;
  };

Загрузочная sd карточка:

Cклонировали репу, внимательно прочитали README.md, Да modules/configtxt.nix добавили ssh ключи и нужный софт. Собственно сборка nix build .#installerImages.rpi5

Результат:

> du -h result/sd-image/nixos-installer-rpi5-kernel.img.zst
1,5G    result/sd-image/nixos-installer-rpi5-kernel.img.zst

Дальше банально:

> unxz result/sd-image/nixos-installer-rpi5-kernel.img.zst
> dd if=result/sd-image/nixos-installer-rpi5-kernel.img | pv | dd of=/dev/СМОТРИ_НЕ_ПЕРЕПУТАЙ_КУДА

В установленной системе:

Абстрактный однако, при этом, рабочий пример Disko.nix для двух дисковой установки (ssd поменьше под ОС, ssd побольше под данные) с корнем в ram.

{
  disko.devices = {
    nodev."/" = {
      fsType = "tmpfs";
      mountOptions = [
        "defaults"
        "size=2G"
        "mode=755"
      ];
    };

    disk = {
      main = {
        type = "disk";
        device = "/dev/nvme0n1";
        content = {
          type = "gpt";
          partitions = {

            ESP = {
              priority = 1;
              name = "ESP";
              label = "ESP";
              start = "1M";
              end = "2048M";
              type = "EF00";
              content = {
                type = "filesystem";
                format = "vfat";
                mountOptions = [
                  "noatime"
                  "nodiratime"
                  "umask=077"
                ];
                mountpoint = "/boot";
              };
            };

            nyx = {
              size = "100%";
              name = "MY_NAME";
              label = "MY_NAME";
              content = {
                type = "btrfs";
                extraArgs = [
                  "--label MY_NAME"
                  "-f"
                  "--csum xxhash64"
                  "--features"
                  "block-group-tree"
                ];
                subvolumes = {
                  "home" = {
                    mountpoint = "/home";
                    mountOptions = [
                      "subvol=home"
                      "compress=zstd"
                      "noatime"
                      "ssd"
                      "discard=async"
                      "space_cache=v2"
                    ];
                  };
                  "nix" = {
                    mountpoint = "/nix";
                    mountOptions = [
                      "subvol=nix"
                      "compress=zstd"
                      "noatime"
                      "ssd"
                      "discard=async"
                      "space_cache=v2"
                      "nodev"
                      "nosuid"
                    ];
                  };
                  "log" = {
                    mountpoint = "/var/log";
                    mountOptions = [
                      "subvol=log"
                      "compress=zstd"
                      "noatime"
                      "ssd"
                      "space_cache=v2"
                    ];
                  };
                  tmp = {
                    mountpoint = "/tmp";
                    mountOptions = [ "noatime" ];
                  };

                };
              };
            };

          };
        };
      };
    };

    disk = {
      media = {
        type = "disk";
        device = "/dev/nvme1n1";
        content = {
          type = "gpt";
          partitions = {

            media = {
              size = "100%";
              name = "media";
              label = "media";
              content = {
                type = "btrfs";
                extraArgs = [
                  "--label media"
                  "-f"
                  "--csum xxhash64"
                  "--features"
                  "block-group-tree"
                ];
                subvolumes = {
                  "media" = {
                    mountpoint = "/NAS";
                    mountOptions = [
                      "subvol=media"
                      "compress=zstd"
                      "noatime"
                      "ssd"
                      "discard=async"
                      "space_cache=v2"
                    ];
                  };

                };
              };
            };

          };
        };
      };
    };


  };

  fileSystems = {
    "/var/log".neededForBoot = true;
  };
}

Уничтожение (!!!) всех данных и создание всех разделов на всех дисках:

nix --experimental-features "nix-command flakes" run github:nix-community/disko/latest -- --mode destroy,format,mount Disko.nix

Монтирование всех разделов на всех дисках из live sdcart

nix --experimental-features "nix-command flakes" run github:nix-community/disko/latest -- --mode mount Disko.nix

Из остального, что является существенным, я поправил:

  boot.tmp.useTmpfs = true;
  boot.loader.raspberryPi.bootloader = "kernel";
  boot.loader.raspberryPi.firmwarePath = "/boot"; # /boot/firmware
  boot.kernelParams = [ "console=serial0,115200n8" "console=tty1" "cfg80211.ieee80211_regdom=RU" ];

Выводы

Всё прочее банально, зависит от привычек и вкуса и не требует пояснений. Пациент с описанным сетапом жив. Однако да решение требует пердолинга, свободного времени и желания. За полумесячный период эксплуатации замечены два полных внезапных вайпа системы после обновлений nixos-rebuild switch --flake .#${HOSTNAME} -L и последующей перезагрузки. Причины не выяснены. Мой прогноз - пока что аппстрим NixOS это не примет. Возможно примет позже когда 5ю малину будет поддерживать uboot и ванильное ядро. Всем чмоки в этам чатики. Поздравляю всех выживших с наступившим.

★★★★★
Ответ на: комментарий от BceM_IIpuBeT

Перезаписывал бут ордер?

в EFI раздел записывал какую-то хрень и пару байт видимо в eprom (или куда-то туда, длинный системный номер) восстановиться от чего помогала только инструкция от такого-же MS с кучей заклинаний.

Личный вывод - UEFI говно. Технически не оправдан, но маркетоидно конечно находка.

MKuznetsov ★★★★★
()
Ответ на: комментарий от Gary

До сих пор не понимаю зачем люди за такие деньги берут малинку вместо минипк

Для извращений же ж.

tiinn ★★★★★
()
Ответ на: комментарий от Vidrele

Торренты продолжают крутиться от копеечного DC UPS.

У всех нормальных людей сеть ложится при отключении света

tiinn ★★★★★
()
Ответ на: комментарий от tiinn

У всех нормальных людей сеть ложится при отключении света

PON обычно не ложится. ADSL не ложится. Традиционные медные провайдеры в наших краях потратились на ИБП для каждого коммутатора. После последнего массированного удара я наблюдал пожары в окно, около суток не было света, еще чуть дольше - отопления, но интернет работал 18 часов к ряду. В конце концов я перешел на LTE: YouTube на 144p в вечернее время сносно работал.

Проверяй свои критерии нормальности.

Vidrele ★★★★★
()
Ответ на: комментарий от MKuznetsov

да, windows может окирпичить uefi.

Вы очень одарённый.

tiinn ★★★★★
()
Ответ на: комментарий от Vidrele

ADSL не ложится.

ADSL умеет работать без коммутатора?

Традиционные медные провайдеры в наших краях потратились на ИБП

Везёт.

В конце концов я перешел на LTE: YouTube на 144p в вечернее время сносно работал.

А вот в это я верю. Но, там не будет торрентов.

tiinn ★★★★★
()
Последнее исправление: tiinn (всего исправлений: 1)
Ответ на: комментарий от tiinn

ADSL умеет работать без коммутатора?

ADSL работает через DSLAM, который таки коммутатор. Как правило, DSLAM стоит на АТС, где питается от той же самой батареи, что и телефонная сеть.

Так-то и PON не обязан иметь резервное питание на стороне провайдера, но обычно имеет.

Везёт.

Никому не пожелаю, учитывая обстоятельства.

А вот в это я верю. Но, там не будет торрентов.

Нам торренты не перекрывают, но на «безлимитных» тарифах болезненно урезают скорость после первых 50 ГБ. И нет, через мобильный интернет я торренты не гоняю.

Vidrele ★★★★★
()
Ответ на: комментарий от Vidrele

Как правило, DSLAM стоит на АТС, где питается от той же самой батареи, что и телефонная сеть.

Давно там нет той самой батареи

Так-то и PON не обязан иметь резервное питание на стороне провайдера, но обычно имеет

Давно оптимизировали

И нет, через мобильный интернет я торренты не гоняю.

Там товарищ хвалился, что при отключении света он гоняет торренты. Не уточняя, на каком интернете

tiinn ★★★★★
()
Ответ на: комментарий от tiinn

Давно там нет той самой батареи

Укртелеком всё тот же: работает - не трожь.

Давно оптимизировали

Откуда дровишки? В телекомах работаешь, сам PON пользуешься, с людьми общаешься?

Там товарищ хвалился, что при отключении света он гоняет торренты. Не уточняя, на каком интернете.

Видимо, я и есть тот товарищ. У меня один UPS для роутера и малинки, хотя надо бы купить второй. Есть график отключений. Если отключение от 3 до 6 часов, гоняю. Если 7 и более, где-то через 3 часа вырубаю малинку по SSH - сразу или через at, чтобы не вгонять UPS в ноль и подольше пользоваться роутером. В этот момент уже никаких торрентов. Если UPS не хватило, достаю повербанк и кабель-повышайку для роутера. Примерно через 18 часов садится провайдерский UPS. Тогда я добираюсь до LTE, которого во время отключений вполне хватает для работы, серфинга и просмотра видео в низком разрешении.

Vidrele ★★★★★
()
Ответ на: комментарий от Vidrele

Укртелеком всё тот же: работает - не трожь.

Говорю ж: везёт.

Откуда дровишки? В телекомах работаешь, сам PON пользуешься, с людьми общаешься?

Люди пишут. Там, где была целая АТС, теперь стоят два серверных шкафа, а всё здание сдаётся частникам. Не, какой-то бесперебойник там стоит, но ровно чтобы сервера загасить при отключении. И нет там никакой меди, оптоволокно везде.

tiinn ★★★★★
()
Последнее исправление: tiinn (всего исправлений: 1)
Ответ на: комментарий от BceM_IIpuBeT

Может я просто не заметил? Не подскажешь в каком из этих пунктов копируются/переносятся/изменяются прошивки железа и конфиг системы инициализации?

kirill_rrr ★★★★★
()
Ответ на: комментарий от tiinn

Говорю ж: везёт.

Вот тут да, везет. Зато у вас телеграф есть (пусть и по IP теперь), а у нас его окончательно схлопнули. Ушла эпоха.

Люди пишут. Там, где была целая АТС, теперь стоят два серверных шкафа, а всё здание сдаётся частникам. Не, какой-то бесперебойник там стоит, но ровно чтобы сервера загасить при отключении. И нет там никакой меди, оптоволокно везде.

Мда, печально. Но в случае чего появятся нормальные ИБП везде, где они нужны: для PON - почти сразу, для Ethernet - в течение нескольких месяцев. Главное, чтобы «в случае чего» не наступало никогда.

Vidrele ★★★★★
()
Ответ на: комментарий от Vidrele

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

А для передачи важных сообщений населению будет радио и ТВ.

tiinn ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)