ディスクを買ってきたらどうするかの話。
Ubuntuのマシンを作った後になって「もっとディスク欲しいな〜」ということはままあるかと思います。
ここで Windowsなら、買ってきたディスクを物理的に繋いでやれば勝手にドライブが増えてすぐに使えるようになるんですが、Linuxではそうはいきません。
ここでは Linuxで物理ディスクの追加後にやる作業をやってみます。
環境は VMware Workstation Player(長いので以降は VMwareと書きます)で作った仮想マシンにインストールした Ubuntu Server 22.04です。
どこかでハードディスクを買ってきたことを模して、VMwareの仮想ハードディスクを追加します。
仮想ハードディスクと言っても、Linux OSから見ると物理ディスクが増設されたのと同じなので参考にしてください。
この時代にはもう MBR(32bitの時代のディスクの管理方法で最大サイズが 2TBまで)でもないと思いますので、GPT(新しい規格)前提で進めます。
ではでは。
Ubuntu Serverのインストールについては、
「Ubuntu Linux Serverをインストール」と
「Ubuntu Serverの初期設定」の手順で作ったものを対象にしています。
Ubuntu Serverにはインストール時に 20GBの仮想ハードディスクを 1つ与えていますので、ハードディスク増設前に現在のディスクの状態を dfコマンド(report file system disk space usage)で見てみましょう。
subro@UbuntuServer2204:~$ df
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 199000 1172 197828 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 10218772 5349248 4328852 56% /
tmpfs 994988 0 994988 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
/dev/sda2 1790136 128160 1552716 8% /boot
tmpfs 198996 4 198992 1% /run/user/1000
ピンク色のところが、ハードディスクが割り当てられている箇所になります。
ハードディスクを増設するため Ubuntu Serverをシャットダウンします。
subro@UbuntuServer2204:~$ sudo poweroff
シャットダウンが済んだら、VMware Workstation Playerでの作業に移ります。
メニューで Ubuntu Serverの仮想マシンの上で右クリックするとメニューが出ますので、[設定]を選択します。
下の方にある、追加を押します。
[ハードディスク]を選択して次へを押します。
[SCSI]を選択して次へを押します。
[仮想ディスクの新規作成]を選択して次へを押します。
[ディスク最大サイズ]を入力し、[仮想ディスクを単一ファイルとして格納]を選択して次へを押します。
完了を押します。
5GBの新規仮想ディスクができました。
Ubuntu Serverを立ち上げて下さい。
lsblkコマンド(list block devices)で新しいディスクを OSが認識していることを確認します。
subro@UbuntuServer2204:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 62M 1 loop /snap/core20/1581
loop1 7:1 0 79.9M 1 loop /snap/lxd/22923
loop2 7:2 0 44.7M 1 loop /snap/snapd/15534
loop3 7:3 0 61.9M 1 loop /snap/core20/1518
loop4 7:4 0 47M 1 loop /snap/snapd/16292
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1.8G 0 part /boot
└─sda3 8:3 0 18.2G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 10G 0 lvm /
sdb 8:16 0 5G 0 disk
sr0 11:0 1 1024M 0 rom
[sda] が最初に着いていた 20GBのハードディスクで、
[sdb] という 2つ目のハードディスクが認識されています。
でもファイルシステムとして使えるようにはなっていません。
ここから論理ボリュームというものを作っていきますが、論理ボリュームって何でしょうか。
昔の UNIXの世界ではディスクの中の領域を直接ファイルシステムにマウントしていたのですが、物理ディスクのサイズよりより大きな領域が欲しいとか、RAIDを組みたいとかそういう要求が出てきました。
それに応じるため、OSからディスクへのアクセスの間にソフトウェアを噛ませて、OSからは 1つのディスクに見えているけど実体は複数のディスクから構成されている、そういう仕組みが作られました。
ディスクやその中に作られた領域を物理ボリュームと呼ぶのに対して、ソフトを介して「OSから 1つのディスクに見える」のが論理ボリュームです。
例えば小さなディスク(512GB)を 2つ使って大きなディスク(1TB)に見せる場合の構成はこんな感じです。
色の着いているところが間に噛んでいるソフトウェアの世界で、以下のような考え方です。
PV | 物理ボリュームと 1:1 で紐付いている |
VG | 複数の PVを 1つのディスクユニットとしてまとめたもの |
LV | VGの中で切り分けられた領域(絵では切り分けてないけど) |
このように論理ボリュームという観念を間に挟むことによって、ディスクの本数やサイズなどに関係なく柔軟な構成を取ることができます。
では、上の絵の左の方から右の方へと作業をしていきます。
ここでは1つしかディスクを足していませんので絵とはちょっと違いますが、やることは同じです。
1.PV作成
Physical Volume(PV)を作ります。
作るというより、紐付け・名付け、そんな感じの作業です。
新規ディスクを領域に分割して、それぞれ別の PVにすることもできるのですが、5GBしかありませんし、1台 = 1PV で使うことが現実的にだと思いますので、ここでは分割はしないで 5GBを全部使います。
([sda] は分割されていますね。)
pvcreateコマンド(Initialize physical volume(s) for use by LVM)を使います。
subro@UbuntuServer2204:~$ sudo pvcreate -v /dev/sdb
Wiping signatures on new PV /dev/sdb.
Set up physical volume for "/dev/sdb" with 10485760 available sectors.
Zeroing start of device /dev/sdb.
Writing physical volume data to disk "/dev/sdb".
Physical volume "/dev/sdb" successfully created.
新しい PVが出来ました。
PVの情報を得てみましょう。
pvdisplayコマンド(Display various attributes of physical volume(s))を使います
subro@UbuntuServer2204:~$ sudo pvdisplay
--- Physical volume ---
PV Name /dev/sda3
VG Name ubuntu-vg
PV Size <18.23 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 4665
Free PE 2105
Allocated PE 2560
PV UUID iB5GZf-Oam8-MJX9-Nx3z-sLrd-3vm0-ZzXnlZ
"/dev/sdb" is a new physical volume of "5.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size <5.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID k6Q7mC-sBKo-ROPb-OZtX-g7jX-mH6j-hslUKK
下の段が新しい PVで、[/dev/sdb] という名前になりました。
上手くできているようです。
2.VG作成
Volume Group(VG)を [newvolume] という名前で作ります。
vgcreateコマンド(Create a volume group)を使います。
subro@UbuntuServer2204:~$ sudo vgcreate -v newvolume /dev/sdb
Wiping signatures on new PV /dev/sdb.
Adding physical volume '/dev/sdb' to volume group 'newvolume'
Archiving volume group "newvolume" metadata (seqno 0).
Creating volume group backup "/etc/lvm/backup/newvolume" (seqno 1).
Volume group "newvolume" successfully created
[newvolume]VGが出来ました。
VGの情報を得てみましょう。
vgdisplayコマンド(Display volume group information)を使います。
subro@UbuntuServer2204:~$ sudo vgdisplay
--- Volume group ---
VG Name newvolume
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <5.00 GiB
PE Size 4.00 MiB
Total PE 1279
Alloc PE / Size 0 / 0
Free PE / Size 1279 / <5.00 GiB
VG UUID H639pN-6LTS-faFl-TuST-Yh2Z-137r-wb8Fvw
--- 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 18.22 GiB
PE Size 4.00 MiB
Total PE 4665
Alloc PE / Size 2560 / 10.00 GiB
Free PE / Size 2105 / 8.22 GiB
VG UUID 12lIiz-cyjC-cyAF-32ok-sfsr-29gH-TlOR3h
上の段が [newvolume]VGです。
上手くできているようです。
3.LV作成
Logical Volume(LV)を [data-volume1] という名前で作ります。
lvcreateコマンド(Create a logical volume)を使います。
[-l 100%FREE] というオプションは、VGの領域全部を割り当てるという意味です。
subro@UbuntuServer2204:~$ sudo lvcreate -v -n data-volume1 -l 100%FREE newvolume
Converted 100% of FREE (1279) extents into 1279 (with mimages 1 and stripes 1 for segtype striped).
Archiving volume group "newvolume" metadata (seqno 1).
Creating logical volume data-volume1
Creating volume group backup "/etc/lvm/backup/newvolume" (seqno 2).
Activating logical volume newvolume/data-volume1.
activation/volume_list configuration setting not defined: Checking only host tags for newvolume/data-volume1.
Creating newvolume-data--volume1
Loading table for newvolume-data--volume1 (253:1).
Resuming newvolume-data--volume1 (253:1).
Wiping known signatures on logical volume newvolume/data-volume1.
Initializing 4.00 KiB of logical volume newvolume/data-volume1 with value 0.
Logical volume "data-volume1" created.
[data-volume1]LVができました。
LVの情報を得てみましょう。
lvdisplayコマンド(Display information about a logical volume)を使います。
subro@UbuntuServer2204:~$ sudo lvdisplay
--- Logical volume ---
LV Path /dev/newvolume/data-volume1
LV Name data-volume1
VG Name newvolume
LV UUID ywYhFi-N1pi-iP00-KiWw-veHK-QeNh-NIhgr1
LV Write Access read/write
LV Creation host, time UbuntuServer2204-2, 2022-07-25 17:16:28 +0900
LV Status available
# open 0
LV Size 5.00 GiB
Current LE 1279
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
--- Logical volume ---
LV Path /dev/ubuntu-vg/ubuntu-lv
LV Name ubuntu-lv
VG Name ubuntu-vg
LV UUID UP0KZ9-l3rl-sdM0-R8j0-5Yc9-hVfA-82VxTq
LV Write Access read/write
LV Creation host, time ubuntu-server, 2022-07-05 11:41:40 +0900
LV Status available
# open 1
LV Size 10.00 GiB
Current LE 2560
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
上の段が新しい LVです。
上手くできいるようです。
4.LVをフォーマットする
新しい LVをフォーマットして、他の LVと同じ ext4形式のファイルシステムを作成します。
mkfs.ext4コマンドを使っているようでいて、これは [/usr/sbin/mke2fs]ファイルへのシンボリックリンクです。
mkfs.ext4コマンドを使うと、ext4形式を指定した形で mke2fsコマンド(create an ext2/ext3/ext4 file system)が実行されます。
subro@UbuntuServer2204:~$ sudo mkfs.ext4 /dev/newvolume/data-volume1
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 1309696 4k blocks and 327680 inodes
Filesystem UUID: 45be26fe-7342-4a4d-957e-718e9446069e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
フォーマットできました。
5.UUIDを使って LVをファイルシステムにマウント
最後はマウントなんですが、ここで UUIDについて一つ。
UUIDとは何かというと Universally Unique IDentifier のことで、各ディスクやその中にある領域に個々に付けられた一意のIDです。
こんな感じで。
これがあると何が良いか、いや、無いと何が困るか。
普段はこれら3台のディスクが動いているとします。
真ん中のディスクがいらなくなったので、外したとします。
こうなるのかな?
と思いきや、
こうなってしまったりするので、問題があります。
物理ディスクが繋がれたインターフェイスの若い順に a/b/c とか自動で割り振ってしまうので、このようにディスクを着けたり外したりする時に思わぬ動作をしてしまうのでした。
ディスクの着け外しが簡単なクラウド環境ではこの問題が顕著に現れるように思います。
そこで、個々の領域を特定できる IDを使ってファイルシステムへマウントすることにより、この問題を回避できるという寸法です。
UUIDの利便性は分かっていただけたでしょうか。
[data-volume1]LVに付けられた UUIDを確認しましょう。
subro@UbuntuServer2204:~$ blkid
/dev/mapper/ubuntu--vg-ubuntu--lv: UUID="a341b06e-2ffa-42a7-8862-2e3cddefb615" BLOCK_SIZE="4096" TYPE="ext4"
/dev/sda2: UUID="bc1cfd06-4015-4d64-a94d-a5deb53905bc" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="b3ce2379-75da-41cd-98dd-b907f52ac316"
/dev/sda3: UUID="iB5GZf-Oam8-MJX9-Nx3z-sLrd-3vm0-ZzXnlZ" TYPE="LVM2_member" PARTUUID="16a6688c-2b4f-40d4-824e-b4622863a8a9"
/dev/loop1: TYPE="squashfs"
/dev/mapper/newvolume-data--volume1: UUID="45be26fe-7342-4a4d-957e-718e9446069e" BLOCK_SIZE="4096" TYPE="ext4"
/dev/sdb: UUID="k6Q7mC-sBKo-ROPb-OZtX-g7jX-mH6j-hslUKK" TYPE="LVM2_member"
/dev/loop4: TYPE="squashfs"
/dev/loop2: TYPE="squashfs"
/dev/loop0: TYPE="squashfs"
/dev/loop3: TYPE="squashfs"
[ext4]形式でフォーマットされたデバイスファイル [/dev/mapper/newvolume-data--volume1](デバイスマッパーで作られたもの)が対象で、ピンクの箇所が UUIDになります。
OS起動時にマウントされるよう [/etc/fstab]ファイルを編集し、最後の行を足しています。
subro@UbuntuServer2204:~$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-12lIizcyjCcyAF32oksfsr29gHTlOR3hUP0KZ9l3rlsdM0R8j05Yc9hVfA82VxTq / ext4 defaults 0 1
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/bc1cfd06-4015-4d64-a94d-a5deb53905bc /boot ext4 defaults 0 1
/swap.img none swap sw 0 0
UUID=45be26fe-7342-4a4d-957e-718e9446069e /data1 ext4 defaults 0 1
マウントポイントになるディレクトリを作ります。
subro@UbuntuServer2204:~$ sudo mkdir /data1
マウントします。
mountコマンドの [-a]オプションで、[/etc/fstab]ファイルに書いた内容の通りにマウントしてくれます。
subro@UbuntuServer2204:~$ sudo mount -a
上手く [/data]ディレクトリにマウントできたか、ファイルシステムとして使えるか確認します。
subro@UbuntuServer2204:~$ df
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 199000 1188 197812 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 10218772 5832952 3845148 61% /
tmpfs 994988 0 994988 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
/dev/sda2 1790136 249060 1431816 15% /boot
tmpfs 198996 4 198992 1% /run/user/1000
/dev/mapper/newvolume-data--volume1 5070496 24 4792152 1% /data1
subro@UbuntuServer2204:~$ chmod 755 /data1
subro@UbuntuServer2204:~$ ls -ld /data1
drwxr-xr-x 3 root root 4096 7月 25 17:23 /data1
subro@UbuntuServer2204:~$ cd /data1
subro@UbuntuServer2204:/data1$ sudo touch aaa
subro@UbuntuServer2204:/data1$ ls -l
合計 16
-rw-r--r-- 1 root root 0 7月 25 18:02 aaa
drwx------ 2 root root 16384 7月 25 17:23 lost+found
使えるようになりました。
UUID周りはもうちょっと突っ込みたいところですが、一応これで大丈夫なはずです。
==========
ディスクを使うのに必ずしも論理ボリュームを使わないといけないわけではないのですが、領域拡張や再利用の点で非常に柔軟に対応ができますので、論理ボリュームは使っておいた方が無難だと思います。
Windows OSのように、Linuxでも Desktop版の OSならば GUIのボリュームマネージャがあるのですが、サーバー管理の観点からはコマンドで一通りできるようになっておくのが良いと思います。
特にクラウド環境ですとディスク操作が多くなると思いますので、慣れておくと良いですね。