この記事では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(Raspbian
やDebian
)の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であれば自動起動設定されている
が手っ取り早く簡潔です。
参考
以下のサイトの情報を引用・参考にしました。