お金をかけずにサーバーの勉強をしよう

Ubuntuのディスク増設

2022年7月25日

メニューへ戻る

ディスクを買ってきたらどうするかの話。

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の仮想マシンの上で右クリックするとメニューが出ますので、[設定]を選択します。
VMwareディスク増設 1

下の方にある、追加を押します。
VMwareディスク増設 2

[ハードディスク]を選択して次へを押します。
VMwareディスク増設 3

[SCSI]を選択して次へを押します。
VMwareディスク増設 4

[仮想ディスクの新規作成]を選択して次へを押します。
VMwareディスク増設 5

[ディスク最大サイズ]を入力し、[仮想ディスクを単一ファイルとして格納]を選択して次へを押します。
VMwareディスク増設 6

完了を押します。
VMwareディスク増設 7

5GBの新規仮想ディスクができました。
VMwareディスク増設 8

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)に見せる場合の構成はこんな感じです。
論理ボリュームの説明図 1
色の着いているところが間に噛んでいるソフトウェアの世界で、以下のような考え方です。

PV物理ボリュームと 1:1 で紐付いている
VG複数の PVを 1つのディスクユニットとしてまとめたもの
LVVGの中で切り分けられた領域(絵では切り分けてないけど)

このように論理ボリュームという観念を間に挟むことによって、ディスクの本数やサイズなどに関係なく柔軟な構成を取ることができます。

では、上の絵の左の方から右の方へと作業をしていきます。

ここでは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です。

こんな感じで。
UUIDの説明図 1

これがあると何が良いか、いや、無いと何が困るか。

普段はこれら3台のディスクが動いているとします。
UUIDの説明図 2

真ん中のディスクがいらなくなったので、外したとします。
こうなるのかな?
UUIDの説明図 3
と思いきや、
こうなってしまったりするので、問題があります。
UUIDの説明図 4

物理ディスクが繋がれたインターフェイスの若い順に 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のボリュームマネージャがあるのですが、サーバー管理の観点からはコマンドで一通りできるようになっておくのが良いと思います。

特にクラウド環境ですとディスク操作が多くなると思いますので、慣れておくと良いですね。