Edited at

Raspberry Pi 3 Model B+ で Ubuntu Server 16.04 を使う方法

More than 1 year has passed since last update.


はじめに

Raspberry Pi で Ubuntu を使いたい時,まず思いつくのは Raspberry Pi 3 Model B で使える Ubuntu MATE だと思います.

しかしながら,Raspberry Pi 3 Model B+ では Ubuntu MATE は使えないようです.

3B+で ROS Kinetic を使いたい際に,どうしたら良いのか調べてみたら,Ubuntu Server なら3B+で使えるという記事がいくつかあったので,それらを参考にしてイメージを用意する手順をまとめてみました.


作業した環境


  • Ubuntu 16.04.5 LTS

  • microSDカードリーダーライター


手順


1. Raspberry Pi 2用のイメージをダウンロード

cdimages.ubuntu.com から ubuntu-16.04.4-preinstalled-server-armhf+raspi2.img.xz をダウンロードする


2. Etcher や dd コマンドを使ってSDカードにイメージを焼く(どちらかで焼いて下さい)


Validated Flashing, Hard Drive Friendly, Beautiful Interface, Open Source, Cross Platform, More on the way

  


  Etcherという,イメージを焼くのに適したソフトがあります.  

  使い方は難しくありません.xzを解凍する必要はありません.  

  1. Select image で 落としたイメージを選択します.  

  2. Select drive で PCに挿したSDカードを選択します.  

  3. Flash! でパスワードを要求されるので入力します.  



  • dd コマンド



  1. イメージを解凍する

    cd [イメージがあるディレクトリ]
    

    unxz ubuntu-16.04.4-preinstalled-server-armhf+raspi2.img.xz
    



  2. イメージを焼く

    dd bs=4M if=ubuntu-16.04.4-preinstalled-server-armhf+raspi2.img of=/dev/sdX status=progress conv=fsync
    


sdX は環境に合わせて変えてください.


3. disk 拡張の準備をする

sudo fdisk /dev/sdb

/dev/*** は環境に合わせて変えてください.

p  # sdb2 の Start の値 をメモしておいてください.

d # delete
2 # 2番目を選択
p
n # new
p # Primary
2
270336 # sdb2 の Start の値
[Enter Key]
p
w # 保存して終了

起動後にresize2fs /dev/mmcblk0p2を行う


4. raspberrypi/firmware をクローンする

git clone https://github.com/raspberrypi/firmware.git


5. クローンしたリポジトリの一部をSDカードの指定の位置へコピーする(上書き)

SDカードをPCが認識していない時は抜き差ししてみてください.


SDカードは以下のように見えていると思います.

/media/[ユーザ名]/cloudimg-rootfs

/media/[ユーザ名]/system-boot

余談 :

本当はMac OSでイメージを作成したかったけど,cloudimg-rootfs がマウントできていないみたいだった.VMWare Fusion上のUbuntuでは見えた.

sudo cp -rip [クローンしたfirmware]/boot/* /media/[ユーザ名]/system-boot/

sudo cp -rip [クローンしたfirmware]/modules/* /media/[ユーザ名]/cloudimg-rootfs/lib/modules/


  • cp のオプション


    • r : 再帰的にコピー(ディレクトリ)

    • i : 上書きを確認

    • p : パーミッションなどを保持



i オプションは念のため.cp: overwrite ~ ? は Enter key で実行.


6. system-boot 内の config.txt を修正する

sudo nano /media/[ユーザ名]/system-boot/config.txt

おそらく,5~6行目くらいに

kernel=uboot.bin

device_tree_address=0x02000000

という行があるので,kernel=uboot.binを消すかコメントアウトして

device_tree_address=0x02000000

となるようにする.


7. flash-kerne/db/all.dbへ追記する

sudo nano /media/[ユーザ名]/cloudimg-rootfs/usr/share/flash-kernel/db/all.db

下記の内容を一番下へ追記する.

Machine: Raspberry Pi 3 Model B Rev 1.2

Kernel-Flavors: rpi2 rpi2-rpfv
DTB-Id: bcm2710-rpi-3-b.dtb
Boot-Kernel-Path: kernel7.img
Boot-DTB-Path: bcm2710-rpi-3-b.dtb
Boot-Device: /dev/mmcblk0p1

Machine: Raspberry Pi 3 Model B Plus Rev 1.3
Kernel-Flavors: rpi2 rpi2-rpfv
DTB-Id: bcm2710-rpi-3-b-plus.dtb
Boot-Kernel-Path: kernel7.img
Boot-DTB-Path: bcm2710-rpi-3-b-plus.dtb
Boot-Device: /dev/mmcblk0p1


8. boot を整理する

cd /media/[ユーザ名]/cloudimg-rootfs/boot/

sudo rm -rf v* r* i* g* c* a* S* firmware.bak/


9. オンボードの無線LANを使えるようにする

cd /media/[ユーザ名]/cloudimg-rootfs/lib/firmware/brcm/

sudo wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43455-sdio.bin https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43455-sdio.clm_blob https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43455-sdio.txt


10. root のパスワードを初期化する

sudo nano /media/[ユーザ名]/cloudimg-rootfs/etc/shadow

1行目の

root:*:17590:0:99999:7:::

root::17590:0:99999:7:::

へ書き換える.


11. A start job is running for raise network interfaces 対策

これをしないかつ,有線LANが刺さってない場合は5min待たされる.

rm /media/[ユーザ名]/cloudimg-rootfs/etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online  

mv /media/[ユーザ名]/cloudimg-rootfs/etc/systemd/system/cloud-init.target.wants /media/[ユーザ名]/cloudimg-rootfs/root/

sudo nano /media/[ユーザ名]/cloudimg-rootfs/etc/network/interfaces.d/eth0

allow-hotplug eth0

iface eth0 inet dhcp

下は無線LANのNIC起動

sudo nano /media/[ユーザ名]/cloudimg-rootfs/etc/network/interfaces.d/wlan0

auto wlan0

iface wlan0 inet dhcp

interfaces に interfaces.d の設定を読み込む設定を書く

sudo nano /etc/network/interfaces

source-directory /etc/network/interfaces.d/

メモ :


auto eth0 だと、ブート時にネットワーク接続を確認し始めるため,接続されてないと 5min wait... になります.

5min は(/media/[ユーザ名]/cloudimg-rootfs)/etc/systemd/system/network-online.targets.wants/networking.service で指定されています.このファイルの TimeoutStartSec=5minTimeoutStartSec=5sec に書き換えれば 5秒 wait で済みますが,ブート後,sudo service networking status とか見ると error が出る可能性があります.

allow-hotplug eth0 にすると、有線が刺さしたときに接続を確認するらしいので,auto でなく allow-hotplug を使うと wait... がなくなり error も出ないはずです.


12. GPUファームウェアを更新

raspberrypi-firmware から新しそうなブートローダーをダウンロードしてください.

wget http://archive.raspberrypi.org/debian/pool/main/r/raspberrypi-firmware/raspberrypi-bootloader_1.20180703-1_armhf.deb

mkdir pi-bootloader

dpkg-deb -x raspberrypi-bootloader_1.20180703-1_armhf.deb pi-bootloader

cp -p pi-bootloader/boot/* /media/[ユーザ名]/system-boot/


ここまでで起動はできるはずです.


Raspberry Pi 3 Model B+ に SDカードを挿して,モニタ・電源・キーボードを接続しましょう.

電源を入れる前に モニタ へ接続しましょう.


電源を入れてからモニタを接続しても出力されません.



ログイン【起動後】

ubuntu login:

と出たら

root

と打ちましょう.


root のパスワード設定【起動後】

passwd root

root にパスワードを設定してあげてください.


ディスク拡張【起動後】

resize2fs /dev/mmcblk0p2

前後で df -h すると違いがわかるかも.


ユーザ作成 と sudo へ追加【起動後】

adduser [ユーザ名]

gpasswd -a [ユーザ名] sudo

ROSを使う人は pi とかにしておくと幸せかもしれない.


ホスト名解決【起動後】

これをせずに,ユーザを作成した後に sudo を使うと

sudo: unable to resolve host

みたいのが毎回出ます.

sudo nano /etc/hosts

127.0.1.1 ubuntu

を追記してください.


Ubuntuの無線LANの電源管理をオフにする【起動後】

sudo apt install wireless-tools

sudo nano /etc/rc.local

に以下を追記してください.

sbin/iwconfig wlan0 power off


Ubuntu16.04 の IP固定【起動後】

もし起動後すぐ ssh で作業したい場合は 11. で interfaces.d のファイルを作成した時に固定しよう.

allow-hotplug eth0

iface eth0 inet static
address 192.168.x.x
netmask 255.255.255.0
gateway 192.168.x.1
dns-nameservers 8.8.8.8 192.168.x.1


Ubuntu16.04 の無線LAN設定【起動後】

sudo apt install wpasupplicant

su -

wpa_passphrase [ESS-ID] [PASSPHRASE] > /etc/wpa_supplicant/hoge.conf

もしネットワークがステルスAPだったら

sudo nano /etc/wpa_supplicant/hoge.conf

scan_ssid=1

を追記する.

sudo nano /etc/network/interfaces.d/wlan0

auto wlan0

iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/hoge.conf

を追記したら再起動しましょう.


service ssh status で鍵関係で怒られた場合

sudo dpkg-reconfigure openssh-server


ssh_config と sshd_config

クライアントがssh,サーバーがsshd


アクセスされるポートを変更したい場合は sshd_config をいじる.


NICの状態を確認するコマンド

sudo lshw -c network


Mac OS での image のバックアップ方法


  • バックアップ

sudo dd if=/dev/rdiskX of=bk.img bs=1m


  • xzに圧縮

tar Jcvf output.tar.xz input.img


まとめ

Raspberry Pi 3 Model B+ で Ubuntu を使いたい状況に陥ったので,動いてよかったです.

もし誤った情報を記載していたらコメントいただけると幸いです.


参考