Help us understand the problem. What is going on with this article?

Raspberry Pi 2 に BTRFS な Arch Linux ARM を入れた

More than 3 years have passed since last update.

はじめに

Raspberry Pi 2 に Arch Linux ARM (alarm) をインストールしたのでそのメモ。
Arch Linux ARM の公式ページにある方法だとファイルシステムが ext4 になってしまうが、頑張って btrfs でインストールしてみた。

ちなみに、インストールのために Raspberry Pi 用にキーボードやディスプレイは不要。

インストール用マシンの準備

SD カードに対していろいろするためのマシンを用意する。
基本的にはインストール用マシンで OS のインストールからセットアップまで全ての作業を行う。

alarm のバイナリをダウンロードしておく

公式のダウロードページから Raspberry Pi 2 用のバイナリを入手する。
Downloads | Arch Linux ARM
ARMv7 Raspberry Pi 2 という項目があるはずなのでそこの tar.gz をダウンロードしておく。
結構時間がかかるのでその間に次の作業に移る。

インストール作業に必要なパッケージのインストール

具体的には下記のようなパッケージをインストールしておく。

  • btrfs-progs
  • arch-install-script
  • qemu
  • qemu-user-static (AUR)
  • binfmt-support (AUR)

btrfs-progs は btrfs の操作に必要。
arch-install-script は Arch Linux 用の chroot である arch-chroot コマンドが使えるようになるもの。
qemu、qemu-user-static、binfmt-support は詳細は後述するが chroot するために必要。

SD カードを差し込む

SD カードを何かしらの手段で読む。自分は VAIO のノートだったので最初から SD カードスロットがあった。
lsblk を実行してみてデバイスとしてちゃんと認識しているか確認する。

# lsblk -f
sda
├─sda1      ...
├─sda2      ...
└─sda3      ...
mmcblk0

上記のように mmcblk0 のようなデバイスがあれば OK。(名前はこれで固定なのかは不明)

パーティションの作成

まずは cfdisk を使ってパーティションを切る。
最初にパーティションタイプを聞かれたら DOS を選択する。
下記のような感じで3つほどパーティションを作成する

Device Size Type
/dev/mmcblk0p1 100MB 程度 W95 FAT32
/dev/mmcblk0p2 512MB 程度 Linux swap
/dev/mmcblk0p3 たくさん Linux filesystem

スワップファイルにせず、わざわざスワップパーティションを作成するのは btrfs がスワップファイルに対応していないから。

ファイルシステムの作成

下記のような感じでファイルシステムを作る。
スワップパーティションに対してもスワップを有効にしておく。

# mkfs.vfat /dev/mmcblk0p1
# mkfs.btrfs /dev/mmcblk0p3

# mkswap /dev/mmcblk0p2
# swapon /dev/mmcblk0p2

btrfs は root 用と home 用のサブボリュームを作ることにする。そのために一時的にマウントする。

# mkdir /mnt/sdcard
# mount /dev/mmcblk0p3 /mnt/sdcard
# cd /mnt/sdcard
# btrfs subvolume create rpi2-root
# btrfs subvolume create rpi2-home

下記のコマンドでサブボリュームの ID を確認しておく。

# btrfs subvol list -p .
ID 257 gen 50449 parent 5 top level 5 path rpi2-root
ID 258 gen 50437 parent 5 top level 5 path rpi2-home

root 用のパーティションをデフォルトのサブボリューム ID に設定する。

# btrfs subvolume set-default 257 .

作業が終わったらアンマウントする。

# umount /dev/mmcblk0p3

ファイルのコピー

最初にマウントをする。

# mount /dev/mmcblk0p3 /mnt/sdcard
# mkdir /mnt/sdcard/boot
# mount /dev/mmcblk0p1 /mnt/sdcard/boot
# mkdir /mnt/sdcard/home
# mount /dev/mmcblk0p3 -osubvol=rpi2-home /mnt/sdcard/home

mmcblk0p3 を2回マウントしているが、最初の方はデフォルトのサブボリュームである root になっている。
2回目の方は subvol を指定しているので home の方のパーティションがマウントされる。

最初にダウンロードしておいたバイナリを SD カードにコピーする。

# bsdtar -xpf ArchLinuxARM-rpi-2-latest.tar.gz -C /mnt/sdcard

fstab

忘れずに fstab を生成しておく。(SD カード側に)最初から存在する /etc/fstab は上書きしても問題なさそう。

# genfstab -U /mnt/sdcard > /mnt/sdcard/etc/fstab
# vim /mnt/sdcard/etc/fstab

fstab の中身は基本的にはそのままで良いはずだが、インストール用マシン側の設定が混じったりすることもあるのでちゃんと見ておく。
btrfs の subvol などが正しく設定されているかも一応確認する。

chroot

Raspberry Pi が動作する環境はバイナリが arm なので、通常の Arch Linux のインストールのように SD カードに chroot することができない。
しかし、QEMU を使って実行ファイルを x86 に変換することで arm の環境であっても chroot させることができるようになる。

まずは ARM から x86 への変換を有効にする。

# update-binfmts --enable qemu-arm

結果を確認
# update-binfmts --display qemu-arm
qemu-arm (enabled):
     package = qemu-user-static
     ...

ARM からの変換を行う実行ファイルを SD カードにコピーする。

# cp /usr/bin/qemu-arm-static /mnt/sdcard/usr/bin

これで問題なく chroot できるようになったはず。

# arch-chroot /mnt/sdcard /bin/bash

アーキテクチャが正しく ARM になっていることを確認する。

# uname -m
armv7l

boot 関係

地味に大切なステップ。
デフォルトは ext4 でブートするようになっているのでそのあたりの設定を変える必要があるのだが、それは /boot/cmdline.txt に書かれたカーネルのパラメータで指定されているので
そこをちょろっと書き換えてやれば良い。

/boot/cmdline.txt
# root パラメータのデフォルトは /dev/mmcblk0p2 になっているので3に書き換える。
# rootfstype というパラメータを追加する。
root=/dev/mmcblk0p3 rootfstype=btrfs rw rootwait ...

initrd の再作成が必要な気がしていたが別にそんなことはなかったぜ!

もろもろセットアップ

あとはいつも通り。

  • ミラー /etc/pacman.d/mirrorlist を編集して、台湾あたりを先頭に持ってくる。
  • pacman -Syyu でシステムのアップデート。
  • pacman -S base-devel でいろいろインストール。
  • /etc/vconsole.conf でキーボードレイアウトとコンソールフォントを指定。
  • タイムゾーン。
  • ユーザの追加。
  • ホスト名。
  • ほか必要なもの。

chroot 環境では当然 CPU はインストール側マシンのものを使うので、ビルドに時間がかかるものなどは一通りインストールしておくとよい。

起動!

SD カードを抜いて Raspberry Pi 2 に挿して電源を入れれば起動するはず!

# exit
chroot から脱出
# umount -R /mnt/sdcard
SD カードを抜く
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away