cdebootstrap で Raspberry Pi 4 用 Debian Buster arm64 環境を作る

  1. あらかじめ microSD を初期化します。
    この例では、/dev/sdd1 は /boot (vfat) 、/dev/sdd2 は / (ext4) で作成したものとなります。

  2. ファイルシステムをマウントして、cdebootstrap で OS をインストールします。
    # apt-get install qemu-arm-static cdebootstrap
    # mount /dev/sdd2 /mnt
    # mkdir /mnt/boot
    # mount /dev/sdd1 /mnt/boot
    # cdebootstrap --arch=arm64 -f standard --foreign buster --include=ntp,lvm2,openssh-server,net-tools -v /mnt
  3. 作成した環境に chroot します。
    # chroot /mnt
  4. root のパスワード設定し一般ユーザを作成します。
    # passwd
    # useradd -d /home/username -s /bin/bash -m username
    # passwd username
  5. /etc/fstab を以下の内容で作成します。
    proc            /proc	proc    defaults		0	0
    /dev/mmcblk0p1	/boot	vfat    defaults		0	2
    /dev/mmcblk0p2	/       ext4    errors=remount-ro	0	1
  6. 以下のファイルを作成します。
    /etc/network/interfaces
    /etc/networks
    /etc/hosts
    /etc/hostname
    /etc/mailname
    /etc/resolve.conf

  7. /etc/apt/sources.list を以下の内容で作成します。
    deb http://deb.debian.org/debian/ buster main contrib non-free
    deb-src http://deb.debian.org/debian/ buster main contrib non-free
    
    deb http://security.debian.org/debian-security buster/updates main contrib non-free
    deb-src http://security.debian.org/debian-security buster/updates main contrib non-free
    
    # buster-updates, previously known as 'volatile'
    deb http://deb.debian.org/debian/ buster-updates main contrib non-free
    deb-src http://deb.debian.org/debian/ buster-updates main contrib non-free
  8. archive.raspberrypi.org の公開鍵を設定します。
    # apt-get update
    # apt-get install gpg wget
    # wget -O - http://archive.raspberrypi.org/debian/raspberrypi.gpg.key | apt-key add -
  9. apt に archive.raspberrypi.org の設定を行います。/etc/apt/sources.list.d/archive.raspberrypi.org.list を以下の内容で作成する。
    deb [ arch=armhf ] http://archive.raspberrypi.org/debian/ buster main
    # Uncomment line below then 'apt-get update' to enable 'apt-get source'
    #deb-src http://archive.raspberrypi.org/debian/ buster main
  10. archive.raspberrypi.org の公開鍵をパッケージで設定します。
    # apt-get update
    # apt-get install raspberrypi-archive-keyring
    # rm /etc/apt/trusted.gpg
  11. /etc/apt/preferences を以下の内容で作成します。
    Package: *
    Pin: release a=testing
    Pin-Priority: 105
  12. raspi-config パッケージをインストールします。
    # apt-get install raspi-config
  13. ロケールやタイムゾーンを設定します。
    # apt-get install locales
    # dpkg-reconfigure locales
    # dpkg-reconfigure tzdata
    # apt-get install fake-hwclock
  14. ブートローダーとカーネルをインストールします。
    # apt-get -d install raspberrypi-bootloader:armhf raspberrypi-kernel:armhf
    # cd /var/cache/apt/archives/
    # dpkg -i --force-architecture raspberrypi-bootloader_1.20200212-1_armhf.deb raspberrypi-kernel_1.20200212-1_armhf.deb
  15. ※もしかすると「dpkg –add-architecture armhf」してあげればそのまま apt-get で入るかもしれない。

  16. initrd を作成します。
    # apt-get install dosfstools e2fsck-static
    # update-initramfs -c -k 4.19.97-v8+
  17. /boot/cmdline.txt を以下の内容で作成します。
    console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait quiet splash plymouth.ignore-serial-consoles
  18. /boot/config.txt を以下の内容で作成します。
    arm_64bit=1
    initramfs initrd.img-4.19.97-v8+ followkernel
  19. microSD カードをアンマウントします。
    # umount /mnt/boot
    # umount /mnt
  20. 出来上がった microSD カードを Raspberry Pi に挿入し起動し、sshd を有効とします。
    # systemctl enable ssh.service

