気の向くままに辿るIT/ICT
webzoit.netウェブサイトホームページ
システム開発

NetBSD/i386カーネルのアップグレード

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
*BSD/PC-UNIX/Linuxって?

NetBSD/i386カーネルのアップグレード

NetBSD/i386カーネルのアップグレード

 PCというか、OSを使っていれば、その種類を問わず、OS(カーネル)やアプリケーションのアップグレード/アップデートを自動または、手動で行う必要があります。

 WindowsやMac OS X/OS Xでは、メジャーバージョンのアップグレード時は、PCごと買い換えたり、マシンスペック上対応可能であれば、CD/DVDなどの媒体を購入したり、なんらかの条件下でオンラインでアップグレード、LinuxディストリビューションにおいてはLinuxカーネルはモジュール化されており、パッケージソフトウェアのアップデートと同じ方法でLinuxカーネルもアップグレードされます。

 *BSDやLinuxにおいては、メジャーバージョンのアップグレードであっても、そのためにPCを買い替える必要はなく、それらがフリーソフトウェアであれば、広く公開されているのでオンラインでアップグレードできます。

 今回は、NetBSD/i386 6.1.3と6.1.4を入れたPCにおける6.1.5へのマイナーバージョンアップデートについて記します。

 NetBSDのアップグレード方法は、1つや2つではなく、幾通りもあります。

sysinst

 すぐに思いつくのは、NetBSDのメニューベースのインストーラsysinstをブートできるLiveメディアがある、もしくは、改めて用意するなら、それを起動して、([a.Install...]ではなく、)[b:Upgrade NetBSD on a hard disk]メニューを選ぶという方法でしょう。

 しかし、同じ[sysinst]を使うにしてもLiveメディアすら要らない、より簡単な方法もあります。

 これなら稼働中のシステム上で[sysinst]のカーネルをビルド(サイズが小さいのですぐ終わる)、それをルートにコピーして再起動するだけ。

$ ftp ftp://ftp.NetBSD.org/pub/NetBSD/NetBSD-6.0/i386/binary/kernel/netbsd-INSTALL.gz
$ sudo cp netbsd-INSTALL.gz /
$ sudo reboot
...
NetBSD/i386ブートメニュー
...[5. Drop to boot prompt]を選択...
type "?" or "help" for help.
> boot /netbsd-INSTALL.gz
...

 ただ、カーネル・ソースを入手(してbuild.shを実行したり、makeしたり)しなくてもサイズも6MB程度と小さいnetbsd-INSTALL.gzをFTPサイトからダウンロードするなり、CVSから取得するなりして、これをルート[/]にコピー、再起動、ブートメニューから[5. Drop to boot prompt]を選択し、[boot /netbsd-INSTALL.gz]とし、起動後、言語とキーボードを選択、[b:Upgrade NetBSD on a hard disk]メニューを選ぶのが、簡単でしょう。

 もちろん、リネームしても構いませんが、上書きじゃないにしても、安全の為、既存のカーネルである[/netbsd]にはしない方が、賢明でしょう。

 。。。と思ったら[boot /netbsd-INSTALL.gz]だとネットワーク接続設定がなされず、リポジトリにアクセスできない為、できませんでした。。。(これでできると思ったのは勘違い?そもそもこういうもの?)

NetBSDアップグレード時network media type指定でエラーになる場合

追記:2016/06/19

 (他でもあるかもしれないが、)NetBSDをアップグレードする際にnetwork media typeでエラーになる場合、ifconfigでネットワークインタフェースを確認するのが賢明。

 適切なネットワークインタフェースさえ指定すれば、media typeを問われることなく、デフォルトの[autoselect]で通信可能となるはず。

 以前もハマった気がしなくもないが、3台あるNetBSDマシンの内、1台だけ、ネットワークインタフェース選択でデフォルトを選択後、続いて[network media type]を問われ、デフォルト値もない。。。10baseTとか100baseTXとか、autoselectなどを入れると良さ気な模様も何を入れてみてもダメ。

 まさかと思ってCtrl+zで一時停止、ifconfigしてみるとlo0以外に2つインタフェースがあり、アップデータのデフォルト値の方は、どうも無効なようで、他方を選び、[exit]とし、アップデータに戻ると"media type:[autoselect]"となっており、[Enter]、DHCPを使うでyesとしたら、他同様、ネットワーク及びリポジトリにつながり、アップデートを完了させることができた。

