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

AMD64 アーキテクチャ上のマシンで、Raspberry Pi 4 用の ARM64 な Debian Buster の環境を構築したメモです。

2020/09/13 補足: 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 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 install raspberrypi-bootloader raspberrypi-kernel
  15. initrd を作成します。
    # apt-get install dosfstools e2fsck-static
    # update-initramfs -c -k 5.4.51-v8+

    ※「5.4.51-v8+」の部分は、/lib/modules 以下の文字列に会わせる。

  16. /boot/cmdline.txt を以下の内容で作成します。
    console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait quiet splash plymouth.ignore-serial-consoles
  17. /boot/config.txt を以下の内容で作成します。
    arm_64bit=1
    initramfs initrd.img-4.19.97-v8+ followkernel
  18. microSD カードをアンマウントします。
    # umount /mnt/boot
    # umount /mnt
  19. 出来上がった microSD カードを Raspberry Pi に挿入し起動し、sshd を有効とします。
    # systemctl enable ssh.service
  20. あとは rpi-eeprom パッケージを入れるなど、必要に応じて設定を行います。

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 ファームウェアをインストールする」に続きます。

RTX810 で SNMP Trap を送信し、Linux マシンで受ける

SNMP Trap を送信するルータは、YAMAHA RTX810 、受信するマシンの OS は Debian 10 。受信したトラップを root あてにメールする。

RTX810 の設定

snmp trap host [SNMP トラップを受けるサーバの IPv4 アドレス]
snmp trap community router
snmp trap enable snmp all

Debian 10 側の設定

  • snmptrapd をインストール

    # apt-get install snmp snmptrapd nmp-mibs-downloader
  • YAMAHA private MIB をダウンロード

    YAMAHA private MIB のページより、yamaha-private-mib.tar.gz をダウンロードし、アーカイブ中のファイルを /usr/local/share/snmp/mibs/yamaha 以下に保存する。

  • snmp の設定

    /etc/snmp/snmp.conf
    #mibs :
    mibdirs +/usr/local/share/snmp/mibs/yamaha
    mibs +ALL

    ※ mibs : をコメントアウトし、mibsdirs と mibs を設定する。

  • snmptrapd の設定

    /etc/snmp/snmptrapd.conf
    authCommunity log,execute router
    traphandle default /usr/bin/traptoemail -f snmp@example.com -s 127.0.0.1 root

    ※ snmp trap のコミュニティ名はルータと snmptrapd.conf で同じものとする。

  • snmptrapd を起動

    # systemctl start snmptrapd.service
  • 起動時に snmptrapd を有効とする

    # systemctl enable snmptrapd.service
  • ルータからの UDP 162 を通過するようにしておく

Debian 10 Buster で fail2ban のメモ

Debian 10 Buster で fail2ban を設定したときのメモ。とりあえず sshd だけで、メール通知するようにしたパターン。

  1. インストールする。

    # apt-get install fail2ban
  2. /etc/fail2ban/jail.conf を変更する。以下はインストール状態からの変更点のみ。
    ignoreip = 127.0.0.1/8 ::1 # ban 対象としない IP アドレスを指定
    destemail = root@example.com # 送信先メールアドレスを設定
  3. /etc/fail2ban/jail.d/sshd.conf を新規作成する。

    [sshd]
    enabled = true
    port	= 22 # 実際の sshd のポートを指定
    logpath	= %(sshd_log)s
    backend	= %(sshd_backend)s
    action	= %(action_mw)s
  4. fail2ban を再起動する。

    # systemctl restart fail2ban.service

テストしてみたところ IPv4 はもちろん、IPv6 でも正常に (?) ban されることを確認した。

ban が発動すると該当アドレスについて、iptables で「f2b-sshd」というチェインが作られ、REJECT されるようになっていた。なお、指定時間が経過後は「f2b-sshd」チェインは残るものの、REJECT が削除されて通信出来るようになるようだ。

また、fail2ban 自体を再起動すると「f2b-sshd」チェインも削除されるようだ。ただ、ban 対象がある場合はそれは復元されるみたい。

もちろん、既存のルールに影響することがないように設定される。

Debian 9 の Apache2.4 で TLSv1.3 を利用する

TLSv1, TLSv1.1 が 2020 年にもメジャーなブラウザで無効化されると言う話題が出ていました。

Deiban 9 の Apache 2.4 は、TLSv1.2 に対応しているので特に影響はありませんが、どうせという事で TLSv1.3 に対応をしてみました。

続きを読む

cups から AirMac Extreme で共有されているプリンタに印刷および再度共有する設定メモ

表題の通り、cups が動作している Linux マシンから、AirMac Extreme に接続されているプリンタに印刷する設定である。

なお、例によって、Debian GNU/Linux 9 での設定例である。サーバは、192.168.1.1 、共有プリンタが接続されている AirMac Extreme は 192.168.1.2 とする。

・事前準備

iptables などでフィルタリングしている場合、あらかじめサーバから TCP 192.168.1.2:9100 宛への通信を許可する。

・cups のインストール

# apt-get install cups

・管理ユーザの設定

# adduser username lpadmin

cups の Web インタフェースへ管理画面接続可能な様に、任意の管理者ユーザ (この例では username) を lpadmin グループに所属させる。

・リモートのブラウザから設定

$ ssh -L 8080:127.0.0.1:631 username@192.168.1.1

リモートから、サーバ (この例では 192.168.1.1) の 631 ポートへポートフォワードし、ssh 接続する。

・ブラウザで、http://127.0.0.1:8080/ を開き cups の設定を行う

「管理」メニューより、以下の通り進める。なお、BASIC 認証画面が出たら、「管理ユーザの設定」の項目で設定したユーザ名とパスワードで認証する。

  1. 「このシステムに接続されているプリンターを共有」にチェックを入れる。
  2. プリンターの追加を選択。
  3. その他のネットワークプリンター内「AppSocket/HP JetDirect」にチェックし、「続ける」をクリックする。
  4. 接続に「socket://192.168.1.2:9100」の様に入力し、「続ける」をクリックする。
  5. 名前は適当にプリンタ名、説明も適当にメーカ名 + プリンタ名、場所もやっぱり適当に入力し、このプリンターを共有するにチェックを入れ、「続ける」をクリックする。
  6. AirMac Extreme に接続されているプリンタのメーカ名を選択し「続ける」をクリックする。
  7. AirMac Extreme に接続されているプリンタのモデルを選択し「プリンターの追加」をクリックする。
  8. 該当プリンタのデフォルトの設定画面が表示されるので、必要に応じて変更し「デフォルトオプションの設定」をクリックする。

・テスト印刷

「プリンター」メニューより、先ほど追加したプリンタを選択し「メンテナンス」内「テストページの印刷」を選択して、正しくプリントアウトされることを確認する。

・共有について

該当 Linux マシンには avahi をインストール済みのため、ローカルネットワークからサーバ TCP 631 宛の通信を許可するだけで、macOS から IPP 経由で印刷できるようになったりする。

ちなみに上記の設定だけで、iOS デバイスから AirPrint 可能なデバイスとして認識される。が、正常に印刷が出来たのは iOS 6 の端末のみで、iOS 11 からは正しく印刷できなかった。

2018/02/10 追記
iOS 11 においても、iOS アプリの「Printer Pro by Readdle」を使用すると、印刷することが出来た。
(追記おわり)

・参考にさせていただいたサイト