Raspbianをdebootstrapから作る

スモールイメージのRaspbianが欲しく、debootstrapで構築してみました。
Minibianというディストリもあったんですが、ディスクサイズ変更やパッケージ導入が上手くできなかったので、
debootstrapで行うことにしています。

多分、Ubuntu、debianで構築できると思います（私は、Docker上のubuntuで行っております)。

## 参考

- http://elinux.org/Raspbian
- http://www.kaibader.de/homemade-minimal-raspberry-pi-raspbian-image/

## インストール
- Docker for Windows上でUbuntuコンテナを作成して構築
- 最終的なSDカードイメージはCentOS上で作業

```shell-session:前提パッケージの導入
sudo apt-get install -y qemu-user-static binfmt-support debootstrap git
```

```shell-session:インストール(jessie)
sudo mkdir /raspi-root
cd /raspi-root
sudo debootstrap --include=ca-certificates,apt,wget --foreign --arch=armhf jessie . http://archive.raspbian.org/raspbian
sudo cp $(which qemu-arm-static) ./usr/bin/
sudo chroot . debootstrap/debootstrap --second-stage --verbose
```

```shell-session:chroot準備
sudo mount -t sysfs sysfs sys/ 
sudo mount -t proc  proc  proc/
sudo mount -o bind /dev  dev/
sudo mount -o bind /dev/pts dev/pts
```

```shell-session:ホスト名、hosts設定
sudo echo raspberry >./etc/hostname
sudo echo 127.0.0.1\traspberry >>./etc/host
```

## ファイル編集
```:/raspi-root/etc/apt/sources.list
deb http://ftp.jaist.ac.jp/raspbian jessie main firmware non-free
deb http://mirrordirector.raspbian.org/raspbian jessie main firmware non-free
deb http://archive.raspberrypi.org/debian jessie main
```
```:/raspi-root/etc/fstab
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
```

```:/raspi-root/etc/fstab
proc           /proc    proc  defaults         0 0
/dev/mmcblk0p1 /boot    vfat  defaults,noatime 0 0
/dev/mmcblk0p2 /        ext4  defaults,noatime 0 0
tmpfs          /tmp     tmpfs defaults         0 0
tmpfs          /var/tmp tmpfs defaults         0 0
```

## パッケージインストール
```shell-session:リポジトリ認証の鍵情報追加
sudo chroot . wget http://archive.raspbian.org/raspbian.public.key -O - | chroot . apt-key add -
sudo chroot . wget http://archive.raspberrypi.org/debian/raspberrypi.gpg.key -O - | chroot . apt-key add -
```
```shell-session:最低限のパッケージ導入
sudo chroot . apt-get update
sudo chroot . apt-get -y upgrade
sudo chroot . apt-get install -y \
sudo \
openssh-server \
usbmount \
patch \
less \
console-common \
console-data \
console-setup \
tzdata \
most \
locales \
keyboard-configuration \
raspi-config rpi-update
```
```shell-session:piユーザの作成
sudo chroot . useradd -m -s /bin/bash pi
sudo chroot . usermod -a -G sudo,staff,kmem,plugdev,audio pi
sudo chroot . passwd pi
```

## bootパーティションファイル作成
```shell-session:firmware導入
git clone https://github.com/raspberrypi/firmware.git ~/firmware
```
```shell-session:bootディレクトリ作成
sudo mkdir /raspi-boot
sudo mount --bind /raspi-boot /raspi-root/boot
sudo cp -R ~/firmware/boot/* /raspi-root/boot/
sudo mkdir /raspi-root/lib/modules/
sudo cp -R ~/firmware/modules/* /raspi-root/lib/modules/
```

## ディスクイメージ作成
```shell-session:最終工程
sudo chroot . apt-get clean
sudo chroot . apt-get autoclean
sudo chroot . apt-get autoremove -y
sudo chroot . raspi-update
sudo umount ./dev/pts
sudo umount ./dev
sudo umount ./proc
sudo umount ./sys
sudo umount ./boot
```
```shell-session:SDイメージ作成
dd if=/dev/zero bs=1M count=3839 > ~/root.img
sudo losetup -f ~/root.img
sudo losetup -a
sudo parted -s /dev/loop0 mklabel msdos
sudo parted -s /dev/loop0 unit cyl mkpart primary fat16 -- 0 16
sudo parted -s /dev/loop0 set 1 boot on
sudo parted -s /dev/loop0 unit cyl mkpart primary ext2 -- 16 -2
sudo losetup -d /dev/loop0
sudo losetup -f -P ~/root.img
sudo mkfs.vfat -n System /dev/loop0p1
sudo mkfs.ext4 -L Storage /dev/loop0p4
sudo mount /dev/loop0p1 -o rw /mnt
sudo cp -R /raspi-boot/* /mnt/
sudo umount /mnt
sudo mount /dev/loop0p2 -o rw /mnt
sudo cp -R /raspi-root/* /mnt/
sudo umount /mnt
sudo losetup -d /dev/loop0
```

~/root.imgをddまたは、Win32DiskImagerでmicro sdカードに書き込めば完了です。