sysupgrade

 また、2012年08月時点でフィールドテスト中とは言え、時系列的な順序は不明ですが、たぶん内容は新しいのであろう33.3. Using sysbuild and sysupgradeでは当たり前のように使用例が載っていて、稼働中のNetBSD上でアップグレードできる[sysupgrade]もあります。

 その他、ソースからアップデートするにあたり、CVS/Concurrent Versions SystemやGitHubを使う方法などもあります。

 今回は、e-onedynabook、仮想マシン上にもいくつかNetBSDを入れていますが、インストールに使ったUSBメモリは他の用途に使ってしまったばかりで改めて書き込むくらいなら、nebsd-INSTALL.gzを使う方法が、更に稼働中のシステム上で実行するだけで自動でアップデートしてくれて再起動も1度で済む[sysupgrade]の方がよいかなということで[sysupgrade]を試してみることに。

sysupgradeで超簡単システムアップグレード

 [sysupgrade]は、tarballのダウンロード・展開、アップグレードを自動でetcupdate(etcmanage+postinstall)を対話式(postinstallにあたる処理は自動)で行ってくれるのでマシン稼働中にアップグレード作業ができ、環境を手作業で整える必要もなく、とても手軽で便利です。

 つまり、以下のリンク先の作業を自動化してくれるわけです。

$ sudo pkgin in sysupgrade
$ sudo vi /usr/pkg/etc/sysupgrade.conf
...
RELEASEDIR=ftp://ftp...
...
KERNEL=GENERIC
...
$ sudo sysupgrade auto
...
$

 まず、[sysupgrade]がない場合には、インストールします。

 インストールすると[/etc/sysbuild/default.conf]と[/usr/pkg/etc/sysupgrade.conf]が生成されるので微調整が必要なら後者を使います。

 最小限の設定としては、[sysupgrade.conf]で[RELEASEDIR]にリポジトリ(ローカルも可)と[KERNEL]に必要なカーネル(今回は[GENERIC])の2つを指定するだけ、その後は、[sysupgrade auto]を実行するだけです。

 これでカーネルのアップグレードまで自動で、続いて対話的に/etc以下のファイルの処理方法を決め、それが終わると自動でpostinstall(インストールの事後処理)が実行され、完了するとシェルプロンプトに戻ります。

 マシンを再起動、ログイン後の表示やuname -rをみる限り、無事、アップグレードされていました。

 /etc以下のファイルの処理に若干迷う可能性はあるものの、sysinstをビルドして再起動したり、netbsd-INSTALL.gzをブートする以上に手軽で簡単です。

 今回、成功したのは、sysutils/sysupgrade-1.5nb1です。

$ sudo vi ~/.profile
...
PKG_PATH=ftp://ftp.jp.NetBSD.org/pub/pkgsrc/packages/NetBSD/i386/`uname -r`/All
export PKG_PATH
...
$

 尚、アップグレード後、PKG_PATHにセットするパスにあるリリースバージョンを直書きしている場合、カーネルをアップグレード後に変更しておきます。

 この変更をしなくても済むようにするなら、リリースバージョン部分をバッククォートで括って`uname -r`としておくとよいでしょう。

 初めは、構成ファイルを編集せずに、そのままやってみたら取得元が見つからないと言われた為、[/usr/pkg/etc/sysupgrade.conf]でFTPサイト(NetBSDのミラーサイト)を指定し、改めて実行してみると、今度は、明示的にカーネルを指定しろと言われ、FTPサイトのbinary/kernelを見ると確かにいくつかあるので最初[netbsd-GENERIC.gz]として実行したら[netbsd-netbsd-GENERIC.gz.gz]なんてないよと言われ、ん?もしや。。。ということで[GENERIC]に変更後、実行してみたら、GENERICカーネルのダウンロードから再開され、[ETCUPDATE]のフラグは変更しなかったので/etc以下の各種ファイルをそのまま残すか、上書きするか、マージするかなどを選択する画面が順次表示され、終わるとプロンプトに戻り、終了しました。

 尚、/etc以下のファイルの処理を設定するとプロンプト[%]が表示された為、あれ?cshになったの?と思ったらいくつかの方法でdiffによる確認ができたり、[quit]で抜けて処理を継続するようになっており、適宜、確認、設定、quitを繰り返して全て終わるとpostinstall処理が始まり、シェルプロンプトに戻るようになっていました。

 尚、前回、物理マシンのアップグレードは全てやってしまったので今回のsysupgradeは、仮想マシン上のNetBSDで行ないました。

