りなっくすとらずぱい!

Raspberry Pi初心者に向けた各コマンドの説明、プログラムの作り方について紹介しています!

apt-get dist-upgrade - OSのバージョンを更新する

f:id:ibuquicallig:20191210195543p:plain

この記事ではapt-getのサブコマンドのdist-upgradeのでOSのバージョンを上げる方法と、再起動前にチェックしておく箇所について解説しています。

コマンド一発でraspiのOSのアップデートは可能ですが、前準備と後処理を怠ると今まで通り動かなくなってしまうので注意する必要があります。

今回はStretchからBusterへ(9系から10系へ)更新してみます。

この記事でできること

  • apt-get dist-upgradeでOSのバージョンを上げる
  • 再起動前にネットワーク設定、サービス設定を確認して、確実に再起動後も運用できるようにする

apt-get dist-upgradeコマンド

apt-get dist-upgradeコマンドを実行することで、Raspberry Pi(RaspbianDebian)のOSを最新にアップグレードすることができます。

できることが大きく変わるわけではありませんが、システムの根幹で使用しているプログラムのアップデートを行うことで脆弱性対策、処理効率化に繋がります。手元のPCも最新のバージョンに保ちましょう!

実行前に

いくつかチェックしてバックアップなどをとっておきましょう。/etc/,/home/のバックアップ、または万全を期すためにはSDカードごと丸まるバックアップをとっておくといいです。バックアップ方法については以下の記事を参照してください。

lsb_releaseコマンド

以下コマンドを実行することで現在のOSのバージョンを確認することができます。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.8 (stretch)
Release:        9.8
Codename:       stretch

Codenameなどの部分に現在のDebianのコードネームが表示されます。最新にアップグレードした場合はここも変更されます。

自動起動するプロセス

変更されることはないと思われますが、ここもチェックしておきます。systemctl list-unit-filesで表示されるenableの行のサービスが、Raspberry Pi起動時に自動的に立ち上がるサービスとなっています。

UNIT FILE                              STATE
proc-sys-fs-binfmt_misc.automount      static
-.mount                                generated
boot.mount                             generated
...
apache2.service                        enabled
...
cron.service                           enabled

apache2など自分で追加したサービス(apt-get install時に自動で設定されたものも含む)などの一覧を確認しておき、OS更新後に差異が無いがチェックします。




あわせて/etc/rc.localに追加した処理もチェックしておきましょう。私の場合はnodejsのこまごましたサーバー系はここに追記したりしています。

何も追加していない場合は、Raspberry Piの場合以下となります。

$ cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

exit 0
ネットワーク設定のバックアップ

別記事でWiFiの設定や固定IPアドレスの設定を行っていますが、それらの設定ファイルもバックアップしておきます。

上書き・削除されることはまずあり得ないはずですが、もし今までの設定から変更されてしまうと、ネットワーク越しにターミナルからアクセスすることができなくなります!本体にキーボードとHDMIを挿して。。。と設定を直すのは面倒ですよね。

まずは/etc/dhcpcd.confファイルのバックアップをとります。固定IPアドレスの設定をしている場合はこのファイルを編集していますね。

$ sudo cp /etc/dhcpcd.conf /etc/dhcpcd.conf.bk20191210

日付が分かるような被らない名前にしておきましょう。

次にWiFiの設定をしている/etc/wpa_supplicant/wpa_supplicant.confファイルをバックアップします。

sudo cp /etc/wpa_supplicant/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf.bk20191210

パッケージリスト取得先を変更

これを変更しないと新たなバージョンになりません。(自動で変更してくれると思っていたのですが、私の環境では手動で変えないとダメでした。)

sudo vimなどで/etc/apt/sources.listを開き、修正します。

deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi

現在のOSがStretchの場合、busterの部分がstretchとなっています。これを対象の新しいOSのコードネーム(執筆時ならbuster)に変更します。

stableとなっている場合はそのままで問題ないです。

コマンド実行

では、いよいよアップグレード実行です。以下のコマンド1行だけでOKです。apt-getコマンドは管理者権限が必要なのでsudoと一緒に実行します。

$ sudo apt-get dist-upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  ...
71 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 114 MB of archives.
After this operation, 8,300 kB of additional disk space will be used.
Do you want to continue? [Y/n]

かなり時間がかかりますが辛抱強く待ちましょう。途中でapt-listchanges: Newsのような画面が表示されたり設定を求められることがありますが、各環境によってまちまちなのでよくわからなければ随時Googleで表示されている文字列を検索してみるしかないです。。。

よくあるのは「新しい設定用のファイルを作成するけど、既存のものと置き換える?」みたいな感じのものなので、問題なければyesを選択して進めていきます。

アップグレードが完了したら次に進みます。

再起動前に

先ほどバックアップしたファイルが元のままかチェックします。 バックアップファイルを作成しているのでdiffコマンドを使うことで差分を簡単にチェックすることができます。

$ cd /etc/
$ diff dhcpcd.conf dhcpcd.conf.bk20191210
# 差分が無ければ何も表示されない
$ diff wpa_supplicant/wpa_supplicant.conf wpa_supplicant/wpa_supplicant.conf.bk20191210

一応再度lsb_release -aを実行してアップグレードできているか確認してみましょう。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster

再起動

$ sudo reboot

再起動後

数分経って確実に起動してからsshなどで接続してみます。ここで接続できない場合は起動がうまくいっていないかネットワーク周りで問題が起きている・更新前の設定と異なっていることが主な原因かと思います。

本体に直接接続してログインのプロンプトが表示されているか確認します。表示されずに起動段階でエラーとなっている場合は更新前に作成したバックアップから復元して、再度いろんな方法で更新を試すのが手っ取り早いです。(なぜエラーとなったかの原因を握りつぶすのはあまりよくないですが、、、)

ログインできる状態であれば上記の固定IPアドレス設定ファイルとWiFi設定ファイル、および各サーバー・デーモンが起動しているかチェックします。

$ service ssh status
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) ...

$ service dhcpcd status
● dhcpcd.service - dhcpcd on all interfaces
   Loaded: loaded (/lib/systemd/system/dhcpcd.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/dhcpcd.service.d
           └─wait.conf
   Active: active (running) ...

active以外の状態にある場合はservice ssh startなどで起動します。




最後に今まで自動起動していたサービスをチェックします。例えばapache2でWebサーバーが今まで自動起動していたのであれば、(上でも同じようなことをしていますが)以下のコマンドを実行することで起動状態を確認することができます。

$ service apache2 status
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
   Active: active (running)

起動しているので問題ないですね!自動起動するようになっているかをチェックするには、

$ systemctl is-enabled apache2
enabled
# enabledであれば自動起動設定されている

が手っ取り早く簡潔です。

参考

以下のサイトの情報を引用・参考にしました。