2001年3月

[前の月へ] [メニューへ] [次の月へ]

2001/03/21(Wed)

久しぶりにSylpheedをバージョンアップ。そういやRubyも新しいのにしないとな...。そうそう、glibcも2.2に移行しないと...。うーんやること一杯だな(^^;)。

2001/03/18(Sun)

今日は、せっかく作ったLVM/ReiserFSのファイルシステムを/(ルート)にマウントする。

以下、いろいろとだらだらと書いてしまったので、先に、まとめ(というか引っかかりそうなところ)を書いておく。
  1. LILOは21.6以降
  2. ReiserFSはmoduleではなく、カーネルに組み込む。
  3. Kernelは2.4.3-pre4(さらにLVMのパッチを充てる)
こんなところかな。
っとついでに、現状のマシンのハードディスク構成を書いておこう。
コントローラ インタフェイス M/S drive 備考
ALi M1543C
(内蔵)
ide0Masterhda1625MB,UDMA非対応,LILOによるブート切り替えを行っている。Windows98が/dev/hda1に入っていて、Linuxの/(ルート)は/dev/hda2。
Slavehdb8455MB,UDMA(33)対応。/usr。
ide1Masterhdc未使用。
Slave(hdd)未使用。
UA-HD100Cide2Masterhde46116 MB,UDMA(100)対応。今回購入したタマ。ひとまず/newfsにmount
Slave(hdf)未使用。
ide3Master(hdg)未使用。
Slave(hdh)未使用。

※LILOは/dev/hdaに残したままで、/dev/hdeからブートできるようにする。

バックアップを取る

まずは、重要なファイル(/home配下等)のバックアップを取っておく。当たり前だけど結構忘れがち(経験者談(^^;))。

カーネルの再構築

以下、man lvmcreate_initrdLVMのホームページを参考にしながら作業する。

まず、LVMを/(ルート)にするためには、/bootというブート専用のパーティションを作って、そこからinitrdという仕掛けを使ってブートする必要がある。
で、そのためにはRAM diskを使う必要があるので、RAM diskをサポートしていなかったおいらのカーネルはまたもや再構築が必要になった(T_T)。
それから、これはめちゃくちゃはまったんだけどReiserFSはmoduleではダメ(要はブート時に必要なもんはモジュールにしちゃいかんっつーこってすな(^^;))なので、こいつもカーネルに組み込む。
ということで、make xconfig等で以下の項目を変更する。
  1. Block devices → RAM disk support(CONFIG_BLK_DEV_RAM) = y
  2. Block devices → Default RAM disk size(CONFIG_BLK_DEV_RAM_SIZE) = 4096(defaultのまま)
  3. Block devices → Initial RAM disk(initrd) support(CONFIG_BLK_DEV_INITRD) = y
  4. File Systems → Reiserfs support(CONFIG_REISERFS_FS) = y
で、カーネルの再構築・念のためリブート。

ブートイメージを作る

/sbin/lvmcreate_initrdを使って/boot/initrd-lvm-2.4.3-pre4.gzを作成する。
そのままでは正常に動作しない(-_-;)。しょうがないから、/sbin/lvmcreate_initrdを直接修正する(なんかこの頃ソースの修正ばっかりしているな...(^^;))。
    :
    :
while [ $# -gt 0 ]; do
   case $1 in
   -h|--help) usage; exit 0;;
   -i|--iop) IOP=$2; shift;;
   -V|--version) exit 0;;
   -d|-v|--debug|--verbose) VERBOSE="y";;
   [2-9].[0-9]*.[0-9]) VERSION=$1;;
   [2-9].[0-9]*.[0-9]-pre[0-9]*) VERSION=$1;;
   *) echo "$cmd -- invalid option '$1'"; usage; exit 0;;
   esac
   shift
    :
    :
done
んで、以下。
#setenv LC_ALL C  (csh/tcshの場合。bash系の場合はexport LC_ALL=C)
#lvmcreate_initrd 2.4.3-pre4
Logical Volume Manager 0.9.1_beta6 by Heinz Mauelshagen  02/03/2001
lvmcreate_initrd -- create LVM initial ram disk /boot/initrd-lvm-2.4.3-pre4.gz
  :
  :
lvmcreate_initrd -- creating compressed initrd /boot/initrd-lvm-2.4.3-pre4.gz
一応、上記の件と、LC_ALLが英語の場合(=C)しか動作しないということについて、バグ報告しておいたので(リプライももらった)もしかしたら近い将来fixされるかもしれない。

ファイルの配置

LVMパーティションを/(ルート)にするためには、/boot専用のパーティションを用意する必要がある(20MB程度)。

すでに、/dev/hdeは全ての領域をReiserFSの領域として1つ、swapとして1つのパーティションに分割してあるが、フォーマットしてしまってある。
こういう場合、今までだったら、再度、パーティションを切り直す(そして再フォーマット)必要があるのだけど、LVM/ReiserFSでは従来の領域を減らすことができる(もちろん使い切ってなかったらだけどね)。
今回はLVMからブートするのが目的なのでここでは行ったコマンドだけ以下に書いておく。
#umount /dev/vg00/lvol1
#resize_reiserfs -s 14G /dev/vg00/lvol1
#lvreduce -L 14G /dev/vg00/lvol1
#vgreduce vg00 /dev/hde3
#vgreduce vg00 /dev/hde2
#fdisk /dev/hde
#pvcreate /dev/hde2
#vgextend vg00 /dev/hde2
#lvextend -l +7166 /dev/vg00/lvol1
#resize_reiserfs /dev/vg00/lvol1   ← 何も指定しないと、余っている全領域分拡張される。
#fdisk -l
ディスク /dev/hde: ヘッド 16, セクタ 63, シリンダ 89355
ユニット = シリンダ数 of 1008 * 512 バイト

 デバイス ブート   始点      終点  ブロック   ID  システム
