Partitioning Storage Volumnes

Linux filesystem 1/N

公開日: 2021-12-29
更新日: 2023-09-28

  Table of Contents

なぜパーティショニングは大事なのか?

  • ストレージを利用するまでの流れ
  • パーティショニングによって, システム全体が堅牢に機能する
  • そもそもパーティション設定は多くの場合不可逆なので慎重に実施する必要がある

という3つの理由が挙げられます

ストレージを利用するまでの流れ

普段はあまり意識することないですが, 購入したHDD, SSD, Flash DriveをLinuxから使えるようにするには

  • パーティションの作成
  • フォーマット
  • マウント

という手順を踏む必要があります. ストレージを利用することなくコンピューターを利用する方はあまりいないので, この意味でパーティショニングを理解することは重要です.

パーティショニングによって, システム全体が堅牢に機能する

また, 一つの物理ディスクをそのまま1つとして使うのではなく, パーティションに分けることで, 効率的なバックアップや, ファイルシステム単位での障害修復が可能となります. 例として,

  • システム領域とデータ領域を分けておけば, システム領域に何かのトラブルが起こっても, データを置いておく領域が別のパーティションになっていれば, データをトラブルから守ることもできる
  • 再フォーマットが必要になった際, トラブルが起きたパーティションのみをフォーマットすることができ, 他のパーティションをフォーマットせずに済む

といったことが挙げられます.

lsblkコマンド: ブロックデバイスの表示

パーティションを実行するにあたって, まずブロックデバイスを確認する必要があります. そこで利用するコマンドがlsblkコマンドです.

Def: lsblk command

  • lsblk(=list block devices)は, 現在利用できるブロックデバイスを一覧表示するコマンド.
  • 各ブロックデバイスをツリー状に表示する

各ブロックデバイスをツリー状に表示するのでパーティションの状態を視覚的に把握でき, ストレージの構成やデバイス番号を確認したいときに役立ちます.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
% lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
...()
sda           8:0    1  57.3G  0 disk 
├─sda1        8:1    1   4.6G  0 part /media/hogehoge/Ubuntu 20.04.2 LTS amd64
├─sda2        8:2    1   4.9M  0 part 
├─sda3        8:3    1   300K  0 part 
└─sda4        8:4    1  52.7G  0 part /media/hogehoge/writable
nvme0n1     259:0    0 931.5G  0 disk 
├─nvme0n1p1 259:1    0   512M  0 part /boot/efi
└─nvme0n1p2 259:2    0   931G  0 part /var/snap/firefox/common/host-hunspell
                                      /
nvme1n1     259:3    0 931.5G  0 disk 
├─nvme1n1p1 259:4    0   100M  0 part 
├─nvme1n1p2 259:5    0    16M  0 part 
├─nvme1n1p3 259:6    0 930.7G  0 part 
└─nvme1n1p4 259:7    0   674M  0 part 
項目 意味
NAME ブロックデバイス名
MAJ:MIN メジャー番号とマイナー番号
RM リムーバブルデバイス(1=リムーバブル)
SIZE サイズ(-bオプションでバイト数の表示になる)
RO リードオンリーデバイス(1=リードオンリー)
TYPE ブロックデバイスの種類
MOUNTPOINT マウントポイント

デバイス命名規則(device naming scheme)

In Linux, everything is a file”」という言葉があるように, 起動中にハードディスクを新しく検出すると, /devディレクトリにデバイスファイルとして自動的に追加されます. 上の例ではsdanvme0n1といったデバイスファイルが確認できます. これらはLinuxでよく見られるデバイスファイルネームで以下のような意味があります:

デバイスファイル 説明
/dev/sda 1番目のSCSI/SATA/USBに接続したデバイス
/dev/sdb 2番目のSCSI/SATA/USBに接続したデバイス
/dev/sdc 3番目のSCSI/SATA/USBに接続したデバイス
/dev/sdd 4番目のSCSI/SATA/USBに接続したデバイス
/dev/sr0 1番目のDVD/BDドライブ
/dev/sr1 2番目のDVD/BDドライブ
/dev/nvme0n1 1番目のNVM Expressで接続されたデバイス
/dev/nvme1n1 2番目のNVM Expressで接続されたデバイス

