Skip to content

Instantly share code, notes, and snippets.

@mamemomonga
Last active July 21, 2019 11:22
Show Gist options
  • Select an option

  • Save mamemomonga/e1992b3c72918a5b734c3a10e2c31013 to your computer and use it in GitHub Desktop.

Select an option

Save mamemomonga/e1992b3c72918a5b734c3a10e2c31013 to your computer and use it in GitHub Desktop.
Debian 10 buster arm64 Raspberry Pi3向けイメージの作り方

Debian 10 buster arm64 Raspberry Pi3向けイメージの作り方

Dockerを利用するバージョンを作成しました

公開されているプリビルドイメージを確認できなかったので、 Raspberry Pi image specs を使用して自分で作成する。

まだ鋭意開発中のようです。

作業環境

  • Debian Buster amd64(VMware)
  • Raspberry Pi 3B
  • UART-USB 変換アダプタ(CP2102モジュール)

以下は、シリアルコンソールでの初回起動を前提としています。(rootユーザは空パスワードなのでIPアドレスがわかってもSSHからは初回ログイン不能。公開鍵を設定すればログインできる。)

事前準備

sudo コマンドのインストールと、パスワードなしでrootになれるユーザを用意しておく。 ここではそのユーザを debianとする。以下のコマンドを root権限で実行

# bash -xeu << 'END_OF_SNIPPET'
NEW_USER=debian
apt-get install -y sudo
cat > /etc/sudoers.d/wheel_user << EOS
$NEW_USER ALL=(ALL) NOPASSWD:ALL
EOS
chmod 600 /etc/sudoers.d/wheel_user
END_OF_SNIPPET

必要なもののダウンロード

$ sudo apt install git vmdb2 parted dosfstools debootstrap qemu-user-static schroot
$ git clone --recursive https://salsa.debian.org/raspi-team/image-specs.git
$ cd image-specs

以下はdebianユーザで実行

こちらは 957f6ed をベースにしている。

イメージの作成

実行例

$ NAME=raspi3
$ sudo sh << EOS
mkdir -p $NAME
vmdb2 \
  --rootfs-tarball=$NAME/raspi3.tar.gz \
  --output $NAME/raspi3.img \
  --log stderr \
  $NAME.yaml | tee $NAME/raspi3.log 2>&1
chown -R $(id -u):$(id -g) $NAME
EOS

USB-MicroSDアダプタを刺して、デバイスを確認、この例の場合 /dev/sdd

$ lsblk -o NAME,SIZE,VENDOR,MODEL
sdd        7.3G BUFFALO  BSCR17TU3_-2

書き込み /dev/sddを自分の環境に合わせること

$ sudo dd if=$NAME/raspi3.img of=/dev/sdd bs=64k oflag=dsync status=progress

問題 957f6ed

ディスクアクティビティーLEDが点滅しない

ディスクアクティビティーランプが点滅しません。

起動時に eth0 が Upしない

起動時に eth0 が upしない問題があったが、以下の方法で対処できた。現在日々制作が進んでいるようなので、この問題はそのうち解決されると思います。

$ mkdir -p /etc/iptables
$ touch /etc/iptables/rules.v4
$ touch /etc/iptables/rules.v6

カスタムイメージ

  • ベースは raspi3.yaml
  • ミラーをさくらインターネットに
  • 無線LAN関連のソフト・ドライバを削除
  • eth0が有効になるように調整
  • GPUメモリを16MBに
  • 日本時間に設定
  • vim, git, wget, curl の導入

実行例

$ NAME=rpi3-mamemo-2
$ curl -L https://gist.githubusercontent.com/mamemomonga/e1992b3c72918a5b734c3a10e2c31013/raw/rpi3-mamemo-2.yaml > $NAME.yaml
$ sudo sh << EOS
mkdir -p $NAME
vmdb2 \
  --rootfs-tarball=$NAME/raspi3.tar.gz \
  --output $NAME/raspi3.img \
  --log stderr \
  $NAME.yaml | tee $NAME/raspi3.log 2>&1
chown -R $(id -u):$(id -g) $NAME
EOS

デバイス確認

$ lsblk -o NAME,SIZE,VENDOR,MODEL
sdd        7.3G BUFFALO  BSCR17TU3_-2

書き込み /dev/sddを自分の環境に合わせること

$ sudo dd if=$NAME/raspi3.img of=/dev/sdd bs=64k oflag=dsync status=progress

なお、再作成には $NAME フォルダを削除する必要がある。

起動

Raspberry Pi 3B に刺して起動。モニタはシリアルコンソール。

ログインは User: root Password: なし シリアルコンソールでログインし、公開鍵を設定後SSHでログイン。