/dev/hde1             1     30477  15360376+  8e  Linux LVM
/dev/hde2         30478     87367  28672560   8e  Linux LVM
/dev/hde3         87368     87408     20664   83  Linux
/dev/hde4         87409     89355    981288   82  Linux スワップ
#mke2fs /dev/hde3
#mount -t reiserfs /dev/vg00/lvol1 /newfs
#mkdir /newfs/boot
#mount /dev/hde3 /newfs/boot
#df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/hda2               991000    284113    655681  30% /
/dev/hdb1              7963671   5960557   1590264  79% /usr
/dev/hda1               511760    490600     21160  96% /mnt/win
/dev/vg00/lvol1       44030652     32840  43997812   0% /newfs
/dev/hde3                20005        13     18959   0% /newfs/boot
/dev/hde3を/boot用とするため、ext2でフォーマットし、/newfs/bootにマウントする。 次に現在の/(ルート)配下を全部(/proc,/boot以外)/newfs(新ディスク)上にコピーする。
#cp -a /usr /newfs
#cp -a /bin /newfs
#cp -a /home /newfs
  :
  :
#cd /newfs/
#mkdir proc       ← /procはディレクトリのみ作っておく必要がある。
それから、man lvmcreate_initrdを参考に、以下。
#cp /boot/* /newfs/boot/
#cp /etc/lilo.conf /newfs/boot/
#cd /newfs/etc
#rm lilo.conf
#ln -s ../boot/lilo.conf .

lilo.confの編集

/newfs/boot/lilo.confを以下のように編集する。
/dev/hdeと、/dev/hda2の両方からブートできるようにする(さらに/dev/hda1はWindows98がブートできるようにする)
  :
  :
image=/boot/vmlinuz-2.4.3-pre4
    label=linux
    initrd=/boot/initrd-lvm-2.4.3-pre4.gz
    append="root=/dev/vg00/lvol1 ramdisk_size=8192"
    read-only
image=/boot/vmlinuz-2.4.3-pre4
    label=ext2
    root=/dev/hda2
    append="ide2=0xd000,0xb802,10 ide3=0xb400,0xb002,10"
    read-only
  :
  :
other=/dev/hda1
    label=win
    table=/dev/hda
これも後から気づいたんだけど、どうも、kernel-2.4.3-pre4ではide2,ide3の設定が不要なようなのではずしてある。あっても動くのでlabel=ext2の方には念のためつけておく。

fstabの編集

/newfs/etc/fstabを以下のように編集する。
  :
  :
/dev/vg00/lvol1         /       reiserfs        defaults        0 1
/dev/hde3               /boot   ext2            defaults        1 2
  :
  :
で、
#lilo -C /newfs/etc/lilo.conf
リブート。

/etc/rc.d/rc.sysinitの編集

今回の場合、起動時のvgscan, vgchange -ayはinitrdの方でやってくれるため、前回に記述した/etc/rc.d/rc.sysinitの項目は不要となる。
実は、/etc/rc.d/init.d/haltの方もちょっと前のと動作が変わってきてて、前回、のvgchange -anの場所では、"can't deactivate volume group "vg00" with 1 open logical volume"というメッセージが出てdeactiveできない。

ちょっと不安なんだけど、LVMメーリングリストでもhalt時のvgchange -anは不要っぽいことが書いてある(なら別に普通の時もいらないんじゃないの....なんかこのメールの英語がイマイチわかってないんで誤解(誤訳)してるのかも...)のと、なんとなく正常に動いているのでそのままにしておくことにする(^^;)。いっそのことコメントアウトしちゃおうかなと思ったんだけど、今後、/(ルート)以外にマウントする別VGを作ったとき、そのVGはこいつできちんとdeactivateされるだろうからそのときには役に立つだろうということで(ってあり得ない気もするが...(^^;))。
この辺、詳しくご存じの方は教えてくださいm(__)m。

/etc/rc.d/rc.sysinit
  :
  :
# Mount all other filesystems (except for NFS and /proc, which is already
# mounted). Contrary to standard usage,
# filesystems are NOT unmounted in single user mode.
#/sbin/vgscan
#/sbin/vgchange -ay
action "Mounting local filesystems" mount -a -t nonfs,smbfs,ncpfs,proc
  :
  :

swap領域を作る

すっかり忘れてたんだけど、swap用に取っておいた/dev/hde4をswap用に設定する。 まずは、/etc/fstabに以下の一行を追加する。
/dev/hde4               swap                    swap    defaults        1 1
で、以下。
#mkswap /dev/hde4
スワップ空間バージョン 1 を設定します、サイズ = 1004834816 バイト
#swapon -a
#swapon -s
Filename                        Type            Size    Used    Priority
/dev/hde4                       partition       981280  0       -1
OK。

まとめ

こう書いてみると結構あっさりしてるけど、いろいろとハマリまくってめちゃくちゃ時間かかった。まぁ、結構いろいろと勉強になったし、なにより無事に終わったから良しとするか。

2001/03/17(Sat)

LVMのハードディスクからブートができないかとあれこれやってたら、ふと、新しい環境でloopbackデバイスが動かなくなっていることがわかった。具体的には、
mount -o loop hoge.img /mnt/hoge
ができなくなってしまった。固まってしまい、kill -9 もできなくなってしまうのだ。
LVMかReiserFSか、はたまたおいらがあてた手パッチがまずかったのか...といろいろ調べたら、どうやら、kernel-2.4.2のloopbackデバイスのバグらしい。すでにkernel-2.4.3-pre2で直っているとのことなので、さっそくここからkernelのパッチ(今日の段階で、2.4.3-pre4が出てる(^^;))をゲットし、kernelの再構築。もちろん、HPT366用の修正も忘れないように。> オレ
ちなみに、reiserfsのパッチはすでにkernelに吸収されているようなので、当てなくて良いみたい。