cdebootstrap で Raspberry Pi 用 Debian buster 環境を作る

Raspberry Pi で Debian 10 buster を使うために、amd64 アーキテクチャのマシン上で armhf の環境を構築したメモです。

以前、「Raspberry Pi 2 Model B に Debian Jessie / armhf をインストールする」を参考に Debian 8 を構築したときとだいぶん変わっていました。

PC 上でのこれから Raspberry Pi 用に Debian 10 をインストールする領域は以下のようになります。

/dev/sdb1 (MicroSD カード) -> /boot
/dev/sdc1 (USB-HDD) -> /
/dev/vg01/home (USB-HDD /dev/sdc2 内 LVM) -> /home
/dev/vg01/var (USB-HDD /dev/sdc2 内 LVM) -> /var
/dev/vg01/swap (USB-HDD /dev/sdc2 内 LVM) -> /swap
  1. fdisk 等で、MicroSD カードと USB-HDD にパーティションを切ります。
  2. LVM 上にボリュームを作成して初期化します。
    # pvcreate /dev/sdc2
    # vgcreate vg01 /dev/sdc2
    # lvcreate --name home --size 512GB vg01
    # lvcreate --name var --size 256GB vg01
    # lvcreate --name swap --size 2GB vg01
    # mkswap /dev/vg01/swap
    # mkfs.vfat /dev/sdb1
    # mkfs.ext4 /dev/sdc1
    # mkfs.ext4 /dev/vg01/home
    # mkfs.ext4 /dev/vg01/var
    # mkswap /dev/vg01/swap
  3. ファイルシステムをマウントします。
    # mount /dev/sdc1 /mnt/rootfs
    # mkdir /mnt/rootfs/boot
    # mkdir /mnt/rootfs/home
    # mkdir /mnt/rootfs/var
    # mount /dev/vg01/home /mnt/rootfs/home
    # mount /dev/vg01/var /mnt/rootfs/var
    # mount /dev/sdb1 /mnt/rootfs/boot
  4. cdebootstrap で環境を構築します。
    # cdebootstrap --arch=armhf -f standard --foreign buster --include=ntp,lvm2,openssh-server,net-tools -v /mnt/rootfs
  5. rpi-update コマンドをインストールします。
    # wget http://goo.gl/1BOfJ -O /mnt/rootfs/usr/bin/rpi-update && chmod 755 /mnt/rootfs/usr/bin/rpi-update
  6. Raspberry Pi 用の Linux カーネルとファームウェアをインストールします。
    # mkdir /mnt/rootfs/lib/modules
    # ROOT_PATH=/mnt/rootfs BOOT_PATH=/mnt/rootfs/boot /mnt/rootfs/usr/bin/rpi-update
  7. /boot/cmdline.txt を作成します。
    # echo 'dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/sda1 rootfstype=ext4 elevator=deadline rootwait' > /mnt/rootfs/boot/cmdline.txt
  8. /mnt/rootfs/etc/fstab を作成します。
    proc		/proc	proc	defaults		0	0
    /dev/mmcblk0p1	/boot	vfat	defaults		0	2
    /dev/sda1	/	ext4	errors=remount-ro	0	1
    /dev/vg01/home	/home	ext4	defaults		0	2
    /dev/vg01/var	/var	ext4	defaults		0	2
    /dev/vg01/swap	none	swap	sw			0	0
  9. /mnt/rootfs/etc/network/interfaces を適当に編集します。
    source-directory /etc/network/interfaces.d
    
    auto lo
    iface lo inet loopback
    
    auto enxXXXXXXXXXXXX
    iface enxXXXXXXXXXXXX inet static
    	address xxx.xxx.xxx.xxx/24
    	gateway xxx.xxx.xxx.xxx
    	dns-nameservers xxx.xxx.xxx.xxx
  10. chroot して root のパスワードを設定します。
    # chroot /mnt/rootfs
    # passwd root
    # exit
  11. アンマウントします。
    # umount /mnt/rootfs/boot 
    # umount /mnt/rootfs/home 
    # umount /mnt/rootfs/var
    # umount /mnt/rootfs