失敗談

 ちなみに前回やってみた時は、自身の単なるミスによるものだと思いますが、あえなく失敗、なんとか回復させてみた、そんな様子も以下に記しておきます。

 今にして思えば、etcupdateしていなかったか、マージすべき、/etc以下のファイルを上書きしたりしてしまったのかも。。。

ボーっとしている時は、一息入れるに限る

 [sysupgrade]自体は、特に難しくないはずなのですが、あれこれやっているうちに失敗した模様、再起動するとシングルユーザーモードとなってしまい、少し疲れていたこともあり、面倒になってPCの電源を落としました。

 その後、これじゃダメか。。。ということで最初にインストールした時と同様にUSBメモリにUSB用のイメージファイルをセットして[sysinst]からアップグレードを行うことに。

 すると今度は、USBメモリでハマりました。

 以前何に使ったのか、中身がどうなっているのかすっかり忘れており、取り敢えず、Fedoraマシンで接続、自動マウントされた結果はカラ。

 ちょっと時間をおいて頭をスッキリさせてからやればよかったのですが、つい、ボーっとしたまま、没頭してしまい。。。

 そのUSBメモリにddコマンドでNetBSDのUSBメモリスティック用のイメージファイルをコピー、USBブート可能なdynabookに挿して起動してみるもカーソルが点滅するだけで何も起こらず。

 fdiskで確認はしたのですが、ボーっとしていて何がなんだか混乱してきたので、とりあえず、Fedoraマシンを使ってGPartedで見てみるとファイルシステムが不明となっており、何をどう編集してみても最終的に「不明」に。

 落ち着いてからfdiskでやればなんでもないものを「不明」ってなに?ということで相変わらずボーッとしつつも、その後、ごにょごにょやったらぐちゃぐちゃに。

 結果、この修正は後段の方法で復旧できましたが、まずは、NetBSD用ブータブルUSBインストーラでsysinstを実行し、本来やるべきアップグレードを行っておくことに。

NetBSD用ブータブルUSBインストーラを作成

 ようやく、後でやろということで放置して数時間後、気を取り直して再開。

 ここでは、NetBSDマシンではなく、日常的にメインで使っているLinux(Fedora)で作業することに。

$ dmesg | grep sd | less

 dmesgでUSBメモリが割り当てられているデバイスを確認すると[sdg]であることが判明。

$ sudo dd if=/dev/zero of=/dev/sdg

 まず、USBメモリをフォーマット(初期化)。

$ sudo fdisk -u /dev/sdg

 [fdisk -u ...]で

  • [o]と入力し、DOSパーティションテーブルを作成
  • 更に[n]でプライマリパーティションを作成

 (Linuxのfdiskなので)そのままだとファイルシステムは[83 Linux]となりますが、ここでは、

  • [t]として次に[L]でファイルシステムを確認し、[c Win95 FAT32 (LBA)] に変更

 続いて

  • [a]でブートパーティション設定
  • [w]で書き込み
  • [q]で終了

 準備が終わったら、USBメモリにNetBSDのUSBメモリスティック用のイメージファイルを書き込む。

$ sudo dd if=netbsd_usbboot.img of=/dev/sdg

 これでUSBメモリからブートすれば、NetBSDのブートメニューが表示され、[sysinst]を実行することができるようになるはずです。

 USB全体にNetBSDだけを書き込む場合や、そうでなくてもNetBSDの標準ブートローダを使う場合は、不要ですが、今回は、GRUB2をインストールしてみました。

$ sudo mkdir -p /mnt/usb

$ sudo mount /dev/sdg /mnt/usb

$ sudo grub2-install --root-directory=/mnt/usb /dev/sdg

 作業中のマシンのOSはFedoraで[grub2-install]が既にあったのでデバイスをマウントしてGRUB2をインストール。

$ sudo vi /mnt/usb/boot/grub/grub.conf

$ sudo umount /mnt/usb

 GRUB2には、grub-updateもありますし、[grub.conf]にしても本来、別途構成ファイルを作成、grub-mkconfigで[grub.conf]を作成したりしますが、今回は、grub-install/grub2-install時に作成された[grub.conf]を直接編集し、NetBSD、reboot、haltを設定後、アンマウント。