LVMも最新版(lvm_0.9.1_beta6.tar.gz)が出ていてlvm_0.8.1_beta5_aがkernel-2.4.2で使えなくなってしまっていた不具合が修正されていたのでこちらもコンパイル&インストール。そんでもってリブート。
で、無事復活。にしても一日つぶれてしまったよ。やれやれ。
にしても、LVM/ReiserFS(ついでにHPT370)ってイバラの道だな....。
lvm_0.9.1_beta6.tar.gzの中に、kernel-2.4.2へのパッチが含まれている。このパッチはlinux-2.4.3-pre4でfixされていないようなので、これも充てる必要があるみたいなんだけど、どうもdepmod時にUnresolved symbolsと言われてしまうので今回は充てないことにする。
どうせすぐ2.4.3が出るだろうし、重要なデータはまだ/dev/hdeには入れていないしね。

2001/03/11(Sun)


昨日はハードディスクを認識させるのだけで終わったが、今日は実際に40GBのハードディスクを使えるようにしよう。

せっかくなので、これを機会にReiserFS/LVMを導入することにした。
ReiserFSはKernel2.4.1からkernelに取り込まれたようだ。ReiserFSを導入することでいろんなメリットが得られると思うんだけど(詳しくは検索エンジンで検索してみてください(^^;))、おいらにとってはext2より高速・fsckの時間があまりかからないと言うのが大きい。40GBのfsckなんて気が遠くなるもんね。
LVM(Logical Volume Manager)は最近個人的に旬なので(^^;)試してみようと思う。LVMって何?という人はLVM-HOWTOを見てね。まぁ、あまり個人環境で使うもんじゃないかも(^^;)。

ちょっと長いので、以下にやったことをまとめて書いておく。
  1. ReiserFS・LVMをサポートしたkernelを構築し、必要なツールをインストールする。
  2. LVMの下準備。
  3. ハードディスクを4つのパーティションに分ける(うち1つはswap用)。
  4. 物理ボリューム(PV)を生成する。
  5. 2つの物理ボリューム(PV)を1つのボリュームグループ(VG)にする。
  6. ボリュームグループ(VG)から論理ボリューム(LV)を1つ作る。
  7. 論理ボリューム(LV)を拡張する。
  8. 論理ボリュームをReiserFSでフォーマットし、mountして確認する。
  9. /dev/hde3をボリュームグループ(VG)に追加してさらにファイルシステムも拡張する。
  10. 残った1つのパーティションをボリュームグループに追加。
  11. ReiserFSのfsck機能を使う。

ReiserFS・LVMをサポートしたkernelを構築し、必要なツールをインストールする

ReiserFSのホームページであるnamesysのInstallation/Configurationと、LVMのホームページを参考にしながら作業を始めることにする。
  1. kernelが2.4.2にバージョンアップしていたのこいつをゲット
  2. すでにkernel-2.4.2に対するpatchが出ているのでそれをkernelにあてる
    #zcat linux-2.4.2-reiserfs-20010301-full.patch.gz | patch -p0
  3. 昨日の修正を行う。
  4. で、make xconfigで
    1. Multi-device support(RAID and LVM)(CONFIG_M) を y
    2. Logical volume manager(LVM) support(CONFIG_BLK_DEV_LVM) を m
    3. File systems → Reiserfs support(CONFIG_REISERFS_FS) を m
    にしてカーネル・カーネルモジュールのリコンパイル&インストール
  5. liloも新しいの(21.6以降)を入れた方が良いらしい(liloを使っていない人は関係ないと思うけど)。こいつはKondaraからRPMの最新版をもらってきてインストール(rpm -Uvh)
  6. そんでもって、/etc/lilo.confを編集して、
    #lilo
  7. ReiserFS用のファイルシステムを作るのに必要なツールをReiserFSのホームページからもらってくる。reiserfsprogs-3.x.0d.tar.gzというやつ。でこいつをコンパイル&インストール。一応、/sbin/にインストールするようにした。
    #configure --prefix=/
    #make
    #make install
  8. LVMのツールをLVMのホームページからもらってくる。ファイル名はlvm_0.9.1_beta4.tar.gzというやつ(実は最新版はlvm_0.9.1_beta5_a.tar.gzというのもあるんだけど、これはkernel2.4.2ではそのままでは使えない)。
    で、コンパイル&インストール。こちらは--prefixをつけなくても/sbinにインストールされる。
    #configure
    #make
    #make install
  9. マシンのリブート

LVMの下準備

LVMのホームページのLVM HOWTOが最新版みたいだからそれを参考にしながら作業することにする。

/etc/modules.confに以下の項目を追加する。
alias block-major-58      lvm-mod
alias char-major-109      lvm-mod
#vgscan
vgscan -- reading all physical volumes (this may take a while...)
vgscan -- no volume groups found
となればOK。

次に、/etc/rc.d/rc.sysinitと/etc/rc.d/init.d/haltに起動・終了スクリプトを書く。といってもこれはRedHat(Kondaraも)の設定らしいので、それ以外のディストリビューションを使ってる人はHOWTOを参考にしてディストリビューションにあったやり方をしてね。

/etc/rc.d/rc.sysinit
  :
  :
# Mount all other filesystems (except for NFS and /proc, which is already
# mounted). Contrary to standard usage,
# filesystems are NOT unmounted in single user mode.
/sbin/vgscan
/sbin/vgchange -ay
action "Mounting local filesystems" mount -a -t nonfs,smbfs,ncpfs,proc
  :
  :

/etc/rc.d/init.d/halt
  :
  :
echo "Remounting remaining filesystems (if any) readonly"
mount | awk '/ext2/ { print $3 }' | while read line; do
    mount -n -o ro,remount $line
done

/sbin/vgchange -an
# Now halt or reboot.
  :
  :


ふぅ。ようやく準備が整ったな...。

ハードディスクを4つのパーティションに分ける

4つのパーティションのうち3つ分(15GB x 3)はLVMで使い、残りの1つ(1GBちょっと)はswapにする。
 #fdisk /dev/hde
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。

