Ubuntuのファイルシステム・パーティション・LVM

≪≪この記事をすべて読むには約 35 分かかります≫≫

Ubuntuをいじっているのですが、前からなのかいつからなのか、意識しないでインストールするとLVMのボリュームにシステムインストールされています。

訳が分からないので、ちょっとずついじりながら取り扱いを書いていきます。

現在のディスク構成(Ubuntu Server 22.04 LTS上)

とりあえず現在の構成を表示してみます。物理デバイスは2つ、

  1. Samsung SSD 860(480GB):SSD
  2. 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

物理デバイスは

  1. /dev/sda1 : SATA-SSD
    1. /dev/sda1 : /boot/efi
    2. /dev/sda2 : /boot
    3. /dev/sda3
  2. /dev/sdb : SATA-HDD

で、よくわからないデバイスが、

  1. /dev/loop0
  2. /dev/loop1
  3. /dev/loop2
  4. /dev/loop3
  5. /dev/loop4
  6. /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
  • hfs
  • hfs+
  • jfs
  • linux-swap
  • lvm2 pv
  • minix
  • nilfs2
  • ntfs
  • reiser4
  • reiserfs
  • udf
  • 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の構造

解説ページに書いてあるそのままではありますが、自分のマシンを観察するとやはり理解が深まります。

  1. パーティションにPV(Physical Volume)があって
  2. PV1つ以上(?)でVG(Volume Group)が作られ
  3. VG上にLV(Logical Volume)が載っていて
  4. LVは何かのファイルシステム(ext4など)でフォーマットされていて
  5. 多分どこかにマウントされている(これは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とかやらなければ(できるかは不明)大丈夫なのではないかと思います。

トラブルもいろいろ出ることがあるようです。

ちょっと怖いです。

結論:LVMは止めよう