出来上がった、Raspberry Pi に出来上がった MicroSD カードを挿し、USB-HDD を接続して起動します。
起動したら、以下を設定していきます。

  1. /etc/apt/sources.list を編集します。
    deb http://deb.debian.org/debian/ buster main contrib non-free
    deb-src http://deb.debian.org/debian/ buster main contrib non-free
    
    deb http://security.debian.org/debian-security buster/updates main contrib non-free
    deb-src http://security.debian.org/debian-security buster/updates main contrib non-free
    
    # buster-updates, previously known as 'volatile'
    deb http://deb.debian.org/debian/ buster-updates main contrib non-free
    deb-src http://deb.debian.org/debian/ buster-updates main contrib non-free
  2. /etc/apt/sources.list.d/raspi.list を作成します。
    deb http://archive.raspberrypi.org/debian/ buster main
    deb-src http://archive.raspberrypi.org/debian/ buster main
  3. archive.rasberrypi.org 用の gpg.key をインポートします。
    # wget http://archive.raspberrypi.org/debian/raspberrypi.gpg.key -O - | apt-key add -
    # apt-get update
    # apt-get install raspberrypi-archive-keyring 
    # rm /etc/apt/trusted.gpg
  4. /etc/apt/preferences ファイルを作成します。
    Package: *
    Pin: release a=testing
    Pin-Priority: 105
  5. raspi-config コマンドをインストールします。
    # apt-get update
    # apt-get install raspi-config
  6. ロケールとタイムゾーンを設定し、fake-hwclock をインストールします。
    # apt-get install locales
    # dpkg-reconfigure locales
    # dpkg-reconfigure tzdata
    # apt-get install fake-hwclock
  7. あとは、hostname を設定したり、mailname を設定したり、hosts を設定したりいつもの作業です。

食わず嫌いしていた LVM (やってみたら凄い簡単だった) と、amd64 上であったとしても qemu-arm-static があれば cdebootstrap で armhf の環境に chroot 出来ると言うことが一番の収穫だったと思います。

Raspberry Pi 4: eeprom アップデータと wifi ファームウェアをインストールする

Raspberry Pi 4 で以前利用していた Raspberry Pi 2 の環境をそのまま使う」の続きです。

上記の設定では、内蔵 wi-fi が OS から認識されず、また eeprom のアップデータもインストールされない状態でしたので、それを修正します。

  1. /etc/apt/sources.list.d/raspi.list を以下の内容で作成します。
    deb http://archive.raspberrypi.org/debian/ buster main
    deb-src http://archive.raspberrypi.org/debian/ buster main
  2. Raspberry Pi 固有のリポリトジを追加して、eeprom アップデータ、Raspberry Pi 設定ツール、Wi-Fi のファームウェアをインストールします。
    # wget http://raspbian.raspberrypi.org/raspbian.public.key -O - | sudo apt-key add -
    # apt-get update
    # apt-get install rpi-eeprom raspi-config firmware-brcm80211
  3. /etc/apt/preferences を以下の内容に編集します。
    Package: *
    Pin: release a=testing
    Pin-Priority: 105
  4. 再起動します。

上記を実行すると、Linux カーネルは Raspberry Pi のリポリトジから提供されるものに置換されました。
また、Wi-Fi インタフェースについては、再起動後に ifconfig -a とすると wlan0 が見えるようになりました。

Raspberry Pi 4 で以前利用していた Raspberry Pi 2 の環境をそのまま使う

Raspberry Pi 2 Model B で、MicroSD カードのみ /boot パーティションとして設定、他パーティションは USB-HDD で運用していた環境を、ほぼそのまま、ちょこっと修正して Raspberry Pi 4 Model B で運用した際の備忘録です。
なお、OS は Debian GNU/Linux 10 buster です。

事前に最新の Raspbian を MicroSD にインストールし、一度 Raspberry Pi 4 Model B で起動して初期設定を完了しておきます。

以下、Raspberry Pi 2 Model B 上での作業です。

  1. /boot パーティションのファイルを、別マシンなどにバックアップしておきます。(最悪これさえあれば Raspberry Pi 2 Model B で起動することが出来るので)
  2. Kernel building – Raspberry Pi Documentation」の手順に従って、Raspberry Pi 4 Model B 用のカーネルをビルドし、インストールを実行します。
  3. Raspberry Pi 2 Model B をシャットダウンします。