The number of cylinders for this disk is set to 89355.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-89355, 初期値 1): 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-89355, 初期値 89355): +15000M 

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 2
最初 シリンダ (30478-89355, 初期値 30478): 
初期値 30478 を使います
終点 シリンダ または +サイズ または +サイズM または +サイズK (30478-89355, 初期値 89355): +15000M

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 3
最初 シリンダ (60955-89355, 初期値 60955): 
初期値 60955 を使います
終点 シリンダ または +サイズ または +サイズM または +サイズK (60955-89355, 初期値 89355): +13000M     

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 4
最初 シリンダ (87368-89355, 初期値 87368): 
初期値 87368 を使います
終点 シリンダ または +サイズ または +サイズM または +サイズK (87368-89355, 初期値 89355): 
初期値 89355 を使います

コマンド (m でヘルプ): t
領域番号 (1-4): 1
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 2 から 8e (Linux LVM) に変更しました

※領域2,3も同様

コマンド (m でヘルプ): t
領域番号 (1-4): 4
16進数コード (L コマンドでコードリスト表示): 82
領域のシステムタイプを 4 から 82 (Linux スワップ) に変更しました

コマンド (m でヘルプ): p

ディスク /dev/hde: ヘッド 16, セクタ 63, シリンダ 89355
ユニット = シリンダ数 of 1008 * 512 バイト

 デバイス ブート   始点      終点  ブロック   ID  システム
/dev/hde1             1     30477  15360376+  8e  Linux LVM
/dev/hde2         30478     60954  15360408   8e  Linux LVM
/dev/hde3         60955     87367  13312152   8e  Linux LVM
/dev/hde4         87368     89355   1001952   82  Linux スワップ

コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。

物理ボリューム(PV)を生成する

最初にhde1とhde2を1つのボリュームグループ(VG)にして、それからhde3を追加したりはずしたりしてみる。
まずは、LVMが認識できる物理ボリューム(PV)をhde1,hde2のパーティション毎に生成する。
#pvcreate /dev/hde1
pvcreate -- physical volume "/dev/hde1" successfully created
#pvcreate /dev/hde2
pvcreate -- physical volume "/dev/hde2" successfully created
ちなみに、上記はpvcreate /dev/hde1 /dev/hde2とまとめることもできる。
一応、pvdisplayで確認してみる。
#pvdisplay -v /dev/hde1
pvdisplay -- getting physical volume size
--- Physical volume ---
PV Name               /dev/hde1
VG Name               vg00
PV Size               14.65 GB / NOT usable 376 KB [LVM: 135 KB]
PV#                   1
PV Status             available
Allocatable           yes
Cur LV                0
PE Size (KByte)       4096
Total PE              3750
Free PE               3750
Allocated PE          0
PV UUID               me4miM-E73A-qfr2-iTG9-2cgE-wC3t-nwtmTM

pvdisplay -- no logical volume on physical volume "/dev/hde1"
OK,OK。

2つの物理ボリューム(PV)を1つのボリュームグループ(VG)にする

次に、このうちのhde1,hde2を1つのVGにまとめる。
#vgcreate vg00 /dev/hde1 /dev/hde2
vgcreate -- INFO: using default physical extent size 4 MB
vgcreate -- INFO: maximum logical volume size is 255.99 Gigabyte
vgcreate -- doing automatic backup of volume group "vg00"
vgcreate -- volume group "vg00" successfully created and activated
vg00は/dev/vg00に作られるのでlsなどで確認する。
ちなみに、これもvgdisplayで確認できる。
#vgdisplay -v vg00
--- Volume group ---
VG Name               vg00
VG Access             read/write
VG Status             available/resizable
VG #                  0
MAX LV                256
Cur LV                0
Open LV               0
MAX LV Size           255.99 GB
Max PV                256
Cur PV                2
Act PV                2
VG Size               29.3 GB
PE Size               4 MB
Total PE              7500
Alloc PE / Size       0 / 0
Free  PE / Size       7500 / 29.3 GB
VG UUID               0IvpJT-jRuc-R77l-qCP6-UgEK-2hIA-e7bBjF

--- No logical volumes defined in "vg00" ---


