Linux の /var/ を別の HDD にマウントする

# はじめに
今回は、/var/ に溜まっていくログデータを大量に保管すべく別途用意した HDD に入れるために、/var/ を HDD にマウントすることをします。
Linux の概念としては、HDD のパーティションを /var/ にマウントするという感じらしいです。
## 環境
- バージョン

```sh
# cat /etc/redhat-release
Rocky Linux release 8.4 (Green Obsidian)
```
- HDD: /dev/md0 という、RAID5 で組んだHDD 10TB x 4 （今回は RAID を組む手順は省略します）

# 手順
1. `rsync` コマンドで /var/ をマウントさせたい HDD にコピー

    ```sh
# rsync /var/ /dev/md0
    ```

2. `fdisk -l` コマンドで現在の HDD の状態を確認
    
    ```sh
# fdisk -l
    ディスク /dev/nvme0n1: 477 GiB, 512110190592 バイト, 1000215216 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
    ディスクラベルのタイプ: gpt
    ディスク識別子: CE5ADA77-77F5-4EF3-924B-62BB489EBD68
    
    デバイス       開始位置   終了位置    セクタ サイズ タイプ
    /dev/nvme0n1p1     2048    1230847   1228800   600M EFI システム
    /dev/nvme0n1p2  1230848    3327999   2097152     1G Linux ファイルシステム
    /dev/nvme0n1p3  3328000 1000214527 996886528 475.4G Linux LVM
    
    
    ディスク /dev/sdb: 10.9 TiB, 12000138625024 バイト, 23437770752 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
    I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
    ディスクラベルのタイプ: gpt
    ディスク識別子: 0F081832-B9E0-499B-84BE-8341616DD6E9
    
    デバイス   開始位置    終了位置      セクタ サイズ タイプ
    /dev/sdb1      2048 23437770718 23437768671  10.9T Linux RAID
    
    
    ディスク /dev/sda: 10.9 TiB, 12000138625024 バイト, 23437770752 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
    I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
    ディスクラベルのタイプ: gpt
    ディスク識別子: 0371E0CB-F98B-4839-806F-76AD153F4A89
    
    デバイス   開始位置    終了位置      セクタ サイズ タイプ
    /dev/sda1      2048 23437770718 23437768671  10.9T Linux RAID
    
    
    ディスク /dev/sdc: 10.9 TiB, 12000138625024 バイト, 23437770752 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
    I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
    ディスクラベルのタイプ: gpt
    ディスク識別子: 94BB586A-90F8-4966-8AF2-9ED3448AB777
    
    デバイス   開始位置    終了位置      セクタ サイズ タイプ
    /dev/sdc1      2048 23437770718 23437768671  10.9T Linux RAID
    
    
    
    
    ディスク /dev/mapper/rl-root: 70 GiB, 75161927680 バイト, 146800640 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
    
    
    ディスク /dev/mapper/rl-swap: 31.5 GiB, 33797701632 バイト, 66011136 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
    
    
    ディスク /dev/md0: 32.8 TiB, 36000005357568 バイト, 70312510464 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
    I/O サイズ (最小 / 推奨): 524288 バイト / 1572864 バイト
    ディスクラベルのタイプ: gpt
    ディスク識別子: 808C25E6-7243-4A14-9057-59E04C2EE959
    
    
    ディスク /dev/mapper/rl-home: 373.9 GiB, 401445224448 バイト, 784072704 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
    ````
   
    今回は /dev/md0 ディスクを /var にマウントさせます。また、今回は `ディスクラベルのタイプ: gpt`となっていまして、このままだとエラーが出てマウントできないので、この GPT フォーマットを削除するところから始めます（ディスクラベルのタイプがなければ、2. の手順は省略してください）



3. HDD の GPT フォーマットのパーティションの削除
    GPT で HDD をフォーマットしてしまっていたので、これを取り除きます。普通にやろうとするとこうなってしまいます。そこで、`fdisk`コマンドでパーティションを取り除きます。
    
    ```sh
    # mkfs -t xfs /dev/md0
    mkfs.xfs: /dev/md0 appears to contain a partition table (gpt).
    mkfs.xfs: Use the -f option to force overwrite.
    ```
   
    原因は HDD 内に GPT フォーマットのパーティションがあることでした。まず、
    
    ```sh
    # fdisk /dev/md0
    
    fdisk (util-linux 2.32.1) へようこそ。
    ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
    書き込みコマンドを使用する際は、注意して実行してください。
    
    
    コマンド (m でヘルプ): m
    
    ヘルプ:
    
      GPT
       M   保護/ハイブリッド MBR に入ります
    
      一般
       d   パーティションを削除します
       F   パーティションのない領域を一覧表示します
       l   既知のパーティションタイプを一覧表示します
       n   新しいパーティションを追加します
       p   パーティション情報を表示します
       t   パーティションタイプを変更します
       v   パーティション情報を検証します
       i   パーティションの情報を表示します
    
      その他
       m   このメニューを表示します
       x   特殊機能に移動します (熟練者向け機能)
    
      スクリプト
       I   ディスクのレイアウトを sfdisk 互換のスクリプトから読み込みます
       O   ディスクのレイアウトを sfdisk 互換のスクリプトに書き出します
    
      保存と終了
       w   パーティション情報をディスクに書き込んで終了します
       q   変更点を保存せずに終了します
    
      新しいラベルを作成します
       g   新しい (何もない) GPT パーティションテーブルを作成します
       G   新しい (何もない) SGI (IRIX) パーティションテーブルを作成します
       o   新しい (何もない) DOS パーティションテーブルを作成します
       s   新しい (何もない) Sun パーティションテーブルを作成します
    
    
    コマンド (m でヘルプ): d
    パーティション番号 (1,2, 既定値 2): 2
    
    パーティション 2 を削除しました。
    
    コマンド (m でヘルプ): w
    パーティション情報が変更されました。
    ioctl() を呼び出してパーティション情報を再読み込みします。
    ディスクを同期しています。
    
    # fdisk -l
    ディスク /dev/nvme0n1: 477 GiB, 512110190592 バイト, 1000215216 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
    ディスクラベルのタイプ: gpt
    ディスク識別子: CE5ADA77-77F5-4EF3-924B-62BB489EBD68
    
    デバイス       開始位置   終了位置    セクタ サイズ タイプ
    /dev/nvme0n1p1     2048    1230847   1228800   600M EFI システム
    /dev/nvme0n1p2  1230848    3327999   2097152     1G Linux ファイルシステム
    /dev/nvme0n1p3  3328000 1000214527 996886528 475.4G Linux LVM
    
    (中略)
    
    ディスク /dev/md0: 32.8 TiB, 36000005357568 バイト, 70312510464 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
    I/O サイズ (最小 / 推奨): 524288 バイト / 1572864 バイト
    ディスクラベルのタイプ: gpt
    ディスク識別子: 808C25E6-7243-4A14-9057-59E04C2EE959
    
    デバイス   開始位置    終了位置      セクタ サイズ タイプ
    /dev/md0p1     3072 70312507391 70312504320  32.8T Linux LVM
    
    
    ディスク /dev/mapper/rl-home: 373.9 GiB, 401445224448 バイト, 784072704 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
    # fdisk /dev/md0
    
    fdisk (util-linux 2.32.1) へようこそ。
    ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
    書き込みコマンドを使用する際は、注意して実行してください。
    
    
    コマンド (m でヘルプ): m
    
    ヘルプ:
    
      GPT
       M   保護/ハイブリッド MBR に入ります
    
      一般
       d   パーティションを削除します
       F   パーティションのない領域を一覧表示します
       l   既知のパーティションタイプを一覧表示します
       n   新しいパーティションを追加します
       p   パーティション情報を表示します
       t   パーティションタイプを変更します
       v   パーティション情報を検証します
       i   パーティションの情報を表示します
    
      その他
       m   このメニューを表示します
       x   特殊機能に移動します (熟練者向け機能)
    
      スクリプト
       I   ディスクのレイアウトを sfdisk 互換のスクリプトから読み込みます
       O   ディスクのレイアウトを sfdisk 互換のスクリプトに書き出します
    
      保存と終了
       w   パーティション情報をディスクに書き込んで終了します
       q   変更点を保存せずに終了します
    
      新しいラベルを作成します
       g   新しい (何もない) GPT パーティションテーブルを作成します
       G   新しい (何もない) SGI (IRIX) パーティションテーブルを作成します
       o   新しい (何もない) DOS パーティションテーブルを作成します
       s   新しい (何もない) Sun パーティションテーブルを作成します
    
    
    コマンド (m でヘルプ): d
    パーティション 1 を選択
    パーティション 1 を削除しました。
    
    コマンド (m でヘルプ): w
    パーティション情報が変更されました。
    ioctl() を呼び出してパーティション情報を再読み込みします。
    ディスクを同期しています。
    ```

    これで HDD 内のパーティションはなくなりました。
    
    ```sh
    # fdisk -l
    ディスク /dev/nvme0n1: 477 GiB, 512110190592 バイト, 1000215216 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
    ディスクラベルのタイプ: gpt
    ディスク識別子: CE5ADA77-77F5-4EF3-924B-62BB489EBD68
    
    デバイス       開始位置   終了位置    セクタ サイズ タイプ
    /dev/nvme0n1p1     2048    1230847   1228800   600M EFI システム
    /dev/nvme0n1p2  1230848    3327999   2097152     1G Linux ファイルシステム
    /dev/nvme0n1p3  3328000 1000214527 996886528 475.4G Linux LVM
    
    (中略)
    
    ディスク /dev/md0: 32.8 TiB, 36000005357568 バイト, 70312510464 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
    I/O サイズ (最小 / 推奨): 524288 バイト / 1572864 バイト
    ディスクラベルのタイプ: gpt
    ディスク識別子: 808C25E6-7243-4A14-9057-59E04C2EE959
    
    
    ディスク /dev/mapper/rl-home: 373.9 GiB, 401445224448 バイト, 784072704 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
    ```

4. HDD の GPT フォーマットを削除
    HDD を 2. の後ですぐにマウントしようとしてもマウントできません。

    ```sh
    # mkfs -t xfs /dev/md0
    mkfs.xfs: /dev/md0 appears to contain a partition table (gpt).
    mkfs.xfs: Use the -f option to force overwrite.
    ```
    
    そこで、`wipef` コマンドを用いて完全に GPT フォーマットを削除します。
    
    ```sh
    # wipefs /dev/md0
    DEVICE OFFSET         TYPE UUID LABEL
    md0    0x200          gpt       
    md0    0x20bde787fe00 gpt       
    md0    0x1fe          PMBR      
    # wipefs -a /dev/md0
    /dev/md0: オフセット 0x00000200 にある 8 バイト (gpt) を消去しました: 45 46 49 20 50 41 52 54
    /dev/md0: オフセット 0x20bde787fe00 にある 8 バイト (gpt) を消去しました: 45 46 49 20 50 41 52 54
    /dev/md0: オフセット 0x000001fe にある 2 バイト (PMBR) を消去しました: 55 aa
    /dev/md0: ioctl() を呼び出してパーティション情報を再読み込みします: 成功です
    ```    
    
    これで `fdisk` コマンドで確認するときちんと GPT フォーマットが削除できていました。

    ```sh
    # fdisk -l
    ディスク /dev/nvme0n1: 477 GiB, 512110190592 バイト, 1000215216 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
    ディスクラベルのタイプ: gpt
    ディスク識別子: CE5ADA77-77F5-4EF3-924B-62BB489EBD68
    
    デバイス       開始位置   終了位置    セクタ サイズ タイプ
    /dev/nvme0n1p1     2048    1230847   1228800   600M EFI システム
    /dev/nvme0n1p2  1230848    3327999   2097152     1G Linux ファイルシステム
    /dev/nvme0n1p3  3328000 1000214527 996886528 475.4G Linux LVM
    
    (中略)
    
    ディスク /dev/md0: 32.8 TiB, 36000005357568 バイト, 70312510464 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
    I/O サイズ (最小 / 推奨): 524288 バイト / 1572864 バイト
    
    
    ディスク /dev/mapper/rl-home: 373.9 GiB, 401445224448 バイト, 784072704 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
    ```


5. xfs フォーマットの作成
    このままマウントしようとしてもまだ怒られます。
    
    ```sh
    # mount /dev/md0 /var
    mount: /var: wrong fs type, bad option, bad superblock on /dev/md0, missing codepage or helper program, or other error.
    ```
    
    原因は極めて単純で、フォーマットができていないからです。ext4 などの他にもフォーマット形式はありますが、今回は xfs を選択。

    ```sh
    # mkfs -t xfs /dev/md0
    meta-data=/dev/md0               isize=512    agcount=33, agsize=268435328 blks
             =                       sectsz=4096  attr=2, projid32bit=1
             =                       crc=1        finobt=1, sparse=1, rmapbt=0
             =                       reflink=1
    data     =                       bsize=4096   blocks=8789063808, imaxpct=5
             =                       sunit=128    swidth=384 blks
    naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
    log      =internal log           bsize=4096   blocks=521728, version=2
             =                       sectsz=4096  sunit=1 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    ```

6. マウント
    ここまで来てやっとマウントできます。特に done などの反応はありません。
    
    ```sh
    # mount /dev/md0 /var
    ```

    これでマウント完了です。
    
    ```sh
    # df -h
    ファイルシス        サイズ  使用  残り 使用% マウント位置
    devtmpfs               32G     0   32G    0% /dev
    tmpfs                  32G     0   32G    0% /dev/shm
    tmpfs                  32G   18M   32G    1% /run
    tmpfs                  32G     0   32G    0% /sys/fs/cgroup
    /dev/mapper/rl-root    70G  9.1G   61G   13% /
    /dev/nvme0n1p2       1014M  224M  791M   23% /boot
    /dev/mapper/rl-home   374G  2.9G  371G    1% /home
    /dev/nvme0n1p1        599M  5.8M  594M    1% /boot/efi
    tmpfs                 6.3G  5.7M  6.3G    1% /run/user/1000
    /dev/md0               33T  234G   33T    1% /var
    ```

    再起動しても固定されない場合は、/etc/fstab を記入してください。

# 参考文献

- ["appears to contain a partition table" の原因と対処](http://tooljp.com/linux/Redhat7/faqRedhat7/html/appears-to-contain-a-partition-table.html)
- [mountエラー「wrong fs type, bad option, bad superblock on /dev/sdb」 | ex1-lab](https://ex1.m-yabe.com/archives/3457)