NixOSをラズパイに入れたときの備忘録。
もともとの目的は、遠隔地からWake on LANでデスクトップを起動するための、簡易的なサーバーが欲しかったこと。そういえばラズパイを持っていたので、それが使えるんじゃないかと思い、倉庫から取り出して構築を始めた。
昔はRaspberry Pi OSを使ってたけど、NixOSを知って大好きになったのでこれを機にラズパイにもNixOSを入れることにした。
- Raspberry Pi 4 Model B / 8GB
NixOSのイメージの入手#
nixos.orgにはISOのイメージの案内しかないが、Installing NixOS on a Raspberry Pi を読むと、SDカード用のイメージがありそれを書き込むらしい。
ここの最新のものをDLしてくる。
https://hydra.nixos.org/job/nixos/unstable/nixos.sd_image.aarch64-linux
1
| curl -LO https://hydra.nixos.org/build/349228952/download/1/nixos-image-sd-card-26.11pre1092090.55bfb4d7437b-aarch64-linux.img.zst
|
DLされるものはzstdという圧縮形式なので、これを解凍する。手元のmacOSには入ってないので、nix shell経由で実行する。
1
| nix shell 'nixpkgs#zstd' -c unzstd 'nixos-image-sd-card-26.11pre1092090.55bfb4d7437b-aarch64-linux.img.zst'
|
1
2
3
4
5
6
| bombrary@bombrary-macbookair:~% curl -LO https://hydra.nixos.org/build/349228952/download/1/nixos-image-sd-card-26.11pre1092090.55bfb4d7437b-aarch64-linux.img.zst
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1440M 0 1440M 0 0 2996k 0 --:--:-- 0:08:12 --:--:-- 4673k
bombrary@bombrary-macbookair:~% nix shell 'nixpkgs#zstd' -c unzstd 'nixos-image-sd-card-26.11pre1092090.55bfb4d7437b-aarch64-linux.img.zst'
nixos-image-sd-card-26.11pre1092090.55bfb4d7437b-aarch64-linux.img.zst: 3982954496 bytes
|
NixOSイメージをmicroSDに焼く#
SDカードリーダーの用意#
昔焼くときに使っていたPCにはSDスロットがあったのだが、MacBook Airにはついてない。近くの電気屋で適当なものを買ってきた。SDカード系の売り場にあった。
USB Type-C(TM)接続 直挿しメモリーカードリーダー(UHS-I)
デバイスファイルの特定#
この後ddコマンドで書き込むので、事前に書き込み先のSDカードのデバイスファイルを特定しておく必要がある。
macOSの場合はdiskutilで確認可能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| bombrary@bombrary-macbookair:~% diskutil list
/dev/disk0 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *1.0 TB disk0
1: Apple_APFS_ISC Container disk1 524.3 MB disk0s1
2: Apple_APFS Container disk3 994.7 GB disk0s2
3: Apple_APFS_Recovery Container disk2 5.4 GB disk0s3
/dev/disk3 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +994.7 GB disk3
Physical Store disk0s2
1: APFS Volume Macintosh HD 12.6 GB disk3s1
2: APFS Snapshot com.apple.os.update-... 12.6 GB disk3s1s1
3: APFS Volume Preboot 9.0 GB disk3s2
4: APFS Volume Recovery 1.3 GB disk3s3
5: APFS Volume Data 254.1 GB disk3s5
6: APFS Volume VM 2.1 GB disk3s6
7: APFS Volume Nix Store 24.9 GB disk3s7
/dev/disk4 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *127.9 GB disk4
1: Windows_FAT_32 boot 268.4 MB disk4s1
2: Linux 127.6 GB disk4s2
|
持っているmicroSDは128GBのやつなので、 /dev/disk4 だということがわかる。
書き込みを実行する。
1
| sudo dd if=<imgファイル> of=<書き込み先デバイスファイル> bs=4096 conv=fsync status=progress
|
ところがそのままだとエラーになる。
1
2
| bombrary@bombrary-macbookair:~% sudo dd if=nixos-image-sd-card-26.11pre1092090.55bfb4d7437b-aarch64-linux.img of=/dev/disk4 bs=4096 conv=fsync status=progress
dd: /dev/disk4: Resource busy
|
これはSDカードリーダーを接続した時にmacOSが自動でマウントしたからなので、アンマウントする。macOSの場合は以下で行う。
1
| diskutil unmountDisk <デバイスファイル>
|
1
2
3
4
5
6
7
8
9
10
| bombrary@bombrary-macbookair:~% ls -la /Volumes
drwx------@ - bombrary 15 Oct 12:50 boot
lrwxr-xr-x - root 11 Oct 20:33 'Macintosh HD' -> /
bombrary@bombrary-macbookair:~% diskutil unmountDisk /dev/disk4
Unmount of all volumes on disk4 was successful
bombrary@bombrary-macbookair:~% ls -la /Volumes
lrwxr-xr-x - root 11 Oct 20:33 'Macintosh HD' -> /
bombrary@bombrary-macbookair:~%
|
これで書き込めた。
1
2
3
4
5
6
| bombrary@bombrary-macbookair:~% sudo dd if=nixos-image-sd-card-26.11pre1092090.55bfb4d7437b-aarch64-linux.img of=/dev/disk4 bs=4096 conv=fsync status=progress
Password:
3976335360 bytes (3976 MB, 3792 MiB) transferred 606.003s, 6562 kB/s
972401+0 records in
972401+0 records out
3982954496 bytes transferred in 606.997727 secs (6561729 bytes/sec)
|
SDカードリーダーを取り外す(Windowsでいう「ハードウェアの安全な取り外し」みたいなやつか?)。
1
| diskutil eject /dev/disk4
|
1
2
| bombrary@bombrary-macbookair:~% diskutil eject /dev/disk4
Disk /dev/disk4 ejected
|
(外した時に気づいたが、だいぶカードリーダーが熱を持っていた)
Raspberry Pi起動#
microSDをラズパイの本体に差して起動する。初回はモニターが必要なのでモニターにも繋ぐ。NixOS初回のプロンプトが出る。
また上部には以下のメッセージが見える。
1
2
3
4
5
| <<< Welcome to NixOS sd-card-26.11pre1092090.55bfb4d7437b (aarch64) - tty1 >>>
To log in over ssh you must set a password for either "nixos" or "root"
with `passwd` (prefix with `sudo` for "root"), or add your public key to
/home/nixos/.ssh/authorized_keys or /root/.ssh/authorized_keys.
|
これ以降はSSHでセットアップしたいので、ひとまずnixosユーザのパスワードを設定する。
有線LANに繋いでIPを確認。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| [nixos@nixos:~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: end0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
altname enxxxxxxxxxxxxx
inet 192.168.11.7/24 brd 192.168.11.255 scope global dynamic noprefixroute end0
valid_lft 172513sec preferred_lft 172513sec
inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global temporary dynamic
valid_lft 86112sec preferred_lft 14112sec
inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 86112sec preferred_lft 14112sec
inet6 fe80::ad92:ff0a:7430:5847/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff permaddr xx:xx:xx:xx:xx:xx
altname wlxxxxxxxxxxxxx
|
この環境では 192.168.11.7 みたいなので、これでSSHログインが可能になる。
1
| ssh -p22 nixos@192.168.11.7
|
これ以降はモニターを外して作業が可能。
セットアップ#
あとはNixOSでやるいつものセットアップ。
rootに入る。
※ configuration.nixにnixosユーザを書かなければnixosユーザが消えて何もできなくなるので、この時点でrootに入っておくべき。ミスった場合はブートローダー画面で元の世代に戻ればよい
初期設定ファイルを生成
/etc/nixos/configuration.nix に設定を書いた後、システムのビルドの実行。
ユーザを追加した場合は、初期パスワードを設定。
あとはこのconfiguration.nixをリポジトリで管理するなり、home-managerでユーザ側のパッケージを管理するなりやれば良いが、そのあたりは以前の記事 で紹介したので省略。
終わりに#
NixOSをラズパイに入れるところまでやった。調べたのはOSイメージの場所とディスク書き込みのやり方くらいで、思い立ってから2時間ほどでここまで来られるくらいには簡単だった。