Def: デバイスファイル

デバイスファイルとは, 各種ハードウェアの入出力を扱うための特殊ファイルのこと.

sdaのツリーに着目すると, 複数のデバイスファイルが以下のように割り当てられていることが確認できます.

1
2
3
4
5
% ls -l /dev/sda[0-9]
brw-rw---- 1 root disk 8, 1 Dec 23 01:45 /dev/sda1
brw-rw---- 1 root disk 8, 2 Dec 23 01:45 /dev/sda2
brw-rw---- 1 root disk 8, 3 Dec 23 01:45 /dev/sda3
brw-rw---- 1 root disk 8, 4 Dec 23 01:45 /dev/sda4

これらは個別のパーティションを表しています. bから始まるファイルとなっていますが, これはブロック型デバイスファイル を表しています. これはハードディスクのように固定長のデータ(ブロック)単位に入出力するタイプのデバイスを表しています.

一方, シリアル回線や端末のようにデータを1 byteずつ入出力するタイプのデバイスは, cというキャラクター型デバイスファイルとして表されます.

udev: デバイスファイルを動的に作成,削除する仕組み

Def: udev

udevはデバイスにアクセスするための/dev以下のデバイスファイルを動的に作成, 削除する仕組みを提供するツールのこと.

  • libudev: ライブラリ
  • udevd: デーモン
  • udevadm: udevイベントのモニタやカーネルへのudevイベントのリクエストなどの機能を持つ管理コマンド

といった要素によって構成されている.

sequenceDiagram
    participant A as Kernel
    participant B as /sys
    participant C as udevd
    participant D as /dev
    
    A ->> A: デバイスの接続切断を感知
    A ->> B: /sysの以下のデバイス情報に反映
    A ->> C: ueventをudevdデーモンへ送信
    B ->> C: /sysの下のデバイス<br>情報取得
    C ->> D: .rulesファイルに従って<br>デバイスファイルの作成削除

デバイスが接続されるとudevdはカーネルからudevイベントを受取, .rulesファイルに記載されたルールに 従って, デバイスファイルを動的に作成削除します. .rulesファイルは/etc/udev/rules.d/lib/udev/rules.d で確認することができます.

udevdデーモンはSysV init環境では/etc/rc.sysinitから, systemd環境ではsystemd-udevd.serviceから起動されます. systemctlコマンドで起動状態を以下のように確認することができます.

1
2
3
% systemctl --type=service | grep "udev"
  systemd-udev-trigger.service                          loaded active exited  Coldplug All udev Devices
  systemd-udevd.service                                 loaded active running Rule-based Manager for Device Events and Files

fdiskコマンド: パーティションの確認/作成

Def: fdiskコマンド

fdiskコマンドはパーティションの作成や削除など対話式に実行するコマンドのこと.

1
fdisk [option] device-name

元来はMBR形式のパーティションニングのみしか対応していなかったので(現在は対応済み), 基本的にはgdiskコマンドを利用することが推奨とされている.

fdiskコマンドを実行するためには管理者権限が多くの場合で必要です. 例として, USB flash driveを対象に実行してみます.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
% sudo fdisk -l /dev/sda
Disk /dev/sda: 57.28 GiB, Disk /dev/sda: 57.28 GiB, 61505273856 bytes, 120127488 sectors
Disk model: Ultra USB Type C
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: A0891D7E-B930-4513-94D9-F629DBD637B2

Device       Start       End   Sectors  Size Type
/dev/sda1       64   9613459   9613396  4.6G Microsoft basic data
/dev/sda2  9613460   9623527     10068  4.9M EFI System
/dev/sda3  9623528   9624127       600  300K Microsoft basic data
/dev/sda4  9625600 120127424 110501825 52.7G Linux filesystem
61505273856 bytes, 120127488 sectors
Disk model: Ultra USB Type C
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: A0891D7E-B930-4513-94D9-F629DBD637B2