# See https://wiki.debian.org/RaspberryPi3 for known issues and more details.
steps:
- mkimg: "{{ output }}"
size: 1500M
- mklabel: msdos
device: "{{ output }}"
- mkpart: primary
fs-type: 'fat32'
device: "{{ output }}"
start: 0%
end: 20%
tag: /boot
- mkpart: primary
device: "{{ output }}"
start: 20%
end: 100%
tag: /
- kpartx: "{{ output }}"
- mkfs: vfat
partition: /boot
label: RASPIFIRM
- mkfs: ext4
partition: /
label: RASPIROOT
- mount: /
- mount: /boot
mount-on: /
dirname: '/boot/firmware'
- unpack-rootfs: /
# We need to use Debian buster (currently testing) instead of Debian stretch
# (currently stable) for:
#
# linux ≥ 4.14
# Which includes the sdhost driver for faster SD card access and making the
# WiFi chip available, and has the WiFi driver enabled.
#
# raspi3-firmware ≥ 1.20171201-1
# Which includes a recent enough firmware version to correctly pass the MAC
# address to the kernel. This is a regression with Linux ≥ 4.12, see
# https://github.com/raspberrypi/firmware/issues/846
# Also, this package contains a Raspberry Pi 3-specific firmware file
# required by the WiFi driver.
- qemu-debootstrap: buster
mirror: http://debian-mirror.sakura.ne.jp/debian
target: /
arch: arm64
components:
- main
- contrib
- non-free
unless: rootfs_unpacked
# TODO(https://bugs.debian.org/877855): remove this workaround once
# debootstrap is fixed
- chroot: /
shell: |
echo 'deb http://debian-mirror.sakura.ne.jp/debian/ buster main contrib non-free' > /etc/apt/sources.list
apt-get update
unless: rootfs_unpacked
- apt: install
packages:
- ssh
- parted
- dosfstools
# Contains /lib/firmware/brcm/brcmfmac43430-sdio.bin (required for WiFi).
# - firmware-brcm80211
# - wireless-tools
# - wpasupplicant
- raspi3-firmware
- linux-image-arm64
- vim
- sudo
- git-core
- curl
- wget
- tzdata
tag: /
unless: rootfs_unpacked
- cache-rootfs: /
unless: rootfs_unpacked
- shell: |
echo "rpi3" > "${ROOT?}/etc/hostname"
# Allow root logins with no password
sed -i 's,root:[^:]*:,root::,' "${ROOT?}/etc/shadow"
install -m 644 -o root -g root fstab "${ROOT?}/etc/fstab"
install -m 644 -o root -g root eth0 "${ROOT?}/etc/network/interfaces.d/eth0"
install -m 755 -o root -g root rpi-set-sysconf "${ROOT?}/usr/local/sbin/rpi-set-sysconf"
install -m 644 -o root -g root rpi-set-sysconf.service "${ROOT?}/etc/systemd/system"
install -m 644 -o root -g root sysconf.txt "${ROOT?}/boot/firmware/sysconf.txt"
mkdir -p "${ROOT?}/etc/systemd/system/basic.target.requires/"
ln -s /etc/systemd/system/rpi-set-sysconf.service "${ROOT?}/etc/systemd/system/basic.target.requires/rpi-set-sysconf.service"
install -m 755 -o root -g root rpi-resizerootfs "${ROOT?}/usr/sbin/rpi-resizerootfs"
install -m 644 -o root -g root rpi-resizerootfs.service "${ROOT?}/etc/systemd/system"
mkdir -p "${ROOT?}/etc/systemd/system/systemd-remount-fs.service.requires/"
ln -s /etc/systemd/system/rpi-resizerootfs.service "${ROOT?}/etc/systemd/system/systemd-remount-fs.service.requires/rpi-resizerootfs.service"
install -m 644 -o root -g root rpi-generate-ssh-host-keys.service "${ROOT?}/etc/systemd/system"
mkdir -p "${ROOT?}/etc/systemd/system/multi-user.target.requires/"
ln -s /etc/systemd/system/rpi-generate-ssh-host-keys.service "${ROOT?}/etc/systemd/system/multi-user.target.requires/rpi-generate-ssh-host-keys.service"
rm -f ${ROOT?}/etc/ssh/ssh_host_*_key*
mkdir -p "${ROOT?}/etc/iptables"
touch "${ROOT?}/etc/iptables/rules.v4"
touch "${ROOT?}/etc/iptables/rules.v6"
echo "gpu_mem=16" >> "${ROOT?}/boot/firmware/config.txt"
root-fs: /
- chroot: /
shell: |
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
echo 'Asia/Tokyo' > /etc/timezone
cat > /etc/vim/vimrc.local << 'EOS'
syntax on
set wildmenu
set history=100
set number
set scrolloff=5
set autowrite
set tabstop=4
set shiftwidth=4
set softtabstop=0
set termencoding=utf-8
set encoding=utf-8
set fileencodings=iso-2022-jp,utf-8,cp932,euc-jp,ucs2le,ucs-2
set fenc=utf-8
set enc=utf-8
EOS
update-alternatives --set editor /usr/bin/vim.basic
# Clean up archive cache (likely not useful) and lists (likely outdated) to
# reduce image size by several hundred megabytes.
- chroot: /
shell: |
apt-get clean
rm -rf /var/lib/apt/lists
# Modify the kernel commandline we take from the firmware to boot from
# the partition labeled raspiroot instead of forcing it to mmcblk0p2
- chroot: /
shell: |
ls -aR /boot
sed -i 's/.dev.mmcblk0p2/LABEL=RASPIROOT/' /boot/firmware/cmdline.txt
# TODO(https://github.com/larswirzenius/vmdb2/issues/24): remove once vmdb
# clears /etc/resolv.conf on its own.
- shell: |
rm "${ROOT?}/etc/resolv.conf"
root-fs: /
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment