OS >

目次

システムのセットアップ

Ubuntu 16.04 LTS Classic

  • info.pngRaspberryPi の説明にある通り、Raspberry Pi 3 のイメージについては、Canonicalのサポート外になります。とはいえ、Ubuntuの膨大なパッケージ群を利用できるのはサーバ用途として魅力があります。
  • note.png以下の手順は確定したものではなく、試行錯誤の結果で作業ログに近いものです。環境によっては同じ結果が得られないかもしれませんのでご注意ください。microSDについては以下のものを使用しています。同一メーカーの同(容量)製品でも容量が若干異なる場合があります。
    プロダクト実容量備考
    SanDisk? Ultra microSDHC UHS-I Class10 16GB (SDSDQUL-016G-EPK)15,193.5MB
    Toshiba microSDHC 16GB Class10 UHS-I (MSDAR40N16G)14,772.0MB-421.5MB

OSのインストール

  1. ダウンロードしたイメージをmicroSDに書き込みます。以下の2つの方法で何度か書き込みを試しましたが、どちらの書き込みでもうまく起動しない場合がありました(原因は不明です)。何度か試してみるとよいでしょう。
    $ xzcat ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz | sudo dd bs=4M of=/dev/sdX
    or
    unxz ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz
    sudo ddrescue -D -d --force ubuntu-16.04-preinstalled-server-armhf+raspi3.img /dev/sdX
  2. linux-firmware と linux-firmware-raspi2 パッケージでファイルが衝突するバグ(linux-firmware-raspi2 conflicts with linux-firmware over brcmfmac43430-sdio.bin)がありますので一度ホールドしておきシステムを更新します。
    $ sudo apt-mark hold linux-firmware
    $ sudo apt-mark hold linux-firmware-raspi2
    
    $ sudo apt-get update
    $ sudo apt-get upgrade
    $ sudo reboot
  3. 残念ながら再起動すると起動に失敗しますので、一度停止させmicroSDを他のマシンでマウントし Raspberry Pi 3 Ubuntu 16.04 Server upgrade error を参考に config.txt を編集します。
    1. $ diff -u /boot/firmware/config.txt{.org,}
    2. --- /boot/firmware/config.txt.org       2017-08-19 10:32:00.000000000 +0900
    3. +++ /boot/firmware/config.txt   2017-08-19 10:58:00.000000000 +0900
    4. @@ -8,8 +8,7 @@
    5.  enable_uart=1
    6.  
    7.  # set extended DT area
    8. -device_tree_address=0x100
    9. -device_tree_end=0x8000
    10. +device_tree_address=0x02008000
    11.  
    12.  # enable i2c
    13.  dtparam=i2c_arm=o
  4. microSDを戻して起動することを確認します。
  5. 再度システムを完全に更新し、正常に再起動することを確認します。
    $ sudo apt-get dist-upgrade
    $ sudo reboot
  6. パッケージのロックを解除し再度更新の後、正常に再起動することを確認します。
    $ sudo apt-mark unhold linux-firmware
    $ sudo apt-mark unhold linux-firmware-raspi2
    $ sudo dpkg-divert --divert /lib/firmware/brcm/brcmfmac43430-sdio-2.bin --package linux-firmware-raspi2 --rename --add /lib/firmware/brcm/brcmfmac43430-sdio.bin
    $ sudo apt-get upgrade
    $ sudo reboot

自動アップグレードの抑止

  1. Ubuntu 16.04はデフォルトで自動アップグレードするように設定されていますので、不都合がある場合には以下の修正により自動アップグレードを無効にします。
    1. /etc/apt/apt.conf.d/20auto-upgrades
      1. APT::Periodic::Update-Package-Lists "1";
      2. //APT::Periodic::Unattended-Upgrade "1";
      3. APT::Periodic::Unattended-Upgrade "0";

時刻合わせ

  1. Raspberry Piにはリアルタイムクロックがなく停止時には時刻を保持できませんので、fake-hwclock パッケージをインストールし擬似的に保持させます(ただし停止時間が長くなれば時刻のズレが大きくなります)。
    $ sudo apt-get install fake-hwclock
  2. 起動中の時刻同期のために ntp デーモンをインストールします。
    $ sudo apt-get install ntp 

