Ubuntuのファイルシステム・パーティション・LVM
≪≪この記事をすべて読むには約 35 分かかります≫≫
Ubuntuをいじっているのですが、前からなのかいつからなのか、意識しないでインストールするとLVMのボリュームにシステムインストールされています。
訳が分からないので、ちょっとずついじりながら取り扱いを書いていきます。
現在のディスク構成(Ubuntu Server 22.04 LTS上)
とりあえず現在の構成を表示してみます。物理デバイスは2つ、
- Samsung SSD 860(480GB):SSD
- ST1000DM010-2EP1(1TB):SATA HDD、Seagate Barracuda 7200RPM
で、メインのSSDを使っていて、HDDのほうは全く何もしてありません。
$ sudo fdisk -l Disk /dev/loop0: 61.96 MiB, 64970752 bytes, 126896 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/loop1: 61.96 MiB, 64966656 bytes, 126888 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/loop2: 79.95 MiB, 83832832 bytes, 163736 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/loop3: 102.98 MiB, 107986944 bytes, 210912 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/loop4: 46.96 MiB, 49242112 bytes, 96176 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sda: 465.76 GiB, 500107862016 bytes, 976773168 sectors Disk model: Samsung SSD 860 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: E1EBE31E-AAC7-4CD4-B525-917D49DBA410 Device Start End Sectors Size Type /dev/sda1 2048 2203647 2201600 1G EFI System /dev/sda2 2203648 6397951 4194304 2G Linux filesystem /dev/sda3 6397952 976771071 970373120 462.7G Linux filesystem Disk /dev/sdb: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors Disk model: ST1000DM010-2EP1 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 100 GiB, 107374182400 bytes, 209715200 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
$ df -kh Filesystem Size Used Avail Use% Mounted on tmpfs 761M 2.0M 759M 1% /run /dev/mapper/ubuntu--vg-ubuntu--lv 98G 43G 51G 47% / tmpfs 3.8G 0 3.8G 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 3.8G 0 3.8G 0% /run/qemu /dev/sda2 2.0G 134M 1.7G 8% /boot /dev/sda1 1.1G 5.3M 1.1G 1% /boot/efi tmpfs 761M 112K 761M 1% /run/user/1000
$ sudo parted -l Model: ATA Samsung SSD 860 (scsi) Disk /dev/sda: 500GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 1128MB 1127MB fat32 boot, esp 2 1128MB 3276MB 2147MB ext4 3 3276MB 500GB 497GB Error: /dev/sdb: unrecognised disk label Model: ATA ST1000DM010-2EP1 (scsi) Disk /dev/sdb: 1000GB Sector size (logical/physical): 512B/4096B Partition Table: unknown Disk Flags: Model: Linux device-mapper (linear) (dm) Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 107GB Sector size (logical/physical): 512B/512B Partition Table: loop Disk Flags: Number Start End Size File system Flags 1 0.00B 107GB 107GB ext4
$ sudo gdisk -l /dev/sda GPT fdisk (gdisk) version 1.0.8 Partition table scan: MBR: not present BSD: not present APM: not present GPT: not present Found valid GPT with protective MBR; using GPT. Disk /dev/sda: 976773168 sectors, 465.8 GiB Model: Samsung SSD 860 Sector size (logical/physical): 512/512 bytes Disk identifier (GUID): E1EBE31E-AAC7-4CD4-B525-917D49DBA410 Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 34, last usable sector is 976773134 Partitions will be aligned on 2048-sector boundaries Total free space is 4077 sectors (2.0 MiB) Number Start (sector) End (sector) Size Code Name 1 2048 2203647 1.0 GiB EF00 2 2203648 6397951 2.0 GiB 8300 3 6397952 976771071 462.7 GiB 8300 $ sudo gdisk -l /dev/sdb GPT fdisk (gdisk) version 1.0.8 Partition table scan: MBR: not present BSD: not present APM: not present GPT: not present Creating new GPT entries in memory. Disk /dev/sdb: 1953525168 sectors, 931.5 GiB Model: ST1000DM010-2EP1 Sector size (logical/physical): 512/4096 bytes Disk identifier (GUID): 8A2C7491-EBA0-44F0-9FFF-31277660E479 Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 34, last usable sector is 1953525134 Partitions will be aligned on 2048-sector boundaries Total free space is 1953525101 sectors (931.5 GiB) Number Start (sector) End (sector) Size Code Name
物理デバイスは
- /dev/sda1 : SATA-SSD
- /dev/sda1 : /boot/efi
- /dev/sda2 : /boot
- /dev/sda3
- /dev/sdb : SATA-HDD
で、よくわからないデバイスが、
- /dev/loop0
- /dev/loop1
- /dev/loop2
- /dev/loop3
- /dev/loop4
- /dev/mapper/ubuntu–vg-ubuntu–lv
です。/dev/loop*はLinuxシステムで使っているものなので気にしなくてよいです。
LVMではないボリューム
普通のディスクシステムです。物理ディスクの上にパーティションを載せてマウントするもので単純です。
とりあえず、昔ながらのツール、GPartedをインストール(sudo apt install -y gparted)して物理ディスクの/dev/sdbをいじってみます。
ファイルシステムがない、の横に(!)でパーティションテーブルもないと言われています。「Device」→「Create Partition Table」でGPTを作成しました。
次に、パーティションを作成します。
- btrfs
exfat- ext2
- ext3
- ext4
f2fs- fat16
- fat32
hfshfs+jfs- linux-swap
- lvm2 pv
- minix
- nilfs2
- ntfs
reiser4reiserfsudf- xfs
- cleared
- unformatted
いくつかグレーアウトされていますが、今選ぶならfat32(容量がすくないとき)、ext4(Windowsに接続しない時)、ntfs(Windowsから直接読ませるとき)、xfs(NASとか用?)、あたりですが、lvm2 pvというのもここに出てきます。
ext4でパーティションを作り、適応すると使えるようになります。
マウント
パーティションを作っただけでは使えるようになりません。ファイルシステムのどこかに関レンズける「マウント」が必要です。
Ubuntuでは、「gnome-disks」ツールで簡単にできそうです。パーティションの作成もこれでできました。
ボリュームの画面で、再生マークっぽいものをクリックするだけでマウントできました。隣のボタンをクリックしてEdit Mount Optionsをいじるとマウントポイントだったり起動時オートマウントを設定できます。
LVM?
対して、LVMではGpartedもGnome Disksも微妙に対応しているだけでいろいろ触ることができません。対応GUIツールは
- KVPM
- system-config-lvm
- LVM GUI Manager
などがありますが、いずれも標準リポジトリからダウンロードできるものではないようです。
gnome-disksでは、状態くらいはわかるようになっていて、
- sdaの3番目、/dev/sda3がLVM2 PV(Physical Volume)として497GB
- 100GBのBlock Deviceがあり、/dev/ubuntu-vg/ubuntu-lvでext4
ということだけわかります。/dev/sda3と/dev/ubuntu-vg/ubuntu-lvがつながっていることは表示出来ていません。
普通のディスク管理CUIツールでも同じ情報しか出てきません。
LVMを見るためのCUIツール
LVMで管理されているボリュームを見るためのツールがたくさん用意されています。
pv/vg/lv-display
$ sudo pvdisplay --- Physical volume --- PV Name /dev/sda3 VG Name ubuntu-vg PV Size <462.71 GiB / not usable 3.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 118453 Free PE 92853 Allocated PE 25600 PV UUID DlUcyy-PJHP-ohdb-3b2e-YXcE-QVle-UtzaYf $ sudo vgdisplay --- Volume group --- VG Name ubuntu-vg System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 2 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 1 Act PV 1 VG Size <462.71 GiB PE Size 4.00 MiB Total PE 118453 Alloc PE / Size 25600 / 100.00 GiB Free PE / Size 92853 / <362.71 GiB VG UUID CK9YYR-ctGq-cRsd-TKID-c8I8-N1rY-GGsAEk $ sudo lvdisplay --- Logical volume --- LV Path /dev/ubuntu-vg/ubuntu-lv LV Name ubuntu-lv VG Name ubuntu-vg LV UUID 4bwQfJ-YMi9-WH5q-c5eK-oXQd-QcOX-ijV7xP LV Write Access read/write LV Creation host, time ubuntu-server, 2022-08-24 18:02:33 +0000 LV Status available # open 1 LV Size 100.00 GiB Current LE 25600 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
pv/vg/lv-s
$ sudo pvs PV VG Fmt Attr PSize PFree /dev/sda3 ubuntu-vg lvm2 a-- <462.71g <362.71g $ sudo vgs VG #PV #LV #SN Attr VSize VFree ubuntu-vg 1 1 0 wz--n- <462.71g <362.71g $ sudo lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert ubuntu-lv ubuntu-vg -wi-ao---- 100.00g
pv/vg/lv-scan
$ sudo pvscan PV /dev/sda3 VG ubuntu-vg lvm2 [<462.71 GiB / <362.71 GiB free] Total: 1 [<462.71 GiB] / in use: 1 [<462.71 GiB] / in no VG: 0 [0 ] $ sudo vgscan Found volume group "ubuntu-vg" using metadata type lvm2 $ sudo lvscan ACTIVE '/dev/ubuntu-vg/ubuntu-lv' [100.00 GiB] inherit
lvm-diskscan/sadc/sar
$ sudo lvmdiskscan /dev/loop0 [ 61.96 MiB] /dev/loop1 [ <61.96 MiB] /dev/sda1 [ <1.05 GiB] /dev/loop2 [ <79.95 MiB] /dev/sda2 [ 2.00 GiB] /dev/loop3 [ 102.98 MiB] /dev/sda3 [ <462.71 GiB] LVM physical volume /dev/loop4 [ 46.96 MiB] 0 disks 7 partitions 0 LVM physical volume whole disks 1 LVM physical volume $ sudo lvmsadc There's no 'lvmsadc' command in LVM2. Please use the superior 'dmstats' facilities instead. $ sudo lvmsar There's no 'lvmsar' command in LVM2. Please use the superior 'dmstats' facilities instead.
LVMの構造
解説ページに書いてあるそのままではありますが、自分のマシンを観察するとやはり理解が深まります。
- パーティションにPV(Physical Volume)があって
- PV1つ以上(?)でVG(Volume Group)が作られ
- VG上にLV(Logical Volume)が載っていて
- LVは何かのファイルシステム(ext4など)でフォーマットされていて
- 多分どこかにマウントされている(これはLVM外のディスク管理ツールで確認)
という感じです。
LVMのメリット
LVは物理ディスク上のパーティションと同じく、サイズがVG全部でなくても良く(オーバーすることもあり注意)、あとから拡張できる(容量が残っていれば)し、VGに新しいPVを足せば容量不足も解消できる(vgextend)ところが便利ですね。物理ディスクの容量よりも大きなボリュームを作れるのが良い点です。
また、SSDでキャッシュさせるようなこともできるようです。
LVMのデメリット
複雑でわかりにくい点が辛いです。標準で使われているのに、GUIツールが標準にないあたりがとてもダメですね。
LVMを使ってRAIDを組んだり、LVMにもミラーリングがあったりするようです。
実際にサーバを構築する際、LVM はあまり利用する機会がないかもしれません。例えば NEC だと LVM は非推奨とまではいかないものの、推奨はされていません。
OS をインストールするディスクのパーティションタイプは[標準パーティション]を推奨します。ソフトウェア RAID や LVM は高度なストレージ機能を提供しますが、管理手順や障害復旧手順が複雑になりますので、必要な場合にだけ使用することを推奨します。
RedHat Enterprise Linux 7 Server のデフォルトファイルシステムは xfs ですが、動作実績の豊富な ext4 を使用されることを推奨します。
NEC Express5800/R110j-1 インストレーションガイド
LVM は利用しない方が「無難」です。
Ubuntu Server 20.04でも22.04でも何も設定しなければLVMになってしまったので、うちはLVMのままですね・・・。ミラーリング、といってRAID1のような機能を持たせることもできる、のですが解説も多くなく実際使えるかというと微妙で特に復旧ができない気がします。
LVMの操作いろいろ
LVを拡張する
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
これで最大サイズまで広げられるようです。ただ、SSDも100%近くまで使ってしまうと一気に遅くなる場合もあるようなので、100%でなくてもいいかもしれません。昔のSSDは使っていない領域は書き込みされなかったこともあるようですが、今のものは全体を平均的に使うように(寿命的に)コントローラーが管理しているようなので大丈夫のはずです。
vgextend:新しいディスクを追加
VG(ボリュームグループ)に新しいPV(物理ボリューム)を足して全体の容量拡張をできます。ルートのファイルシステムをいくらでも拡張できるようになるのは便利ですね。
vgextend vg0 /dev/sdb1
pvmove + vgreduce:ディスクを減らす
コマンドにvgreduceというVG(ボリュームグループ)からPV(物理ボリューム)を除くものがありますが、vgreduceをいきなり使ってはいけません。取り除きたい物理ボリューム上にあるデータを動かす必要があります。
確かに理にかなってはいるのですが、このあたりを自動でやってくれないあたりが間違えて大変なことになりそうですね。
#使われている容量を確認 $ pvs -o+pv_used PV VG Fmt Attr PSize PFree Used /dev/sda1 myvg lvm2 a- 17.15G 12.15G 5.00G /dev/sdb1 myvg lvm2 a- 17.15G 12.15G 5.00G /dev/sdc1 myvg lvm2 a- 17.15G 12.15G 5.00G /dev/sdd1 myvg lvm2 a- 17.15G 2.15G 15.00G #/dev/sdb1を除去したいのでデータ移行 $ pvmove /dev/sdb1 /dev/sdb1: Moved: 2.0% ... /dev/sdb1: Moved: 79.2% ... /dev/sdb1: Moved: 100.0% #/dev/sdb1が使われなくなったのを確認 $ pvs -o+pv_used PV VG Fmt Attr PSize PFree Used /dev/sda1 myvg lvm2 a- 17.15G 7.15G 10.00G /dev/sdb1 myvg lvm2 a- 17.15G 17.15G 0 /dev/sdc1 myvg lvm2 a- 17.15G 12.15G 5.00G /dev/sdd1 myvg lvm2 a- 17.15G 2.15G 15.00G #/dev/sdb1を除去 $ vgreduce myvg /dev/sdb1 Removed "/dev/sdb1" from volume group "myvg" #確認 $ pvs PV VG Fmt Attr PSize PFree /dev/sda1 myvg lvm2 a- 17.15G 7.15G /dev/sdb1 lvm2 -- 17.15G 17.15G /dev/sdc1 myvg lvm2 a- 17.15G 12.15G /dev/sdd1 myvg lvm2 a- 17.15G 2.15G
これは、いったんpvmoveした後に書き込みがされないように保証するコマンドではなさそうな予感がするので、自分以外のユーザーがアクセスしている可能性があるVG、システムが何か動作していて書き込みされている可能性があるVG、でできるのだろうかという疑問がでますが、実際データがあるかどうかではなくて割り当てられているかどうかのアロケーションの話だと思うので、バックグラウンドでpvmoveが走っているときにlvextendとかやらなければ(できるかは不明)大丈夫なのではないかと思います。
トラブルもいろいろ出ることがあるようです。
ちょっと怖いです。
ディスカッション
コメント一覧
まだ、コメントがありません