--- Physical volumes ---
PV Name (#)           /dev/hde1 (1)
PV Status             available / allocatable
Total PE / Free PE    3750 / 3750

PV Name (#)           /dev/hde2 (2)
PV Status             available / allocatable
Total PE / Free PE    3750 / 3750
MAX LV Sizeが255.99GBって書いてあるけど、実際はそんなにたくさんのハードディスク容量があるわけではない(VG Sizeの29.3GBまで)ので注意。

ボリュームグループ(VG)から論理ボリューム(LV)を1つ作る

本当は1つのVGから複数のLVを作ることができるんだけど、あまり分ける用途が無いため、今回は一つにしてしまう。まずは、1GB分のLVを1つ作る。
#lvcreate -L1G vg00
lvcreate -- doing automatic backup of "vg00"
lvcreate -- logical volume "/dev/vg00/lvol1" successfully created
/dev/vg00/lvol1という名前のLVができる。名前を変えたいときは-nオプションを使えばOK。
LVの場合はlvdisplayで確認できる。結構コマンドに統一感があって覚えやすいね。
#lvdisplay /dev/vg00/lvol1
--- Logical volume ---
LV Name                /dev/vg00/lvol1
VG Name                vg00
LV Write Access        read/write
LV Status              available
LV #                   1
# open                 0
LV Size                1 GB
Current LE             256
Allocated LE           256
Allocation             next free
Read ahead sectors     120
Block device           58:0

ついでに、vgdisplayも見てみるとさっきの情報にLVの情報が加わって見える。

論理ボリューム(LV)を拡張する

次に、lvol1を拡張してみる。今までのパーティションの概念だと、すでにあるデータを壊さずに拡張とかはできなかった(よね?(^^;))から、この機能はLVMならではの機能だといえる。

先ほどのvgdisplayの結果を見ると、このvg00には7500のエクステント(PE)があることがわかる。ここではvg00の容量一杯まで拡張してしまう。
#lvextend -l 7500 /dev/vg00/lvol1
lvextend -- extending logical volume "/dev/vg00/lvol1" to 29.3 GB
lvextend -- doing automatic backup of volume group "vg00"
lvextend -- logical volume "/dev/vg00/lvol1" successfully extended
-Lオプションを使えば先ほどと同様、GB/MB単位での指定ができる。それから、ここでは拡張後のサイズとして7500を指定したが、プラス指定もできる。

lvdisplayを見てみる。
#lvdisplay /dev/vg00/lvol1
--- Logical volume ---
LV Name                /dev/vg00/lvol1
VG Name                vg00
LV Write Access        read/write
LV Status              available
LV #                   1
# open                 0
LV Size                29.3 GB
Current LE             7500
Allocated LE           7500
Allocation             next free
Read ahead sectors     120
Block device           58:0
きちんと、LV Sizeが29.3GB/7500エクステントになっていることがわかる。

論理ボリュームをReiserFSでフォーマットしmountして確認する

今度はlvol1をReiser FSでフォーマットし、実際マウントしてアクセスできるかどうか確認する。
#mkreiserfs /dev/vg00/lvol1
<-------------mkreiserfs, 2000-------------
reiserfsprogs 3.x.0
Creating reiserfs of 3.6 format
Block size 4096 byte
Block count 768000
Used blocks 844
Free blocks count 767155
First 16 blocks skippe
Super block is in 16
Bitmap blocks (235) are : 
Journal size 8192 (blocks 18-8210 of file /dev/vg00/lvol1)
Root block 8211
Hash function "r5"
   :
   :
   :
ATTENTION: YOU SHOULD REBOOT AFTER FDISK!
            ALL DATA WILL BE LOST ON '/dev/vg00/lvol1'! (y/n)y
   :
   :
   :
Syncing..

ReiserFS core development sponsored by SuSE Labs (suse.com)

Journaling sponsored by MP3.com.

To learn about the programmers and ReiserFS, please go to
http://www.devlinux.com/namesys

Have fun.
29.3GBだというのに結構短時間でフォーマットが終わる。ext2もそうだっけかな...。こんな容量のはやったこと無いからわかんないや(^^;)。
次はmountだ。
#mount -t reiserfs /dev/vg00/lvol1 /mnt/test
#cd /mnt/test
#ls

アリ? lost+foundができていないけど、良いのかな?
まぁ、ジャーナリングファイルシステムだからいらないって言えばいらないのか...。
一応、ファイルをコピーしてみたりしても大丈夫だしね。
dfもしてみよう。
#df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/hda2               991000    888471     51323  95% /
/dev/hdb1              7963671   6200777   1350044  82% /usr
/dev/hda1               511760    490600     21160  96% /mnt/win
/dev/vg00/lvol1       30719056     32840  30686216   0% /mnt/test
すばらしいッス。

/dev/hde3をボリュームグループ(VG)に追加してさらにファイルシステムも拡張する

今まで使っていたファイルシステムがあふれそうになったら...?
たぶん、今まではファイルをどこかに移したり、シンボリックリンク・ハードリンクなどを駆使してどうにかお茶を濁していたハズ。
しかし、なんと、LVM/ReiserFS(ext2も可)の組み合わせだと、VGを拡張するだけではなく、それまで使っていたファイルシステムのサイズも拡張できる。この機能、エンタープライズな目的ではとても必要とされる機能だよね。

ここでは、まだ全然使っていないんだけど、今まで使っていたlvol1をさらに拡張してみる。 そうそう、拡張する際に注意しなければいけないのが作業手順。
  1. 新しいハードディスクからpvcreateして物理ボリュームを作る
  2. VGをextendする。
  3. LVをextendする。
  4. ファイルシステムをextend(リサイズ)する。
という作業を順番にこなしていく必要がある。
#pvcreate /dev/hde3
pvcreate -- physical volume "/dev/hde3" successfully created
#vgextend vg00 /dev/hde3
vgextend -- INFO: maximum logical volume size is 255.99 Gigabyte
vgextend -- doing automatic backup of volume group "vg00"
vgextend -- volume group "vg00" successfully extended


#vgdisplay -v vg00
--- Volume group ---
VG Name               vg00
VG Access             read/write
VG Status             available/resizable
VG #                  0
MAX LV                256
Cur LV                1
Open LV               1
MAX LV Size           255.99 GB
Max PV                256
Cur PV                3
Act PV                3
VG Size               41.99 GB
PE Size               4 MB
Total PE              10750
Alloc PE / Size       7500 / 29.3 GB
Free  PE / Size       3250 / 12.7 GB
VG UUID               0IvpJT-jRuc-R77l-qCP6-UgEK-2hIA-e7bBjF

--- Logical volume ---
LV Name                /dev/vg00/lvol1
VG Name                vg00
LV Write Access        read/write
LV Status              available
LV #                   1
# open                 1
LV Size                29.3 GB
Current LE             7500
Allocated LE           7500
Allocation             next free
Read ahead sectors     120
Block device           58:0

--- Physical volumes ---
PV Name (#)           /dev/hde1 (1)
PV Status             available / allocatable
Total PE / Free PE    3750 / 0

PV Name (#)           /dev/hde2 (2)
PV Status             available / allocatable
Total PE / Free PE    3750 / 0

PV Name (#)           /dev/hde3 (3)
PV Status             available / allocatable
Total PE / Free PE    3250 / 3250
VG Sizeが41.99 GBに増えているのと、最後にきちんと/dev/hde3が追加されているのが確認できる。

次にLV(lvol1)も拡張する。今度はプラス指定でやってみる。
#lvextend -l +3250 /dev/vg00/lvol1
lvextend -- extending logical volume "/dev/vg00/lvol1" to 41.99 GB
lvextend -- doing automatic backup of volume group "vg00"
lvextend -- logical volume "/dev/vg00/lvol1" successfully extended

#lvdisplay /dev/vg00/lvol1
--- Logical volume ---
LV Name                /dev/vg00/lvol1
VG Name                vg00
LV Write Access        read/write
LV Status              available
LV #                   1
# open                 1
LV Size                41.99 GB
Current LE             10750
Allocated LE           10750
Allocation             next free
Read ahead sectors     120
Block device           58:0
で、最後にファイルシステムの拡張だ。-fオプションをつけるとmountしたまま拡張できてしまう。すごい。
#でも、ホントはumountしてからの方が安全なんだろうけどね。
#resize_reiserfs -f /dev/vg00/lvol1 
#df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/hda2               991000    895631     44163  95% /
/dev/hdb1              7963671   6200777   1350044  82% /usr
/dev/hda1               511760    490600     21160  96% /mnt/win
/dev/vg00/lvol1       44030652     32840  43997812   0% /mnt/test
おぉ。できたできた(^^)/。
この他にもファイルシステムのディスク容量を減らしたり、物理ボリュームを移動したりとホントにいろいろなことができるので興味のある人はやってみて。おいらはこの辺で満足したんで終わりにしときます(^^;)。

ReiserFSのfsck機能を使う

ちょっと毛色が変わるんだけど、ReiserFSのfsck機能を使ってみる。
#umount /mnt/test
#reiserfsck /dev/vg00/lvol1

<-------------reiserfsck, 2000------------->
reiserfsprogs 3.x.0d
Will read-only check consistency of the partition
Will put log info to stderr
Do you want to run this program?[N/Yes] (note need to type Yes):Yes
Analyzing journal..nothing to replay (no transactions older than last flushed one found)
Checking S+tree..ok
Comparing bitmaps..ok
Checking Semantic tree...ok       
速い。まだファイルがほとんどないからかもしれんが....。8GB弱の/dev/hdb1なんてfsckが走ったら10分近く(体感速度(^^;))はfsckをやっているというのに....。うーん。満足(^^)v。
一応、ブート時に、ReiserFSの部分もfsckをするようにしようと思ったんだけど疲れた。あまりfsckやらなくても良いみたいだし気が向いたらやることとしよう。

2001/03/10(Sat)

先週買ったUA-HD100C(PCI IDEコントローラ)の件だが1週間まるまる使っていろいろあれこれしたところ、ようやく使えるようになったので、ここに書いておくことにする(作業はrootでやった)。

まず、UA-HD100Cの上に載っているチップにはTALKSと大きく書いてあるが、そのような名前のチップセットはLinuxのカーネルコンフィギュレーション時に全く出てこない。ま、どうせOEMだろうと思い、ひとまず、UA-HD100Cをマザーボードに挿してブートしてみた後で以下のようにしてみた。
 #cat /proc/pci
      :
      :
  Bus  0, device  11, function  0:
    Unknown mass storage controller: PCI device 1103:0005 (Triones Technologies, Inc.) (rev 3).
      :
      :
お、Triones Technologies, Incという会社のチップを使ってるのね。1103がVENDERのID,0005が製品のIDだ。この情報は/usr/include/linux/pci_ids.hに定義されているのでpci_ids.hを見ると
      :
      :
#define PCI_VENDOR_ID_TTI        0x1103
#define PCI_DEVICE_ID_TTI_HPT343 0x0003
#define PCI_DEVICE_ID_TTI_HPT366 0x0004
      :
      :
とTTI(Triones Technologies, Incの略でしょう)のチップセットとしてはHPT343,HPT366というのがすでにサポートされているらしいことが分かる。

それからgoogleで検索。HighPoint Technologiesのホームページが1番にひっかかった。Triones Technologiesでは無いみたいだが、スペック・名前からしてどうやらこのホームページにあるHPT370というチップを使っているようだ。このチップはすでにLinuxでサポートされていると書いてある(ホームページにもLinux Now!のロゴと2.2.x系へのパッチがダウンロードできるようになっている)。ということはカーネルのコンフュギレーションを変更すればいけるのかな。

そんなわけでさっそく、make mrproper; make xconfig。やっぱりありました、HPT370用の項目が。で、そいつをYにしてカーネルを再構築だ。
ATA/IDE/MFM/RLL support → IDE,ATA and ATAPI Block devices → HPT366 chipset support(CONFIG_BLK_DEV_HPT366)


次に、UA-HD100Cに接続したハードディスクを認識させなきゃいけない。これはJFのUltra-DMA-5.htmlを参考に以下のようにした。

まずはpciの情報を調べる。
 #cat /proc/pci
      :
      :
  Bus  0, device  11, function  0:
    Unknown mass storage controller: PCI device 1103:0005 (Triones Technologies, Inc.) (rev 3).
      IRQ 10.
      Master Capable.  Latency=64.  Min Gnt=8.Max Lat=8.
      I/O at 0xd000 [0xd007].
      I/O at 0xb800 [0xb803].
      I/O at 0xb400 [0xb407].
      I/O at 0xb000 [0xb003].
      I/O at 0xa800 [0xa8ff].
  Bus  0, device  13, function  0:
      :
      :
ここのI/Oの情報をもとに/etc/lilo.confを編集する。詳しくはUltra-DMA-5.htmlを見てね(^^;)。
image=/boot/vmlinuz-2.4.2
        label=linux
        root=/dev/hda2
        append="ide2=0xd000,0xb802,10 ide3=0xb400,0xb002,10"
        read-only
(IRQはマザーボードのBIOSに手動で10を設定してある)

で、liloを実行してから再起動。
きちんとIDEとして読み込めているかdmesgで確認する。
#dmesg|more
     :
     :
Kernel command line: BOOT_IMAGE=linux ro root=302 ide2=0xd000,0xb802,10 ide3=0xb400,0xb002,11
ide_setup: ide2=0xd000,0xb802,10

ide_setup: ide3=0xb400,0xb002,11

Initializing CPU#0
Detected 501.147 MHz processor.
Console: colour VGA+ 80x25
Calibrating delay loop... 999.42 BogoMIPS
     :
     :
ALI15X3: IDE controller on PCI bus 00 dev 78
ALI15X3: chipset revision 193
ALI15X3: not 100% native mode: will probe irqs later
    ide0: BM-DMA at 0xa000-0xa007, BIOS settings: hda:DMA, hdb:DMA
    ide1: BM-DMA at 0xa008-0xa00f, BIOS settings: hdc:pio, hdd:pio
hda: WDC AC31600H, ATA DISK drive
hdb: IBM-DTTA-350840, ATA DISK drive
hdc: WDC AC21200H, ATA DISK drive
hde: IBM-DTLA-307045, ATA DISK drive
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
ide1 at 0x170-0x177,0x376 on irq 15
ide2 at 0xd000-0xd007,0xb802 on irq 10
hda: Disabling (U)DMA for WDC AC31600H
hda: 3173184 sectors (1625 MB) w/128KiB Cache, CHS=787/64/63
hdb: 16514064 sectors (8455 MB) w/467KiB Cache, CHS=1027/255/63, UDMA(33)
hdc: 2503872 sectors (1282 MB) w/128KiB Cache, CHS=2484/16/63, DMA
hde: 90069840 sectors (46116 MB) w/1916KiB Cache, CHS=89355/16/63
Partition check:
 hda: hda1 hda2 hda3
 hdb: hdb1
 hdc: [PTBL] [621/64/63] hdc1
 hde:hde: lost interrupt
hde: lost interrupt
hde: lost interrupt
hde: lost interrupt
hde: lost interrupt
 unknown partition table
ここで、ide2にIDEコントローラが、hdeに新しいハードディスクが割り当てられたことが分かる。でも、ALI15X3(内蔵IDEコントローラ)が認識されているのに、HPT370が認識されていない。そのせいかhdeのところでlost interruptと出てしまう。なぜ?。
実は、これが出てもディスクにアクセスできるのだが異様に遅い。というかこれぢゃアクセスできてるうちに入らない。

いろいろ調べてみたんだけど、どうにもこうにもラチがあかない。
で、結局のところHPT366というチップセットを認識させれば良いのだろうということで、超裏技、カーネルソースをちょっとだけ修正するという暴挙に出ることにした。なんか疲れてきたし(^^;)。
(linuxのソースが入っているディレクトリ)/include/linux/pci_ids.h
   :
   :
#define PCI_VENDOR_ID_TTI               0x1103
#define PCI_DEVICE_ID_TTI_HPT343        0x0003
/* #define PCI_DEVICE_ID_TTI_HPT366     0x0004 */
#define PCI_DEVICE_ID_TTI_HPT366        0x0005
   :
   :
(linuxのソースが入っているディレクトリ)/drivers/ide/ide-pci.c
   :
   :
        switch(dev->device) {
                case PCI_DEVICE_ID_TTI_HPT366:
                case PCI_DEVICE_ID_PROMISE_20246:
                case PCI_DEVICE_ID_PROMISE_20262:
                case PCI_DEVICE_ID_PROMISE_20265:
                case PCI_DEVICE_ID_PROMISE_20267:
/*
                case PCI_DEVICE_ID_ARTOP_ATP850UF:
*/
                case PCI_DEVICE_ID_ARTOP_ATP860:
                case PCI_DEVICE_ID_ARTOP_ATP860R:
                        return dev->irq;
                default:
                        break;
        }

   :
   :
HPT370はPCI_DEVICE_IDが0005で、HPT366は0004だからそこを0005にしてしまうことで、HPT366として認識させようというわけ。実はドライバのソース(hpt366.c)を読むと、すでにHPT370に対応していてHPT366とはリビジョン番号で区別しているみたいなのでこのような荒技で対応できそうなんだよね(流し読みだから間違えてるかも...(^^;))。
ということは、一般的なHPT370のIDEコントローラ(or RAIDコントローラ)はひょっとして、PCI_DEVICE_ID自体は0004なのでしょうか?
結構使われているチップみたいだし、そうでもないと、もっとたくさんのバグ報告がWWW上にあがっていても良さそうな気がする...。

で、ide-pci.cの方はマクロ値が衝突(PCI_DEVICE_ID_ARTOP_ATP850UFが同じ値)していてcase文でエラーになるからその部分をコメントアウト。もちろん、PCI_DEVICE_ID_ARTOP_ATP850UFのチップセットを使っている場合は、こんなことしたらそっちが動かなくなるかもしれん。
でも、このswitch文、ぢつはちょっとおかしい気がするんだよね。というのは...と説明すると長くなるので割愛。まぁ、妥協の産物でこうなっているのかバグなのかはよくわかんないんだけどね。

お、そうそう、書き忘れてた(^^;)。
もちろん、こんなことは余程のことがない限りまねしないようにしてください。できれば、LinuxをきちんとサポートしたIDEコントローラを購入するとかしてください。
カーネルのバージョンがあがっただけで修正しなくてはならないというとてつもなく面倒くさいことになってしまうし、もしかしたら動かなくなるかもしれん。

ふぅ。おいらも引き続きなんとかカーネルに手を入れないで済む方法を考えるとしよう。


そんなこんなで、上記修正をしてカーネルを再構築してリブート。今度はdmesgが以下のように表示されるようになった。
#dmesg|more
     :
     :
HPT370: IDE controller on PCI bus 00 dev 58
PCI: Found IRQ 10 for device 00:0b.0
HPT370: chipset revision 3
HPT370: not 100% native mode: will probe irqs later
    ide2: BM-DMA at 0xa800-0xa807, BIOS settings: hde:DMA, hdf:pio
    ide3: BM-DMA at 0xa808-0xa80f, BIOS settings: hdg:pio, hdh:pio
ALI15X3: IDE controller on PCI bus 00 dev 78
ALI15X3: chipset revision 193
ALI15X3: not 100% native mode: will probe irqs later
    ide0: BM-DMA at 0xa000-0xa007, BIOS settings: hda:DMA, hdb:DMA
    ide1: BM-DMA at 0xa008-0xa00f, BIOS settings: hdc:pio, hdd:pio
     :
     :
hda: WDC AC31600H, ATA DISK drive
hdb: IBM-DTTA-350840, ATA DISK drive
hde: IBM-DTLA-307045, ATA DISK drive
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
ide2 at 0xd000-0xd007,0xb802 on irq 10
hda: Disabling (U)DMA for WDC AC31600H
hda: 3173184 sectors (1625 MB) w/128KiB Cache, CHS=787/64/63
hdb: 16514064 sectors (8455 MB) w/467KiB Cache, CHS=1027/255/63, UDMA(33)
hde: 90069840 sectors (46116 MB) w/1916KiB Cache, CHS=89355/16/63, UDMA(100)
Partition check:
 hda: hda1 hda2 hda3
 hdb: hdb1
 hde: unknown partition table
     :
     :
hdcがいなくなったのは、作業中、ブチっという音と共にハードディスクがお亡くなりになったため(T_T)。

現段階でのIDEコントローラ・ハードディスク構成は以下のようになっている。
コントローラ インターフェイス M/S drive 備考
ALi M1543C
(内蔵)
ide0Masterhda1625MB,UDMA非対応,Win98もこのディスクに入っていて、LILOによるブート切り替えを行っている。
Slavehdb8455MB,UDMA(33)対応。
ide1Masterhdc今回お亡くなりになった。
Slave(hdd)未使用。
UA-HD100Cide2Masterhde46116 MB,UDMA(100)対応。今回購入したタマ。いづれはこちらに全てを移そうと思う
Slave(hdf)未使用。
ide3Master(hdg)未使用。
Slave(hdh)未使用。

一応、hdparmでハードディスクの情報を見る。
[/usr/include/linux]#hdparm /dev/hde

/dev/hde:
 multcount    =  0 (off)
 I/O support  =  0 (default 16-bit)
 unmaskirq    =  0 (off)
 using_dma    =  1 (on)
 keepsettings =  0 (off)
 nowerr       =  0 (off)
 readonly     =  0 (off)
 readahead    =  8 (on)
 geometry     = 23819/16/63, sectors = 90069840, start = 0
アリ?I/O supportが16-bitのままだ。自動で認識してくれないのかな。ひとまず、手動でonにしよう。
[/usr/include/linux]#hdparm -c 1 /dev/hde

/dev/hde:
 setting 32-bit I/O support flag to 1
 I/O support  =  1 (32-bit)
[/usr/include/linux]#hdparm /dev/hde

/dev/hde:
 multcount    =  0 (off)
 I/O support  =  1 (32-bit)
 unmaskirq    =  0 (off)
 using_dma    =  1 (on)
 keepsettings =  0 (off)
 nowerr       =  0 (off)
 readonly     =  0 (off)
 readahead    =  8 (on)
 geometry     = 23819/16/63, sectors = 90069840, start = 0
これでOK。で、hdparm -tで性能を測ってみる。
[/usr/include/linux]#hdparm -t /dev/hde

/dev/hde:
 Timing buffered disk reads:  64 MB in  2.37 seconds = 27.00 MB/sec
前に内蔵IDEコントローラの方で試したときのhdbの結果は(UDMA(33))11.57 MB/secだったので2.3倍だ。速いなぁ。とはいえ理論値で行くと34MB/sec位にはなっていないといけないんだけどね。ま、良しとしよう。

ところで、以前は/etc/rc.d/rc.sysinitにhdparm -c 1 /dev/hda等として起動時にI/Oを32-bit指定しているのでそこに/dev/hdeも追加しておく。

P.S.まとめ

今日悲しかったこと:
  1. SYSTEM TALKSのLinuxへの対応度があまりにも中途半端だったこと。あんなレベルでLinux対応とは書いて欲しくないよな。
  2. ハードディスクがお亡くなりになったこと。

今日うれしかったこと:
  1. なんとか、IDEコントローラを買い換えずにすんだこと。
  2. 亡くなったハードディスクにはほとんど重要なデータが入っていなかったこと。ブートディスクでもなくてホントラッキーだったな...。

みなさんへのお願い:
  1. ここに書いてあることはまねしないでくださいね。
  2. 他に対処方法を知っている方は是非教えてください。

2001/03/03(Sat)

今日は雛祭りか〜。
という前フリとは全然関係ないんだけど、久しぶりに秋葉原へ。PC-133のSD-RAM(8,000円弱),IDEハードディスク(+外付けIDEコントローラ),100Base-TXのLANカード(corerga PCI-TXB)を購入した(というかしてしまった(^^;))。
IDEハードディスクは調子にのってIBM DTLA-307045(46.1GB 7,200rpm Ultra ATA/100)なんておいらにとってはとてもじゃないが想像できないような高スペックのタマを買ってしまった。といってもこれで17,000円弱だからなぁ。安くなったもんだ。
ところが、残念ながらおいらの愛機のマザーはASUS P5Aで、こいつのオンボードIDEコントローラはUltra ATA/33までしか対応していない。そんなわけで、ついでにSYSTEM TALKSというメーカのUA-HD100CというPCIカードも買った。5,000円弱。こいつはUltra ATA/100まで対応できるPCI IDEコントローラだ。Linux対応と書いてあるのが購入の決め手。SCSI買うという手も考えたんだけどIDEに比べてちょっと高すぎるんだよね。いろいろと良いんだろうけど。

家に帰ってひとまずSD-RAMでメモリを512MBにした後、さっそくIDEハードディスクを増設することにした。
SYSTEM TALKSのUA-HD100Cは箱にLinux対応(Linuxのユーザサポートはありません)と書いてある。書いてあるから買った。それなのに、Linuxでの設定方法が一切見あたらない(付属の説明書(といってもHTMLファイル)にもホームページにも(2001/3/3現在))。ユーザサポートはともかくとして、これでは一体どうしたらよいのか全然分からんし、サポートセンターに問い合わすのもダメということでは手も足も出ない。At Your Own Riskを逆手に取った悪徳商法だ(言い過ぎ?)。にしても困ったぞ...。
[前の月へ] [メニューへ] [次の月へ]