Device       Start       End   Sectors  Size Type
/dev/sda1       64   9613459   9613396  4.6G Microsoft basic data
/dev/sda2  9613460   9623527     10068  4.9M EFI System
/dev/sda3  9623528   9624127       600  300K Microsoft basic data
/dev/sda4  9625600 120127424 110501825 52.7G Linux filesystem

上記のように-lオプションを利用することで指定したデバイスのパーティションテーブルを一覧表示することができます.

Column: パーティション

LinuxではHDDなどの記憶装置を論理的に分割して利用し, その論理的に分割された領域をパーティションと呼びます. パーティションの位置や長さなどの管理情報(パーティションテーブル)を、パーティションとは別の領域に記録しています.

パーティションテーブルはハードディスクの先頭に位置に保存されており, bootloaderやkernelはこの先頭領域を 読み取ることでハードディスクのパーティションを認識しています.

パーティショニングの形式:MBR形式とGPT形式

パーティションを管理する方式は大きく2つあり

  • MBR: Master Boot Record
  • GPT: Globally Unique IDentifier Partition Table

MBRは古くから使われており, 旧式のハードウェアやOSにも対応していますが, パーティションの作成数やサイズの制限があるので あまり最近では使用されません.

MBR形式パーティション

パーティションテーブルがMBR形式の場合, 以下の三種類のパーティションを区別して管理してます:

種類 説明
基本パーティション 1代のディスクに必ず1つ以上存在するパーティション
1つの物理ディスクには最大で4つの基本パーティションに分割することが可能
拡張パーティション 基本パーティションのうち, 1つだけを拡張パーティションとして使用することが可能
直接ファイルシステムを作成するのではなく, 論理パーティションを格納するために使用される
論理パーティション 拡張パーティション内に作成されたパーティション. ハードディスクのタイプによっても異なるが, 基本パーティション番号は5以上が割り当てられる

またMBR形式の特徴として,

  • 基本パーティションの開始と終了位置をCylinder/HEad/Sectorで管理
  • MBRでは2TB(2^32×512バイト)を超えるパーティションは管理できない

が挙げられる.

1
2
3
4
5
6
7
8
9
10
11
## パーティショニング
sda
├── sda1 # 基本パーティション
├── sda2 # 基本パーティション
├── sda3 # 基本パーティション
└── sda4 # 拡張パーティション
    ├── sda5 # 論理パーティション
    ├── sda6 # 論理パーティション
    ├── sda7 # 論理パーティション
    ├── sda8 # 論理パーティション
    └── sda9 # 論理パーティション

GPT形式パーティション

  • MBR形式と異なり, 基本/論理パーティションの区別なく, デフォルトで最大128個のパーティションが構成できる
  • 基本的には最大8ZiBまでの領域を定義&管理できる
  • GPT形式はEFI規格の中の1つの機能のため, UEFIを搭載したコンピューターが必要
  • MBRではCHSによって位置を指定していた一方, GPTはLogical Block Addressing (LBA) を使ってディスク内の位置を示す
  • 冗長性の確保の観点(バックアップ用)からGPTヘッダーとパーティションテーブルはディスクの2~3番目のセクタと最後部の両方に書き込まれている

なお, GPT形式は, GPTヘッダーにはディスクのGUID(Globally Unique Identifider)が格納されており, 各Entryにはパーティションタイプと, パーティションを識別するためのGUIDが格納されている形式になっています.

GPT形式とMBR形式の構成の違いを図示したものが以下となりまこのままではまだディスクはす:

umountコマンドによるパーティション書き換えの前準備

1
2
3
4
5
6
7
% lsblk /dev/sda
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    1 57.3G  0 disk 
├─sda1   8:1    1  4.6G  0 part /media/hoshinokirby/Ubuntu 20.04.2 LTS amd64
├─sda2   8:2    1  4.9M  0 part 
├─sda3   8:3    1  300K  0 part 
└─sda4   8:4    1 52.7G  0 part /media/hoshinokirby/writable

上記の状態で, fdiskコマンドを用いてパーティションを作成してみます.