以下、任意の作業マシン上で行います。

  1. Raspberry Pi 2 Model B で利用していた MicroSD カードの /boot/cmdline.txt を編集します。
    最新の Raspbian の Raspberry Pi 4 Model B 用の /boot/cmdline.txt を参考に以下のように設定しました。

    console=serial0,115200 console=tty1 root=PARTUUID=xxxxxxxx-xx rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles apparmor=1 security=apparmor

    ※カーネル再構築して、AppArmor を有効にしているのでその設定も行っています。
    なお、PARTUUID は、Raspberry Pi 2 Model B の電源を落とす前に blkid で調べることが出来ます。(今回は USB-HDD の /dev/sda1 に相当する PARTUUID を指定しました)

  2. 初期設定の完了した、最新の Raspbian の MicroSD カードから /boot の以下の全てのファイル・ディレクトリについて、cmdline.txt と kernel7l.img 以外を Raspberry Pi 2 Model B で利用していた MicroSD カードの /boot にコピーします。

あとは、Raspberry Pi 4 Model B に MicroSD カードを挿入、USB-HDD も接続して電源をオンすると、Raspberry Pi 4 Model B で今までの環境で起動が出来ました。

この方法、「Raspbian って、/boot にあるカーネル以外は共通のコードなので、/boot パーティションの内容を入れ替えて、カーネルバージョンとカーネルモジュールの整合性さえとれば起動できるのでは」と思いついたのですが、予想どおり上手くいきました。

余談ですが、使っている USB3.0 の HDD ケースと Raspberry Pi 4 との相性が悪いのか、上手く起動しないときがあります。そのような場合は、全ての電源を切って、USB-HDD だけを USB 接続して電源を入れると、上手く起動してくれるようです。
USB デバイスを抜き差したり、指すポートを変えてみたりすると起動するようです。

追記
Linux Kernel 4.19.97 を Raspberry Pi 2 Model B と、4 Model B でビルドしてみたところ、

Pi 2 Model B: 205m19.397s
Pi 4 Model B: 90m37.475s

と、圧倒的に Pi 4 Model B は早いです。

Raspberry Pi 4: eeprom アップデータと wifi ファームウェアをインストールする」に続きます。

Debian 8 + DNS64 + NAT64 on the Raspberry Pi 2

Debian 8 上に DNS64 + NAT64 を設定した備忘録である。例によって無保証である。

2017/02/11 追記: Jool 3.5.x 系でも同じようにインストール出来ることを確認した。

Linux カーネルのビルドは、「Kernel Building – Raspberry Pi Documentation」に記載の通り、DNS64, NAT64 関係は、「DSAS開発者の部屋:Raspberry Pi 2 で NAT64 箱をつくってみた」の通りとなる。

両者のドキュメントに感謝しつつ、実際に設定を行ってみた。なお、私の環境では、USB で NIC を接続して別インタフェースを接続している。

続きを読む

Raspberry Pi 2 Model B を AirPlay サーバに (Shairport Sync 利用編)

Raspberry Pi 2 Model B を AirPlay サーバに」で、「ShairPort」を使用して、AirPlay サーバを設定したのですが、以下の点で、若干問題が生じたのと、気になっていた点がありました。

  • iOS デバイス側で曲をスキップすると、再生が止まってしまう。
  • サーバ側で UDP ポートについて広い範囲で入力を許可としないといけない。

派生版 (?) の「Shairport Sync」を使用してみたところ、これらの問題を解決することが出来ました。


■前提条件

Raspberry Pi 2 Model B を AirPlay サーバに」の「ALSA の設定」の項目の設定が全て完了し、また前回と環境も同じであることとなります。

続きを読む

Raspberry Pi 2 Model B を AirPlay サーバに

何本煎じのネタかわからないぐらい情報がありますが、自分自身で Raspberry Pi 2 Model B 上の Debian GNU/Linux 8 (Raspbian ではない) のシステムに、「abrasive/shairport · GitHub」をインストールした際の記録です。

手元の iOS デバイスの音楽を、iOS デバイスと同一ネットワーク内のサーバに接続した USB-DAC 経由でスピーカーから流す、と言うのを行いました。

なお、サーバには既に avahi-daemon が設定済みであることが前提です。

続きを読む

