Инструментарий

Установка ОС на малинку прозводиться при помощи компа с каким-нибудь линуксом. Если его нет, то можно раскатать на флэшку Ubuntu и загрузить комп (инструментальный) с нее.

Также желательно подключить UART консоль. Это необязательно, но позволит получить больше контроля над процессом установки. Для подключения к компу нужен переходник USB-UART с TTL уровнями (3,3V). Например китайский на CH340.  На переходнике скорее всего есть перемычка, переключающая перемычка выходной уровень. Она обязательно должна стоять в положении 3,3V, иначе малинка скорее всего сгорит. Если minicom еще не стоит, то его можно поставить простой командой

$ sudo apt install minicom

Запускается терминал командой

$ minicom --device /dev/tty/USB0 --baudrate 115200

Для проверки можно замкнуть выводы RX и TX переходника USB-UART. Все вводимые символы будут возвращаться в терминал (эхо). На малинке контакты RX/TX находятся в верхнем правом углу.

Подключаем RX (белый) переходника к TX малинки, TX (зеленый) переходника к RX малинки, соединяем земли GND (черный).

Запись ОС на карту

Скачиваем и распаковываем образ системы. Ubuntu для Raspberry Pi образы лежат тут. Рекомендуется выбирать Server LTS, 64 бита.

$ wget https://cdimage.ubuntu.com/releases/20.04.2/release/ubuntu-20.04.2-preinstalled-server-arm64+raspi.img.xz

Посмотреть как называется устройство карты можно командой lsblk. Называться она должна называть mmcblkN,  где  N - карты. Скорее всего 0.

Обязательно размонтируем все разделы на карте (на новой карте скорее всего будет один).

$ umount /dev/mmcblk0p1
$ umount /dev/mmcblk0p2

Записываем образ на карту.

$ sudo dd if=ubuntu-20.04.2-preinstalled-server-arm64+raspi.img of=/dev/mmcblk0

Растягиваем второй раздел на карте.

$ sudo parted /dev/mmcblk0 resizepart 2 100%
$ sudo resize2fs /dev/mmcblk0p2
resize2fs 1.45.5 (07-Jan-2020)
Resizing the filesystem on /dev/mmcblk0p2 to 15580928 (4k) blocks.
The filesystem on /dev/mmcblk0p2 is now 15580928 (4k) blocks long.

Все тоже самое можно сделать графической утилитой Disks из комплекта Ubuntu. Размонтирование карты.

Запись образа на карту.

Растягиваем второй раздел.

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

Для поиска машины в сети запускаем nmap

$ sudo nmap -sS -p 22 192.168.1.0/24
Starting Nmap 7.80 ( https://nmap.org ) at 2021-05-02 00:45 MSK
Nmap scan report for _gateway (192.168.1.1)
Host is up (0.0026s latency).

PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: E8:DE:27:C2:F8:E6 (Tp-link Technologies)

Nmap scan report for 192.168.1.102
Host is up (0.0016s latency).

PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: E4:5F:01:0B:3D:84 (Unknown)

Nmap scan report for vulpecula (192.168.1.103)
Host is up (0.000088s latency).

PORT   STATE  SERVICE
22/tcp closed ssh

Nmap done: 256 IP addresses (4 hosts up) scanned in 2.61 seconds

В моем случаи IP полученный малинкой через DHCP 192.168.1.102. Подключаемся через SSH. При первом входе Ubuntu потребует сменить пароль.

NixOS

Тут все интересней. Запись образа осуществляется также как и с Ubuntu (разве что образ нужно распаковывать с помощью unzstd). Общее описание NixOS on ARM/Raspberry Pi 4. Собранные образы лежат на Hydra. Используем последний успешно собранный образ.

Не забываем растянуть второй раздел.

Подключаем монитор и клавиатуру (почему-то при загрузке UART консоль отключается). ОС загружается сразу с логином nixos, без пароля. Для того, чтобы зайти на машинку через ssh пароль нужно установить. На этом шаге стоит подсмотреть IP (ip addr), чтобы не искать малинку в сети при помощи nmap.

$ ssh nixos@192.168.1.101

Генерируем минимальный конфиг.

$ sudo nixos-generate-config 
writing /etc/nixos/hardware-configuration.nix...
writing /etc/nixos/configuration.nix...
For more hardware-specific settings, see https://github.com/NixOS/nixos-hardware.

Теперь у нас есть два конфигурационных файла: /etc/nixos/configuration.nix и /etc/nixos/hardware-configuration.nix.

$ cat /etc/nixos/hardware-configuration.nix 
# Do not modify this file!  It was generated by ‘nixos-generate-config’
# and may be overwritten by future invocations.  Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:

{
  imports =
    [ (modulesPath + "/installer/scan/not-detected.nix")
    ];

  boot.initrd.availableKernelModules = [ ];
  boot.initrd.kernelModules = [ ];
  boot.kernelModules = [ ];
  boot.extraModulePackages = [ ];

  fileSystems."/" =
    { device = "/dev/disk/by-uuid/44444444-4444-4444-8888-888888888888";
      fsType = "ext4";
    };

  swapDevices = [ ];

  powerManagement.cpuFreqGovernor = lib.mkDefault "ondemand";
}

/etc/nixos/hardware-configuration.nix не трогаем, редактируем /etc/nixos/configuration.nix. У меня он такой:

$ cat /etc/nixos/configuration.nix 
# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).

{ config, pkgs, ... }:

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
    ];

  # Use the extlinux boot loader. (NixOS wants to enable GRUB by default)
  boot = {
    kernelPackages = pkgs.linuxPackages_rpi4;
    tmpOnTmpfs = true;

    initrd.availableKernelModules = [
      "usbhid"
      "usb_storage"
    ];

    kernelParams = [
      "console=ttyS0,115200n8"
      "console=tty0"
    ];

    loader = {
      raspberryPi.enable = true;
      raspberryPi.version = 4;

      grub.enable = false;

      generic-extlinux-compatible.enable = true;
    };
  };

  systemd.additionalUpstreamSystemUnits = [ "tmp.mount" ];

  hardware.enableRedistributableFirmware = true;

  networking = {
    hostName = "nixos-rpi4";
    networkmanager.enable = true;
  };

  users = {
    mutableUsers = false;

    users.root = {
      password =  "password";
    };

    users.nixos = {
      isNormalUser = true;
      password = "password";
      extraGroups = [
        "wheel"	# Enable sudo
      ];
    };
  };

  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [
    nano
    wget
  ];

  environment.variables = {
    EDITOR = "nano";
  };

  services.openssh.enable = true;

  nixpkgs.config.allowUnfree = true;

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
  system.stateVersion = "21.03"; # Did you read the comment?

}

Добавляем Unstable канал (пакетов)

$ sudo nix-channel --add https://nixos.org/channels/nixos-unstable nixpkgs
$ sudo nix-channel --update

Установка и перезагрузка

$ sudo nixos-install --root /
$ sudo reboot

Диаграмма GPIO выводов взята из документации на плату. Автор Raspberry Pi Foundation, лицензия Creative Commons Attribution 4.0 International Licence. Ссылка. Автор заглавного изображения lewing@isc.tamu.edu Larry Ewing and The GIMP