(更新:2014/10)UUIDを使ったマウント
(作成:2012/02)
UUIDを使ったマウント
最近のLinuxは、ディスクのマウントに「UUID=ほげほげ」みたいな書き方してるのを良く見る。こりゃ一体何じゃろなーと思いつつ、これまで特に調べもせず放置していた。
調べた切っ掛けだけれど、最近VM上のLinuxにUSB HDDを起動時オートマウントするよう設定してて。いつもはUSB HDDの挿し口を固定してたんだけれど、先日ちょいと他所で使おうとした時に違うポートへ挿したら起動時マウントにコケてそのまま進まない、という残念な事が起きて。
これ回避したいなーと調べてた時の副産物として、このマウント方法を知ったのでメモ。
つまりUUIDて何よー、というのはUUID - Wikipediaを読むと良いんじゃないかな。簡単に言うと、128bitのユニークIDというだけのこと。ネットワークで言えば(厳密にはナンチャッテだけれど)MACアドレスみたいなもんで、対象を特定するためのIDとして利用できる。
で、それでディスクをマウントして何が楽しーの? ということになるけれど、つまりudevが接続された各種デバイスに対しUUIDとして一意なシンボリックリンク作ってくれるから、一度カーネルが認識したデバイスは以降見付け次第そのシンボリックリンクで参照できるよ、ということで。上記問題みたく、挿したポートが違うばかりに認識しない(内部的には以前と別のドライブとして認識)ということが少なくなる……ハズ。
まあ兎に角、こんな風に調べて。
$ ls -l /dev/disk/by-uuid/
...
lrwxrwxrwx 1 root root 10 10月 26 20:37 DE3C-37EA -> ../../sdb1
...
こんな風にfstabを書き換えるだけ。
# vi /etc/fstab
#/dev/sdb1 /media/nas vfat rw,users,defaults,iocharset=utf8,umask=000 0 0
UUID=DE3C-37EA /media/nas vfat rw,users,defaults,iocharset=utf8,umask=000 0 0
で、マウントテスト。OKだったら今後はそれでマウントすれば一応、違うポートに挿したが為に……という哀しみの螺旋から抜け出すことが出来る、ハズ。
HDDイメージをVM化
停電でPCが故障した……おかしいだろ常考。
とまあ嘆いていても仕方無いので、思いつくトラブル対応方法をまとめてみるテスト。
電源だけの故障ならHDDは生きてる。同スペックのPCがあればHDD交換で復活できるけれど、いっそ直接HDDからイメージ抽出してVM化したほうが後々楽でないかしらん、と思ったり思わなかったり。
この作業にはHDDに直接アクセスする方法が必要になります。「USB SATA 変換」とかでググれば色々出てくると思う。
で、手順。Ubuntu Desktopなら勝手にマウントして見せてくれるので、取り敢えずマウント情報を得る。
# mount
...
/dev/sdb3 on /media/_ type ext3 (rw,nosuid,nodev,uhelper=devkit)
/dev/sdb1 on /media/_boot type ext3 (rw,nosuid,nodev,uhelper=devkit)
例えばこんなん。判ったら下手なアクセスを防ぐためにアンマウント。で、ddでイメージ抽出。
# dd if=/dev/sdb of=/var/tmp/hogehoge.img
じっと待つ。出来上がったらqemuでイメージ変換。
# qemu convert /var/tmp/hogehoge.img -0 vmdk hogehoge.vmdk
LVMでSnapShotBackup
CentOSから持ってきたねた。LVM (Logical Volume Manager)なるディスク管理規格は、昨今のLinux OSでよく見かける。これを使うとLinuxでのディスク管理がものすごくステキになる。
例えばデータのバックアップを取りたい場合。MySQLなんかのデータは、必ずサービスを停止しないとデータが壊れる。けれど、バックアップ中ずっと停止してたら24H365Dサービスなんて出来ないわけで。
そこでLVM。まあえらく簡単な図で説明すると、こんな感じで管理が分かれている。
VolGroup(ボリュームグループ)というのがキモで、複数の物理ボリューム(/dev/hda1とか/dev/hda2とか)をまとめて取り扱っ てくれるもの。このVolGroup上にLogVol(論理ボリューム)を作り、それを従来のパーティションの代用として使う。しかも動的に。
で、上図のように物理ボリュームに対し論理ボリュームに空きがある場合、この領域をスナップショット・ボリュームとして使う事ができる。つまり、作業中 に変更の受けたデータをチャンク単位でスナップショット・ボリュームに保持し、実際のデータには変更を加えずにおくので、スナップショット中はデータ破損 の心配がなくバックアップすることができる。
スナップショット・ボリュームは、解放すれば保持していたデータを実データに適用してくれるので、バックアップ中も停止する事なく使い続けられる。
さて実際の操作。サーバへのLinuxインストール段階である程度論理ボリューム領域に空きを作っておくのが良いかと。例えばこんな感じ。
# vgdisplay
--- Volume group ---
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 247
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 1
Act PV 1
VG Size 99.88 GB
PE Size 32.00 MB
Total PE 3196
Alloc PE / Size 2992 / 93.50 GB
Free PE / Size 204 / 6.38 GB
VG UUID 3fiEQq-1xd3-Bs2d-ayOc-KLE0-PGlD-BbaAbB
この例では、99.88GBあるうちの6.38GBを空き領域として確保しておいた。で、マウント状況がこんな感じだったとする。
# df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
15G 2.3G 12G 17% /
/dev/mapper/VolGroup00-LogVol02
76G 2.4G 70G 4% /var
/dev/sda1 99M 19M 75M 21% /boot
tmpfs 1006M 0 1006M 0% /dev/shm
/var/ 以下、例えば /var/www とか /var/lib/mysql とか、本来停止してからでなきゃバックアップできないものが盛り沢山。。。という時にLVMスナップショットを使うと素敵。
# lvcreate --snapshot --name snap-backup --size 5G /dev/VolGroup00/LogVol02
Logical volume "snap-backup" created
# mount /dev/VolGroup00/snap-backup /mnt/
こうするとLVMスナップショットが働き、/mnt/ 以下で更新の発生しない実データを参照できる。思う存分バックアップできる。
バックアップを堪能したら、アンマウントしてスナップショット・ボリュームを解放してあげれば良い。
# umount /mnt/
# lvremove -f /dev/VolGroup00/snap-backup
Logical volume "snap-backup" successfully removed
あら簡単。ちなみにMySQLをバックアップする際は、より安全性を考慮しLVMスナップショット作成する直前で FLUSH TABLES WITH READ LOCK;
、直後に UNLOCK TABLES;
しておくと良い。
LVMで論理ボリューム拡張
CentOSから持ってきたねた。こんな図で表現してみるテスト。
どういう事かというと、つまり複数の物理ボリュームを合計して一つの論理ボリュームにすることができる。例えばVMware ESXiでVMFSのブロックサイズをデフォルトのまま設定しちゃった、とか……ウン解る方だけ解れば良いかな。256GB以上のディスクが作れない事を 知った時の絶望感といったら……
さて。そんなこんなで例えばVMware ESXiの[設定の編集]からハードディスクを沢山追加してゲストOSを再起動したとか、或いは普通のPCでもHDDを沢山購入してぶっ挿して再起動すると、OS上で複数のストレージ・デバイスが認識される。例えばこんな感じ。
$ ls /dev/sd
sda sda1 sdb sdb1 sdb2 sdb5 sdb6 sdc sdc1 sdd sde sdf
$ mount
/dev/sdb1 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sdb5 on /usr/local type ext3 (rw)
/dev/sdc1 on /usr/local/dav type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/sdd、/dev/sde、/dev/sdf の3つのデバイスを一つのボリュームとして使ってみる。まずはfdiskでLVMパーティションを作成。
# fdisk /dev/sdd
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。
このディスクのシリンダ数は 33418 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
(例. DOS FDISK, OS/2 FDISK)
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-33418, default 1):
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-33418, default 33418):
Using default value 33418
コマンド (m でヘルプ): t
Selected partition 1
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 1 から 8e (Linux LVM) に変更しました
コマンド (m でヘルプ): p
Disk /dev/sdd: 274.8 GB, 274877906944 bytes
255 heads, 63 sectors/track, 33418 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
デバイス Boot Start End Blocks Id System
/dev/sdd1 1 33418 268430053+ 8e Linux LVM
コマンド (m でヘルプ): w
領域テーブルは交換されました!
ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。
やってる事は単純で、/dev/sdd上に基本領域1を作成し、Linux LVM(8e)のシステムタイプに変更するだけ。これを/dev/sde、/dev/sdfに対しても実施する。
これで物理ボリュームを耕せた。
# pvcreate /dev/sdd1
Physical volume "/dev/sdd1" successfully created
# pvcreate /dev/sde1
Physical volume "/dev/sde1" successfully created
# pvcreate /dev/sdf1
Physical volume "/dev/sdf1" successfully created
# pvdisplay
"/dev/sdd1" is a new physical volume of "255.99 GB"
--- NEW Physical volume ---
PV Name /dev/sdd1
VG Name
PV Size 255.99 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 2gnlAV-0Q7l-zjfX-uJcX-Y9g8-unyT-8lw7Ve
"/dev/sde1" is a new physical volume of "255.99 GB"
--- NEW Physical volume ---
PV Name /dev/sde1
VG Name
PV Size 255.99 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID LvHy18-QWGJ-0XSv-gwy9-Juct-aS9i-WTt5Fq
"/dev/sdf1" is a new physical volume of "255.99 GB"
--- NEW Physical volume ---
PV Name /dev/sdf1
VG Name
PV Size 255.99 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID YO0jOf-MyGE-PPho-UCAV-YgBN-AgJJ-Zn40x3
次はこれをボリューム・グループ"storage"に所属させてみる。
# vgcreate storage /dev/sdd1
Volume group "storage" successfully created
# vgextend storage /dev/sde1
Volume group "storage" successfully extended
# vgextend storage /dev/sdf1
Volume group "storage" successfully extended
これだけ。超簡単。これでボリューム・グループが面倒見てくれるようになった。
# vgdisplay
--- Volume group ---
VG Name storage
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 6
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 3
Act PV 3
VG Size 767.98 GB
PE Size 4.00 MB
Total PE 196602
Alloc PE / Size 0 / 0
Free PE / Size 196602 / 767.98 GB
VG UUID vwxumu-y8Up-o4Kb-6sZK-o8AT-YMhl-ZhZFYz
最後にここへ論理ボリュームを作成する。
# lvcreate -L 767.98GB -n LogVol00 storage
Rounding up size to full physical extent 767.98 GB
Logical volume "LogVol00" created
これだけ。なにこれべんり。これで複数あったディスクが一つにまとめられた。
# lvdisplay
--- Logical volume ---
LV Name /dev/storage/LogVol00
VG Name storage
LV UUID cdfowl-G0SE-dExJ-Dd8Z-tUQe-KKCh-1746b5
LV Write Access read/write
LV Status available
# open 0
LV Size 767.98 GB
Current LE 196602
Segments 3
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
後は普通にフォーマットしてマウントすればOK。
# mkfs.ext3 -j /dev/storage/LogVol00
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
100663296 inodes, 201320448 blocks
10066022 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
6144 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# mount -t ext3 /dev/storage/LogVol00 /mnt
そして後から更にディスクを追加して拡張する方法。まずはディスクを追加して再起動とかしてOS上で認識させる。今回の例では/dev/sdg、/dev/sdhの2台。
まずは物理ボリュームを耕す。fdiskは長いので割愛。
# pvcreate /dev/sdg1
Physical volume "/dev/sdg1" successfully created
# pvcreate /dev/sdh1
Physical volume "/dev/sdh1" successfully created
物理ボリュームを見てみるとこんな感じ。/dev/sdg1と/dev/sdh1はまだVG Nameも設定無いしAllocatableにもされてない。
# pvdisplay
--- Physical volume ---
PV Name /dev/sdd1
VG Name storage
PV Size 255.99 GB / not usable 2.72 MB
Allocatable yes (but full)
PE Size (KByte) 4096
Total PE 65534
Free PE 0
Allocated PE 65534
PV UUID 2gnlAV-0Q7l-zjfX-uJcX-Y9g8-unyT-8lw7Ve
--- Physical volume ---
PV Name /dev/sde1
VG Name storage
PV Size 255.99 GB / not usable 2.72 MB
Allocatable yes (but full)
PE Size (KByte) 4096
Total PE 65534
Free PE 0
Allocated PE 65534
PV UUID LvHy18-QWGJ-0XSv-gwy9-Juct-aS9i-WTt5Fq
--- Physical volume ---
PV Name /dev/sdf1
VG Name storage
PV Size 255.99 GB / not usable 2.72 MB
Allocatable yes (but full)
PE Size (KByte) 4096
Total PE 65534
Free PE 0
Allocated PE 65534
PV UUID YO0jOf-MyGE-PPho-UCAV-YgBN-AgJJ-Zn40x3
"/dev/sdg1" is a new physical volume of "255.99 GB"
--- NEW Physical volume ---
PV Name /dev/sdg1
VG Name
PV Size 255.99 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID qqWXiQ-3JSw-7Xki-7Eu2-oYDt-OTLy-uKGQXj
"/dev/sdh1" is a new physical volume of "255.99 GB"
--- NEW Physical volume ---
PV Name /dev/sdh1
VG Name
PV Size 255.99 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID CfbNwM-9te6-wbxk-0bSt-o96y-cxvP-j3OrCW
というわけでボリュームグループに追加。何か色々増えたった。
# vgextend storage /dev/sdg1
Volume group "storage" successfully extended
# vgextend storage /dev/sdh1
Volume group "storage" successfully extended
# vgdisplay
--- Volume group ---
VG Name storage
System ID
Format lvm2
Metadata Areas 5
Metadata Sequence No 8
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 5
Act PV 5
VG Size 1.25 TB
PE Size 4.00 MB
Total PE 327670
Alloc PE / Size 196602 / 767.98 GB
Free PE / Size 131068 / 511.98 GB
VG UUID vwxumu-y8Up-o4Kb-6sZK-o8AT-YMhl-ZhZFYz
論理ボリューム拡張したったった。
# lvextend -l +131068 /dev/storage/LogVol00
Extending logical volume LogVol00 to 1.25 TB
Logical volume LogVol00 successfully resized
更にファイルシステムをオンライン・リサイズしたったったった。
# resize2fs /dev/storage/LogVol00
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/storage/LogVol00 is mounted on /usr/local/dav; on-line resizing required
Performing an on-line resize of /dev/storage/LogVol00 to 335534080 (4k) blocks.
The filesystem on /dev/storage/LogVol00 is now 335534080 blocks long.
拡張作業中、 watch df
などのコマンドでディスクサイズの推移を見ると、徐々にディスク上限が増えていくのが解る。うむ、なかなかシュールな光景であるな。
他にもLVM管理は色々と便利な機能が盛り沢山。使えるなら使った方がお得かも。