IPアドレスの固定

  1. /etc/network/interfaces.d/50-cloud-init.cfg: 以下の要領でIPアドレスを固定します。
    1. auto lo
    2. iface lo inet loopback
    3.  
    4. auto eth0
    5. #iface eth0 inet dhcp
    6. iface eth0 inet static
    7.      address 192.168.1.5/24
    8.      gateway 192.168.1.1
    9.      dns-nameservers 192.168.1.53 8.8.8.8
  2. /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg: 以下の内容を書き込み、cloud-init によるネットワーク設定を抑止します。
    1. network: {config: disabled}

ネットワーク有効化の待機

  • いくつかのネットワーク関連サービス(apt-cacher-ng、bind9、squid等)は、ネットワークの有効化を待つユニット設定にもかかわらずOS起動時にサービスの正常起動に失敗します。lightbulb.png時刻が不正であることが原因で起動に失敗していたサービスについては、上記の fake-hwclock パッケージをインストールすることによりいくらか解消されます。
  • systemd-networkd および systemd-networkd-wait-online を有効にしてみましたが効果はありませんでした。
    $ sudo systemctl enable systemd-networkd
    $ sudo systemctl enable systemd-networkd-wait-online
    
    $ cat /etc/systemd/system/bind9.service.d/override.conf
    [Unit]
    Wants=network-online.target
    After=network-online.target
    • ちなみに、Drop-In設定ファイルが存在すると常に「Run 'systemctl daemon-reload' to reload units.」のワーニングが出ますが、これは表示上のバグ(systemctl: 'daemon-reload' warning is always shown when foo.service.d/bar.conf exists #3123)のようです。ver. 230で修正されているそうです。
      $ systemctl --version
      systemd 229
      ...
      $ systemctl status bind9
      ● bind9.service - BIND Domain Name Server
         Loaded: loaded (/lib/systemd/system/bind9.service; enabled; vendor preset: enabled)
        Drop-In: /run/systemd/generator/bind9.service.d
                 └─50-insserv.conf-$named.conf
              /etc/systemd/system/bind9.service.d
                 └─override.conf
      ...
      Warning: bind9.service changed on disk. Run 'systemctl daemon-reload' to reload units.
  • あまりうまい方法ではありませんが、crontabに以下のような内容を追加し強制的にサービスを再起動し回避しています。
    1. @reboot root sleep 60s && systemctl restart bind9

chef-clientのセットアップ

  1. 公式のインストーラはARMをサポートしていませんので、knife bootstrap 実行前にあらかじめノードに chef-client をインストールしておきます。まずはディストリビューションのパッケージをインストールしてみます。
    $ sudo apt-get install chef
    $ chef-client -v
    Chef: 12.3.0
  2. バージョンが古いためレシピの適用に支障がありましたので、一度 chef と chef-zero をアンインストールします。
    $ sudo systemctl stop chef-client.service
    $ sudo systemctl disable chef-client.service
    $ sudo apt-get remove chef chef-zero
  3. 今度はgemコマンドで比較的新しいバージョンのパッケージをインストールします。
    $ gem query -ra -n "^chef$"
    $ sudo gem install chef -v 13.6.4 --no-rdoc --no-ri
    • ちなみに、gemコマンドで最もコンパクト(ビルドなし)にchefをインストールする要領は以下の通りです。
      $ sudo apt-get install ruby-ffi ruby-ffi-yajl
      $ sudo gem install chef -v 13.6.4 --no-rdoc --no-ri
       or
      $ sudo gem install chef -v 12.21.26 --no-rdoc --no-ri
  4. ワークステーションから knife bootstrap を実行し、ノードとして登録します。

apt-cacher-ng

  • キャッシュは比較的大きくなりますので、システムとは別のストレージを用意してキャッシュディレクトリ(設定ファイル中の CacheDir?)を切り替えるとよいでしょう。
  • note.pngUbuntuでは既知のバグ(Bug #1279021)がありキャッシュディレクトリの切り替えがうまくいきませんので、追加で以下の修正も行います。
    1. $ diff -u /etc/apt-cacher-ng/zz_debconf.conf{.org,}
    2. --- /etc/apt-cacher-ng/zz_debconf.conf.org      2017-08-20 22:04:14.292348782 +0900
    3. +++ /etc/apt-cacher-ng/zz_debconf.conf  2017-08-20 22:04:34.124396434 +0900
    4. @@ -10,6 +10,6 @@
    5.  # Proxy set by other config files(s)
    6.  # Port is set by other config file(s)
    7.  # BindAddress is set by other config file(s)
    8. -CacheDir: /var/cache/apt-cacher-ng # default or overridden since '/var/cache/apt-cacher-ng' directory didn't exist
    9. +#CacheDir: /var/cache/apt-cacher-ng # default or overridden since '/var/cache/apt-cacher-ng' directory didn't exist
    10.  # PassThroughPattern: setting is not configured by debconf

Docker

  • info.pngGet Docker CE for Ubuntu
  • 公式に armhf もサポートされていますのでインストールが可能です。環境要件には64bitサーバとありますが、ARMアーキテクチャの場合 armhf サポートとありますので32bitサポートになります。Raspberry Pi 3 Model BのARMプロセッサは64bitですが、提供されているOSもまだほとんど32bit版ですのでこのDockerで問題なく動作します。(ややバージョンが古いですが)もちろんUbuntuディストリビューションのパッケージ(docker.io)を利用することもできます。ただし、現時点ではARM向けにビルドされたイメージはあまり多くありません。
    $ docker -v
    Docker version 17.05.0-ce, build 89658be
    $ docker run --rm -it arm32v7/ubuntu:16.04 bash
    ...

DockerCompose

  • 公式にはARM向けの提供はありませんので、ディストリビューションの docker-compose パッケージをインストールします。
    $ sudo apt-get install docker-compose
    ...
    $ docker-compose version
    docker-compose version 1.8.0, build unknown
    docker-py version: 1.9.0
    CPython version: 2.7.12
    OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016

DockerRegistry

  • note.pngディストリビューションの docker-registry パッケージには不安定な動作が見られました。
  • 公式にはARM向けのDockerRegistryイメージはまだ提供されていませんので、コミュニティで提供されているイメージの中で比較的安定していた budry/registry-arm を利用しています。

LXD

  • LXDはすでにインストール済みですので、sudo lxd init コマンドにより初期設定を行えばすぐに利用できます。
    $ sudo lxd init
    ...
    $ lxc launch ubuntu:16.04
  • note.png公式リポジトリには、arm64向けにビルドされたイメージがありますが、OSが32bit版ですのでそれらはまだ利用できません。
    $ lxc launch ubuntu:16.04/arm64
    ...
    error: Requested architecture isn't supported by this host

Samba

  • 問題なく利用できます。
    $ sudo apt-get install samba
  • SambaのSystemd移行は完全ではないようなので、/etc/init.d/samba コマンドで起動させます。
    $ sudo systemctl is-enabled samba
    masked
    $ sudo systemctl is-enabled smbd
    smbd.service is not a native service, redirecting to systemd-sysv-install
    Executing /lib/systemd/systemd-sysv-install is-enabled smbd
    disabled
    $ sudo /etc/init.d/samba start
  • 統合認証については以下をご参照ください。

バックアップとリストア

  • ファームウェアやカーネルの更新後などOSの起動にはまだ不安定な場合がありますので、システムのバックアップはこまめに行っておくとよいでしょう。

バックアップ

  1. microSDを外し、作業用のPCに挿入します。
  2. lsblk または sudo fdisk -l でmicroSDのデバイススペシャルを調べます。
  3. dd コマンドでバックアップします。gzipは比較的高速で、xzは比較的低速ですが圧縮効率が高いです。2.5GBほどの元データで、gzip(20分弱、1.6GB)、xz(40分強、1,1GB)程度となりました。圧縮負荷が高いためかddコマンドのバッファサイズ調整の効果はほとんど認められませんでした。
    # gzipで圧縮する場合
    $ sudo dd bs=4M if=/dev/sdX | gzip > ~/bak/rpi3-`date +%Y%m%d`.img.gz
    
    # xzで圧縮する場合
    $ sudo dd bs=4M if=/dev/sdX | xz > ~/bak/rpi3-`date +%Y%m%d`.img.xz

リストア

  1. microSDを用意し、作業用のPCに挿入します。
  2. lsblk または sudo fdisk -l でmicroSDのデバイススペシャルを調べます。
  3. dd コマンドで書き込みます。
    # gzipで圧縮されている場合
    $ gzip -dc ~/bak/rpi3-20170131.img.gz | sudo dd bs=4M of=/dev/sdX
    
    # xzで圧縮されている場合
    $ xzcat ~/bak/rpi3-20170131.img.xz | sudo dd bs=4M of=/dev/sdX

容量が若干少ないmicroSDへのリストア

  1. まず、GPartedなどのパーティション編集ツールを使って元のパーティションをサイズに合わせて縮小しておきます。
  2. 通常通りddコマンドでバックアップします。
  3. 通常通りddコマンドで目的のカードにリストアします。書き込みの最後にデバイスの容量が足りない旨のエラーが表示されますが、問題ありません。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-07-07 (土) 14:02:56 (13d)