授業資料/第12回 の変更点

Top / 授業資料 / 第12回

* FreeBSD のアップデート [#s7b4aa65]

さて,この授業期間中に FreeBSD 7.1R がめでたくリリースされた.
OS そのもののバージョンアップデートは,セキュリティ対策としてできるようになっておきたいところであるので,ちょうどよい.
ここで,皆のシステムを 7.0R-pX から 7.1R にアップデートしよう.

しかし,OS のバージョンアップはその時々によってやり方が少しずつ変わったり,注意点も場合場合によって違う. 

そのため,やりかたをここで全て書いてしまっては,「次の機会」に役に立たないので,ここは一つ,資料を読みながら自力で解決,作業してみよう.

** 注意点 [#fdd8bcfc]

ただし,気づきにくい注意点がいくつかあるので,それについては書いておこう.
といっても簡単なもので,基本的に「何かトラブルが起きるかもしれないので,それに備えておこう」の一言につきる.

もう少し具体的に書いておこう. OS のバージョンアップとなると当然システム中のソフトウェアの多くがバージョンアップされる. その中には,挙動が変わるものや,設定ファイルの齟齬の為に(最初は)動作がおかしくなるものもあるかもしれない. そうしたものがあっても困らないように,
「バックアップをとったり」
「できるだけ素直なシステム構成に直してから」
バージョンアップを行うということである.

具体的には例えば次のようなものがある. 他にも考えられないか知恵を絞ってみよう.

+ /etc ディレクトリには,各種設定ファイルが多く置かれている. バージョンアップ作業中にこれら設定ファイルが書き換えられたりするが,そのためにトラブルが起きるかもしれない. 万が一に備えて,まるごとバックアップしておこう.
具体的には,バージョンアップ作業前に
  cd /
  cd -Rp etc etc.old-20090213
などとすれば, /etc.old-20090213 というバックアップディレクトリができる.
&ref(./notes.png); この方法で,/etc をバックアップしておこう.
&br;
+ 新しくなったカーネルファイルに問題があって起動がうまくいかない,というケースも想定される. そこで,カーネル周りもバックアップをしておこう.
具体的には,上同様にバージョンアップ作業前に
  cd /
  cp -Rp boot boot.old-20090213
などとすればよいだろう.
&ref(./notes.png); この方法で,カーネルファイルをバックアップしておこう.
&br;
+ DNS の設定を,「他人に頼る」ように戻しておこう. 自前で頑張る設定だと,自前の BIND がトラブルを起こした場合に,ネットワーク接続で困るばかりだ.
具体的には,/etc/resolv.conf は,(できるだけ)外部のリゾルバに頼る設定に直しておく. この場合はバージョンアップ作業前に
>  nameserver 192.168.125.14
<
にいったん戻しておくことになる.
&ref(./notes.png); この方法で,DNS の設定を戻しておこう.
&br;
+ 作業全体において,常に作業ログをとろう. ログを取っていない状態で重要なメッセージを見逃したら,困ってしまう.
今回は,portupgrade のように自動で作業ログが取れるとは思えないので,''srcipt'' コマンドを用いて作業ログを取るようにしよう.
script コマンドの使い方は簡単だ. ともかく,「今から記録開始!」と思うときに,
  cd (記録ファイルを置いておくディレクトリ)
  script 20090213-1.log &color(blue){← 記録ファイルを明示的に指定しておこう};
などとすると,「ログを取るモード」に入る(正確にはシェルをフォークする). あとは,明示的に
  exit
とするまで,出力全てが記録される.
&ref(./notes.png); 作業を開始する前に,こうして「ログ取りモード」にしておこう.
&ref(./warning.png); 当然だが,ブートした直後は script コマンドは動いていない. 明示的に script コマンドを動かしてからでないとログは取れない. つまり,作業中にリブートをした場合は,改めて script コマンドを動かそう. その場合,記録ファイル名がだぶらないようにするか,script -a (記録を追加するモード)を使うようにしよう.
&br;

** 資料 [#ba026a61]

FreeBSD のバージョンアップについて,今回の一次資料は [[FreeBSD 7.1-RELEASE Announcement:http://www.jp.freebsd.org/www.FreeBSD.org/releases/7.1R/announce.html]] ということになるだろう. ネットワーク環境の問題等で,この Web が読めない学生のために,アップグレードに関わりそうな部分を抜粋,引用しておく. これがバージョンアップに際してもっとも重要な資料であるので,気合いを入れて読もう.

>  ''&color(#D81038){Updating Existing Systems};''
>  &br;
>  ''NOTE'': If updating from a 7.0 or earlier system due to a change in the Vendor's drivers certain Intel NICs will now come up as igb(4) instead of em(4). We normally try to avoid changes like that in stable branches but the vendor felt it necessary in order to support the new adapters. See the UPDATING entry dated 20080811 for details. There are only 3 PCI ID's that should have their name changed from em(4) to igb(4): 0x10A78086, 0x10A98086, and 0x10D68086. You should be able to determine if your card will change names by running the command "pciconf -l", and for the line representing your NIC (should be named em on older systems, e.g. em0 or em1, etc) check the fourth column. If that says "chip=0x10a78086" (or one of the other two IDs given above) you will have the adapter's name change.
>  &br;
>  ''&color(#D81038){Updates from Source};''
>  &br;
>  The procedure for doing a source code based update is described in the FreeBSD Handbook:
>      * http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/synching.html
>      * http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/makeworld.html
>  The branch tag to use for updating the source is RELENG_7_1.
>  &br;
>  ''&color(#D81038){FreeBSD Update};''
>  &br;
>  The freebsd-update(8) utility supports binary upgrades of i386 and amd64 systems running earlier FreeBSD releases. Systems running 7.0-RELEASE, 7.1-BETA, 7.1-BETA2, 7.1-RC1, or 7.1-RC2 can upgrade as follows:
>  &br;
>  # freebsd-update upgrade -r 7.1-RELEASE
>  &br;
>  During this process, FreeBSD Update may ask the user to help by merging some configuration files or by confirming that the automatically performed merging was done correctly.
>  &br;
>  # freebsd-update install
>  &br;
>  The system must be rebooted with the newly installed kernel before continuing.
>  &br;
>  # shutdown -r now
>  &br;
>  After rebooting, freebsd-update needs to be run again to install the new userland components, and the system needs to be rebooted again:
>  &br;
>  # freebsd-update install
>  # shutdown -r now
>  &br;
>  Users of Intel network interfaces which are changing their name from "em" to "igb" should make necessary changes to configuration files BEFORE running freebsd-update, since otherwise the network interface will not be configured appropriately after rebooting for the first time.
>  &br;
>  Users of earlier FreeBSD releases (FreeBSD 6.x) can also use freebsd-update to upgrade to FreeBSD 7.1, but will be prompted to rebuild all third-party applications (e.g., anything installed from the ports tree) after the second invocation of "freebsd-update install", in order to handle differences in the system libraries between FreeBSD 6.x and FreeBSD 7.x.
>  &br;
>  For more information, see:
>  http://www.daemonology.net/blog/2007-11-11-freebsd-major-version-upgrade.html

&ref(./notes.png); 作業を行う前に,この資料を読もう.  そして,事前に行うべき作業が他にないか,よくよく注意しよう. もしあるならば,その作業を行おう. また,全体にどういう流れでバージョンアップが行われるか,理解しよう.



** 実際にバージョンアップ作業を行う [#qf29f53f]

&ref(./warning.png); 以下の作業は,結構時間がかかるので留意しよう.
&ref(./notes.png); 上の資料を読むと分かるが,(念の為のとある準備作業の後に) freebsd-update を行えばよい.  丁寧に手順に沿って作業しよう. 途中でいくつか質問があるが,丁寧に読んで(おおまかでよいので)理解した上で応答しよう((言っていることが理解できても,システムに相当詳しくないと「それでよいかどうか」の判定は難しい.であるので,重要なサーバ等の場合は,システムのバックアップを取ってから作業することになるだろう.)).

&ref(./warning.png); freebsd-update コマンドは, -r の後のオプションにスペルミス等があると,そのターゲットが見つからずに途中で fail する. であるので,freebsd-update コマンドが fail したときはスペルミスを疑おう.
&ref(./warning.png); 7.0 から 7.1R へのバージョンアップでは,背後で「非常に多くの」作業が行われる. その作業の中でも,とくにファイル転送は時々失敗し,結果として freebsd-update が停まったままになったりする((おそらく,使っているファイル転送ツールの出来に問題がある)). しかし,そうした場合も心配は不要だ.  そうした時は,Ctrl-c で freebsd-update を止めて,再びあらためて freebsd-update を動かせばよい. freebsd-update 既に行ったファイル転送やパッチ当てはスキップしてくれるので,そうした作業部分は無駄が発生しないのだ. であるので,top コマンドで様子を時々チェックしながら,freebsd-update の作業が動かなくなっているようだったら,上のように止めて,再びコマンドを投入しよう.

*** おおまかな流れ [#v71e564f]

とはいっても,迷う場面も出てくるだろうから,おおまかなラインを示しておこう.
まず最初に尋ねられるのは,「おおまかにいって以下のようなファイルを交換などするけど,よいですか?」という質問だ.
システムディレクトリの構造をいじるなどの特殊なことをしていなければ,まあ大丈夫だろう((本来は,システムごとバックアップしておくべきだが)).

次に来る質問は,基本的には /etc 以下のファイルの書き換えについてのもので,しかも「自分で書き変えろ」と来る場合もある.
一見難しそうだが,よくみると大半はなんでもないもので,簡単だ.
&ref(./warning.png); 修正の大半は,バージョン番号の書き換えに過ぎないので,実は労力はたいして要らない.
&ref(./warning.png); 本当に書き換える必要がある場合だけ,よく考えよう.

&ref(./notes.png); 作業が終わったら,確かにバージョンアップできたことを /usr/src/sys/conf/newvers.sh というファイルの中身を見ることで確認しておこう.
現時点では,
> REVISION="7.1"
> BRANCH="RELEASE-p2"
<
になっているはずだ.

** 実際の手順 [#m7e45e54]

実際の手順は以下のようになるだろう.
ただし,これをみてしまうと自力でやれなくなるので,授業後まで見えないようにしておこう.

// cd /
// script 20090213-1.log
// freebsd-update upgrade -r 7.1-RELEASE
// 
// とする. すると,やや時間がかかるシステムチェックが行われ,
// 
//  Looking up update.FreeBSD.org mirrors... 2 mirrors found.
//  Fetching metadata signature for 7.0-RELEASE from update1.FreeBSD.org... done.
//  Fetching metadata index... done.
//  Inspecting system... done.
//  
//  以下のように,システムのどの部分に変更があるのか予告がある.
//  
//  The following components of FreeBSD seem to be installed:
//  kernel/generic src/base src/bin src/etc src/include src/lib src/libexec
//  src/sbin src/share src/sys src/ubin src/usbin world/base world/dict
//  world/doc world/games world/info world/manpages world/proflibs
//  
//  The following components of FreeBSD do not seem to be installed:
//  src/cddl src/compat src/contrib src/crypto src/games src/gnu src/krb5
//  src/release src/rescue src/secure src/tools world/catpages
//  
//  そして,この変更が妥当かどうか
//  
//  Does this look reasonable (y/n)?
//  
//  と聞かれるので,(細かいチェックはしきれないので信用するとして?) y と答える.
//  するとさらに
//  
//  Fetching metadata signature for 7.1-RELEASE from update1.FreeBSD.org... done.
//  Fetching metadata index... done.
//  Fetching 1 metadata patches. done.
//  Applying metadata patches... done.
//  Fetching 1 metadata files... done.
//  Inspecting system...
//  
//  とサーバからファイルを取得してきて,再びシステムをチェックする.
//  これは結構時間がかかるので焦らずに待とう. すると,
//
//  Inspecting system... done.
//  Fetching files from 7.0-RELEASE for merging... done.
//  Preparing to download files...done.
//  Fetching 27761 patches.....10....20....30....40....50....60....70....80....90....100....110....120....130....140....150....160....170....180....190....200....210....220....230....240....250....260....270....280....290....300....310....320....330....340....350....360....370....380....390....400....410....420....430....440....450....460....470....480....490....500....510....520....530....540....550....560....570....580....
//  …略…
//  ... done.
//  Applying pathes... done.
//  Fetching 15103 files...
//  …略…
//  ... done.
//  Attempting to automatically merge changes in files... done.
//
//  The following file could not be merged automatically: /etc/mail/mailer.conf
//  Press Enter to edit this file in emacs and resolve the conflicts
//  manually...
//  (Enter を押して,エディタで修正する. といっても,実際には内容的に修正は不要だった)
// 
// 
//  The following changes, which occurred between FreeBSD 7.0-RELEASE and
//  FreeBSD 7.1-RELEASE have been merged into /etc/crontab:
//  --- current version
//  +++ new version
//  @@ -1,8 +1,8 @@
//   # /etc/crontab - root's crontab for FreeBSD
//   #
//  -# $FreeBSD: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $
//  +# $FreeBSD: src/etc/crontab,v 1.32.32.1 2008/11/25 02:59:29 kensmith Exp $
//   #
//   SHELL=/bin/sh
//   PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
//   HOME=/var/log
//   #
//  Does this look reasonable (y/n)? y
//  
//      …という感じで,修正があるファイルについて,この修正でよいか聞いてくる.
//      たいていは単なるバージョンのつけ変えに過ぎないので,そのまま y とできる.
//      以下似たような繰り返し.   
//  
//      その後, 次のように,ファイルについて総括がある.
//  
//      まず,アップデートの影響をうけるハズだが,手でいじった跡があるのでそのままに
//      しておきますよ,というファイル.
//  
//  The following files are affected by updates, but no changes have
//  been downloaded because the files have been modified locally:
//  /root/.cshrc
//  
//      次に,削除されるファイル.
//  
//  The following files will be removed as part of updating to 7.1-RELEASE-p2:
//  /etc/rc.d/kernel
//  /usr/include/netgraph/atm/ng_atmpif.h
//  /usr/sbin/pkg_check
//  /usr/sbin/pkg_sign
//  /usr/share/doc/de_DE.ISO8859-1/books/handbook/portsnap.html
//  /usr/share/doc/el_GR.ISO8859-7/articles/dialup-firewall/x103.html
//  /usr/share/doc/el_GR.ISO8859-7/articles/dialup-firewall/x77.ht
//      …略…
//  
//      次に,追加されるファイル.
//  
//  The following files will be added as part of updating to 7.1-RELEASE-p2:
//  /boot/gptboot
//  /boot/kernel/cmx.ko
//  /boot/kernel/cmx.ko.symbols
//  /boot/kernel/cxgb_t3fw.ko
//      …略…
//  
//      次に,修正されるファイル.
//  
//  The following files will be updated as part of updating to 7.1-RELEASE-p2:
//  /.cshrc
//  /.profile
//  /COPYRIGHT
//  /bin/[
//  /bin/cat
//    …略…
//      
//      これで freebsd-update upgrade が終わる.
//      それから,
//  
//      freebsd-update install
//  
//      とする. すると,
//  
//  Installing updates...
//  Kernel updates have been installed.  Please reboot and run
//  "/usr/sbin/freebsd-update install" again to finish installing updates.
//  
//      と出て,リブートしてもう一度このコマンドを実行しろ,と言われる.
//      そこで
//  
//      shutdown -r now
//  
//      としてリブートする. ブートしてきたら,
//  
// cd /
// script 20090213-2.log
// freebsd-update install
// 
// とする. このあとも同様にリブートしろ,と言われるので,再び
//
//  shutdown -r now
//
//  としてリブートして,作業終了.

* 最後に(1) [#p3d009dd]

これまで簡単に触れてきたことから想像がつくと思うが,サーバについては立ち上げの際の労力よりも「トラブルが起きないように維持管理する」ことの方が大変だ.
であるので,サーバを管理する時は,「如何に維持管理を暗然に,機械的に,労力の少ない方法で」行うかを意識して作業するのが良い.
&ref(./warning.png); 実際,現時点で皆のシステムの ports 情報は最新だろうか?
最後に
  portsnap fetch; portsnap update
をしたのはいつだったか?
&ref(./warning.png); 実際,現時点で皆のシステムに既知の脆弱性はないだろうか?
  portaudit -adF
としてみて,脆弱性ゼロ と報告されるだろうか?



* 最後に(2) [#qf297516]

以前にも示したが,自宅で全く同じことを行おうと思うと,PC が1台別に必要となり,なかなか難しいだろう.
しかし,理系学生にとってきちんとした unix が手元にあることのメリットは大きい.
そこで,こういうときは適切な仮想環境(Vmware など)を用いて,自宅の PC の MS-Windows/MacOS 上で FreeBSD を動かすのがお奨めだ.
自宅の PC の OS 上に仮想環境を構築して,これまでの経験を生かして FreeBSD をインストールして使ってみよう.

* レポート [#w4b1b736]
本日行った作業について報告せよ.
もちろん各自の

+ 所属(学部,学科)
+ 学籍番号
+ 学年
+ 氏名
+ 日時
+ 肝心のレポート内容(得た知見,作業について気づいたこと等)

を書くのを忘れないように. 

* about Icons [#nd7c192f]
Some icons in this page are downloadable at [[ICONFINDER:http://www.iconfinder.net/]].
The "note" icon &ref(./notes.png); designed by [[Marco Martin:http://www.notmart.org/]] is distributed with the LGPL licence
and the "warning" icon &ref(./warning.png); designed by [[Alexandre Moore:http://nuovext.pwsp.net/]] with the GPL licence.
Thank you Marco and Alexandre!

// &ref(./notes.png);
// &ref(./warning.png);