アップグレード作業

 さて当初、NetBSDのUSBメモリスティック用のイメージファイルの入ったUSBメモリでe-oneに入れたNetBSDは、6.1.2 から6.1.3、dynabookに入れたNetBSDは、6.1.3から6.1.4にアップグレードしたことがあるので今回も大丈夫でしょう。

 早速、このUSBメモリを使ってe-oneに入れたNetBSD 6.1.3を(一気に6.1.5としてみるのは気が引けるので)6.1.4、6.1.5と順次アップグレードし、無事完了。

なぜかsysupgradeで失敗したシステムを手作業で修復

 次に[sysupgrade]の結果、失敗したかに見えたdynabookに入れたNetBSD 6.1.4を6.1.5にアップグレードしてみると、こちらも無事完了。

 ところが、再起動してみると、やはり、シングルユーザーモードになってしまう。。。[/etc/nologin]ファイルが存在しているわけでもない。。。ということは、[sysupgrade]時に何かやらかした模様。

 いろいろ探ってみると[ifconfig]を見てもネットワークデバイスに起動中を表わす[UP]やIPアドレスの表示がなく、シェルスクリプトである/etc/rc.d/networkをみてみたりすると、どうもDHCPが動作していなかったり、hostnameが未設定だったりする。

 また、パスワード変更ができず、探ってみると、なんと/etc/passwdと対になるパスワードが暗号化された/etc/master.passwd(Linuxでは、/etc/shadow)、更に/etc/groupファイルも存在はしているものの、中身がカラだったり、wscons.confのファイル内容が不足しているものがあったり。。。と少しファイル構成が壊れ気味。

 ネットワーク関連は、[dhcpcd]や[dhclient]を起動すればよいはずなので

[/etc/rc.d/dhcpcd start]でとりあえずDHCPクライアントを起動
([dhclient]ではダメだった)

 ホスト名は、とりあえず、[/etc/hosts]や[/etc/resolv.conf]に書いておけばよいはずなので

[/etc/hosts]、[/etc/resolv.conf]にホスト名とドメイン名を設定
(正常に起動すれば後でDHCPで上書きされる)

 [/etc/master.passwd]がカラだと[pwd_mkdb]を実行しても意味がなく、[/etc/group]を個別に設定するって言ってみてもデーモン系のパスワードって?って感じだし、同じように設定したものがあるなら、そこからからコピーしてくるのが無難でしょうということで

  1. [/etc/master.passwd]、[/etc/group]を別途、仮想化ソフトウェアを使用しているPC上の仮想マシンに入れたNetBSDから当該マシンにコピー
  2. [pwd_mkdb /etc/master.passwd]を実行
  3. [pwd_mkdb -p /etc/master.passwd]を実行
  4. これにより、NetBSDにおいては[/etc/passwd]、[/etc/pwd.db]、[/etc/spwd.db]、[/etc/master.passwd]を同期させることが可能
    (Linuxでは、単に[pwconv]とすれば、[/etc/passwd]と[/etc/shadow]を同期できる)

 日本語キーボード設定を後でやるには、[wscons.conf]でエンコード方式を[jp]に設定する必要があるため、

[wscons.conf]に[encoding jp]を追記

 各種設定をしてあっても[rc_configured=yes]がnoになってたり、未設定だったりするとシングルユーザーモードでしか起動できなくなるので[/etc/rc.conf]で設定

[/etc/rc.conf]に[rc_configured=yes]を追記

 他にも起動時に同時に起動する必要があるデーモンがある場合、[/etc/rc.conf]で適宜設定しますが、ここでは、

[/etc/rc.conf]に[dhcpcd=yes]、[wscons=yes]を追記

 これら作業を終え、再起動するとマルチユーザーモードで起動、[avahidaemon]の設定が不足している旨のメッセージが起動時に表示されたことと、デスクトップ環境起動時にホスト名の解決がうまくいかないというメッセージが表示された以外は、アップグレード前に入れてあった各ユーザーで設定したものも無事である模様。

 [avahidaemon]云々については、[/etc/rc.d/avahidaemon]が既にあるので

[/etc/rc.conf]で[avahidaemon=yes]を追記

することで解決。

 ホスト名の解決については、[/etc/hosts]内のhostnameにIPアドレスを割り当てればよさげ。

 というわけで何とか復旧させることができました。

ウェブ造ホーム前へ次へ