Raspberry Pi 2 Model B 買ってみました

今さらなのですが、Raspberry Pi 2 Model B を買ってみました。Debian GNU/Linux をベースとした Raspbian での設定メモです。

初期設定などは、公式ドキュメントや、公開されている情報などを参考にさせて頂きました。ちなみに、主に参考にさせて頂いたのは、以下のサイトです。

基本的な設定と、root ファイルシステムを外付け HDD で運用するための設定については、上記サイトを参考にさせていただき、設定が出来ました。ので、ほとんど書くことがないのですが、それ以外でなじみのある x86 系統の Debian とちょっと違うと言うところについて備忘録程度に記載します。

  • ip6tables をいきなり実行しても使用できない
    ipv6 モジュールを先に読み込んでおく必要がありました。
    # modprobe ipv6
    で OK ですが、再起動時に有効にさせる場合は、
    # echo ipv6 >> /etc/modules
    しておいた方が良いかもです。

  • カーネルの起動オプションで「elevator=deadline」が指定されている
    今回は、外付け USB-HDD で root ファイルシステムを運用するので、「/etc/rc.local」に「echo “cfq” > /sys/block/sda/queue/scheduler」を指定しています。デフォルト設定がなぜ「deadline」なのかはよくわかりませんが、microSD で運用するケースではこちらの方が適しているのでしょうか ?

  • Linux のカーネルは、rpi-update コマンドで行う。
    Linux カーネルはどうも apt で提供されているもので起動しているのではなく、rpi-update コマンドでアップデートできる。(apt-cache search linux-image するとカーネルパッケージが表示されるが、dpkg で調べるとそれらはインストールされていない)

  • ファイルベースで swap が確保されている
    こちらは、swapoff で該当 swap の利用を停止して、
    # apt-get autoremove –purge dphys-swapfile
    にて設定を解除しました。
    (今回は外付け USB-HDD に swap 領域を切ってそちらを利用したため)

  • /etc/fstab で UUID でディスクをマウントすると、マウントできるのだけど、起動時に警告が出た
    と言うことで、/dev/sda1 みたいな指定方法で /etc/fstab を記載しました。

  • rkhunter を実行すると「/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so」について警告が出る
    これは「/etc/ld.so.preload」に該当ファイルを読み込む記述があるからですが、私はこのファイルについて特に問題ないものと思いましたので、「/etc/rkhunter.conf」ファイル中で、「SHARED_LIB_WHITELIST=”/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so”」して、除外としました。
    simonjhall/copies-and-fills · GitHub」が該当のようで、どうも memcpy, memset を最適化するもののようです。

    2015/07/09 追記
    Debian 8.0 ベースの Raspbian では、raspi-copies-and-fills パッケージのアップデートに伴い、preload されるファイルが /usr/lib/arm-linux-gnueabihf/libarmmem.so になっている模様です。(追記終わり)

  • SysVinit でプログラムの起動順序を変える
    bind9 と ntpd を導入したところ、ntpd が起動してから bind9 が起動するため、ntp.conf で FQDN で ntp サーバ名を書いていると名前解決できません。
    /etc/insserv/overrides/ntp を以下の内容で作成し、insserv を実行しました。

    ### BEGIN INIT INFO
    # Provides:        ntp
    # Required-Start:  $network $remote_fs $syslog bind9
    # Required-Stop:   $network $remote_fs $syslog bind9
    # Default-Start:   2 3 4 5
    # Default-Stop: 
    # Short-Description: Start NTP daemon
    ### END INIT INFO

と言うわけで、最初からある程度設定されているゆえに、どのように設定されているかがつかみにくかったですが、何とか自分が使用したい用途で使える状態に持って行けました。

また、散々言われているようですが、電源は結構シビアなようです。セルフパワー USB ハブからの給電では、起動できたり出来なかったりでしたが、2A の USB 給電アダプタにしたところ、安定して動作しています。

今回、実際のところ一番苦労をしたのって、ケースを「Raspberry Pi B+ 用ケース (819-3646)」とセットになっているものを購入したのですが、microSD の干渉部分は事前に情報があったのでわかっていたのですが、ケースの個体差か、意外にも USB インタフェース部分でちゃんとバリ取りがされていなかったので、それの処理でしょうか。