1
2
3
4
5
6
7
8
9
10
11
12
13
% sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.

The device contains 'iso9660' signature and it will be removed by a write command. See fdisk(8) man page and --wipe option for more details.

Command (m for help): 

すると, mountしている状態だとThis disk is currently in use - repartitioning is probably a bad idea. と怒られるので, umountコマンドでunmountしておきます

1
2
3
4
5
6
7
8
9
% umount /dev/sda1
% umount /dev/sda4
% lsblk /dev/sda  
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    1 57.3G  0 disk 
├─sda1   8:1    1  4.6G  0 part 
├─sda2   8:2    1  4.9M  0 part 
├─sda3   8:3    1  300K  0 part 
└─sda4   8:4    1 52.7G  0 part 

すると, 以下のように怒られなくなります.

1
2
3
4
5
6
7
8
9
% sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

The device contains 'iso9660' signature and it will be removed by a write command. See fdisk(8) man page and --wipe option for more details.

Command (m for help): 

パーティションの作成

fdiskコマンドにて対話式にパーティションの操作をする場合, 次のコマンドを主に用います

コマンド 説明
d パーティションを削除する
F パーティションが割り当てられていない領域を表示する
g GPTテーブルの作成
p 現在のパーティションテーブルを表示
m ヘルプメニューの表示
n パーティションの作成
q 変更を保存せずに終了
w 変更を保存して終了

パーティションテーブルを表示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
% sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

The device contains 'iso9660' signature and it will be removed by a write command. See fdisk(8) man page and --wipe option for more details.

Command (m for help): p

Disk /dev/sda: 57.28 GiB, 61505273856 bytes, 120127488 sectors
Disk model: Ultra USB Type C
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: A0891D7E-B930-4513-94D9-F629DBD637B2

Device       Start       End   Sectors  Size Type
/dev/sda1       64   9613459   9613396  4.6G Microsoft basic data
/dev/sda2  9613460   9623527     10068  4.9M EFI System
/dev/sda3  9623528   9624127       600  300K Microsoft basic data
/dev/sda4  9625600 120127424 110501825 52.7G Linux filesystem

パーティションの新規作成

新規に空のGPT partition tableを作成したい場合は対話式の流れの中でgを入力します

1
2
3
4
5
6
7
8
9
10
sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

The device contains 'iso9660' signature and it will be removed by a write command. See fdisk(8) man page and --wipe option for more details.

Command (m for help): g
Created a new GPT disklabel (GUID: CD5ACE08-6954-254E-AACC-9207290B6C41).

パーティション割当されていない領域をFで確認してみます

1
2
3
4
5
6
7
Command (m for help): F
Unpartitioned space /dev/sda: 57.28 GiB, 61504208384 bytes, 120125407 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes

Start       End   Sectors  Size
 2048 120127454 120125407 57.3G

次にパーティションをnコマンドで作成します

1
2
3
4
5
6
Command (m for help): n
Partition number (1-128, default 1): 
First sector (2048-120127454, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-120127454, default 120127454): +10G

Created a new partition 1 of type 'Linux filesystem' and of size 10 GiB.

上の例では10Gでサイズを指定しましたが, デフォルトだとすべてのスペースを使用する形でpartitionが作成されます.

この編集結果を保存して終了するため, wコマンドを入力して作業を終了します.

1
2
3
4
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

ただし, フォーマッティング(=ファイルシステムの設定)を実行していないのでこのままではまだディスクは使用できません.

フォーマッティングについては, Ryo’s Tech Blog > ファイルシステムの作成で説明します.

Appendix: Flash Drive

Def: Flash Drive

Flash DriveはUSB flash driveやUSBスティックとして知られている, 小型携帯可能なストレージデバイスのこと.

  • データの保存
  • データトランスファー
  • Bootableドライブ

として利用されてたりします. Desktop版Linuxを利用している場合, 多くの場合flash driveを挿した瞬間に システムは自動的に検知して, フォルダの作成やデータの移行といった操作がGUIベースで可能となります.

References



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)