ArchLinuxは軽量だしパッケージ管理も必要なものだけ入れられるし本当に便利なんだけど、時々えらく難しい設定をしなきゃいけないことがあって(noobな自分には)不便に感じることがある。
そこでいざという時のためにUbuntuを入れておきたいんだけど、まっさらなものを入れるのは嫌なので、/homeを共有しておきたい。
ハードディスクがマウントされた状態で作業はできないので、初めから必要なツールが入っているArchLinuxのインストールメディアを使って操作することにした。
初めの構成
(ぐちゃぐちゃだけど)最初はこうなっていた。
# fdisk -l /dev/sda
Disk /dev/sda: 564.8GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal) 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: **********
Device Start End Sectors Size Type
/dev/sda1 2048 1574911 1572864 768M Windows recovery environment
/dev/sda2 1574911 3147775 1757864 768M unknown
/dev/sda3 3147775 3680255 532480 260M EFI System
/dev/sda4 3680255 3942399 262144 127M Microsoft reserved
/dev/sda5 3942399 469383167 465440768 222G Microsoft basic data
/dev/sda6 469383167 703125503 233742336 111.5G Linux filesystem
/dev/sda7 934823936 976773119 41949184 20G Windows recovery environment
/dev/sda8 703125504 934823935 231698432 110.5G Linux filesystem
Partition table entries are not in disk order.
# parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help’ to view a list of commands.
(parted) print
Model: ATA ST500LM000-1EJ16 (scsi)
Disk: /dev/sda: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1019kB 806MB 805MB ntfs Basic data partition hidden, diag
2 806MB 1612MB 805MB fat32 Basic data partition hidden
3 1612MB 1884MB 273MB fat32 EFI system partition boot. esp
4 1884MB 2019MB 134MB Microsoft reserved partition msftres
5 2019MB 240GB 238MB ntfs Basic data partition msftdata
6 240GB 360GB 120GB ext4 Arch Linux Root
8 360GB 470GB 119GB ext4 Linux Home
7 470GB 500GB 21.5GB ntfs Basic data partition hidden. diag
- /dev/sda1,2.4,7…Windowsの予約パーティション
- /dev/sda3…grubのEFIパーティション
- /dev/sda5…WindowsのCドライブ
- /dev/sda6…Arch Linuxの/
- /dev/sda8…Arch Linuxの/home
Windowsのパーティションをずらすのは面倒だったので、ArchLinuxのパーティションを切り詰めることにした。
現在は120GBがroot, 120GBがhomeなので、100GBをArchLinuxのroot, 90GBを共有home, 50GBをUbuntuのHomeにする方針。パーティションの順番が違うのは後で直すから許して
パーティションの縮小(失敗)
パーティションの開始地点をそのままに、終了地点を変更する方法は調べたら出てきた。
まずパーティションとファイルシステムは別物で、パーティションはディスクを区切る単位、ファイルシステムはその中のファイル構成を管理するものであるらしい。
従って、パーティションを縮小する前にファイルシステムを縮小し、そのファイルシステムの外側ならパーティションがどこで区切れても問題ないようにする必要がある。
とりあえずはファイルシステムを99GBまで削って、パーティションを100GBまで削ればいっかと思ってやってみた。
パーティションのリサイズはresize2fs、パーティションのリサイズはpartedのresizepartコマンドを使う。
# resize2fs /dev/sda6 99G
resize2fs 1.44.2 (14-May-2018)
Please run 'e2fsck -f /dev/sda6' first.
どうやらリサイズの前にファイルシステムのチェックをしなきゃいけないらしい
# e2fsck -f /dev/sda6
e2fsck 1.44.2 (14-May-2018)
Pass 1: Checking inode, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sda6: 408554/7307264 files (0.4% non-contiguous), 6391354/26214400 blocks
その後resize2fsとresizepartを行う。
# resize2fs /dev/sda6
resize2fs 1.44.2 (14-May-2018)
Resizing the filesystem on /dev/sda6 to 26214400 (4k) blocks.
The filesystem on /dev/sda6 is now 26214400 (4k) blocks long.
resize2fs /deb/sda6 100G 2.86s user 5.76s system 15% cpu 56.561 total
# parted /dev/sda
(parted) resizepart 6
End? [360GB]? 340GB
Warning: Shrinking a partition can cause data loss, are you sure you want to continue?
Yes/No? Yes
Warning、めっちゃ嫌な予感するんだけど…
# mount /dev/sda6
mount: /mnt: wrong fs type, bad option, bad superblock on /dev/sda6, ...
おわた。
ちなみにこの時身近にバックアップできそうなデバイスがなかったのでバックアップをしていない。やったね!
※良い子はマネしないでね
何を血迷ったのかパーティションを消してみる。
(parted) rm 6
ここで、パーティションだけ消したのでファイルシステムは物理的に生き残ってることに気づく。
partedのmkpartコマンドで復活させる。
(parted) mkpart
Partition name? []?
File system type? [ext2]? ext4
Start? 240GB
End? 360GB
# mount /dev/sda6 /mnt
# ls /mnt
bin boot dev etc home lib lib64 lost+found mnt opt proc root ...
元に戻った。よかった。
パーティションの縮小(成功)
ファイルシステムが99GBなのにうまく行かなかったのは1GB=1024MB or 1000MBで違いがあるのかもしれない。
調べていたら、resize2fsには「可能な限り縮小する」というオプションがあるし、サイズもオプションも指定しなかったら可能な限り拡大することに気づいた。
考えてみたらファイルシステムのサイズにギリギリを求める必要なんてなかった。
というわけで-Mオプションでファイルシステムを最小化した後、パーティションのサイズを変更してから最大化する。
まずはファイルシステムの最小化。
# e2fsck -f /dev/sda6
# resize2fs -M /dev/sda6
続いてパーティションのサイズ変更。
# parted /dev/sda
(parted) resizepart 6
End? [360GB]? 340GB
最後にファイルシステムの最大化。
# resize2fs /dev/sda6
これでマウントしてもうまく行った。
パーティションを手前に移動する
続いて/dev/sda8(homeパーティション)を/dev/sda6の隣ぴったりにくっつけたい。
要は/dev/sda8を手前にずらしたい。
ファイルシステムの位置を変えないままパーティションの先頭位置を手前にずらすと、ファイルシステムの先頭と合致しなくなって認識されなくなる(と思う)。
これを解決する方法を考えていたが、一旦別のパーティションを作ってコピーすればいいことに気づいた。
まずは退避するスペースを設けるために、さっきと同じ手順で後ろを縮める。
# resize2fs -M /dev/sda8
# parted /dev/sda
(parted) resizepart 8
End? [479GB]? 400GB
続いて退避用の/dev/sda9を作る。
(parted) mkpart
Partition name? []?
File system type? [ext2]? ext4
Start? 430GB
End? 479GB
この時点でこのような状態になっている。
/dev/sda6, /dev/sda9はパーティション的に完成されていて、/dev/sda8を前後に拡張すればよい。
(parted) p
Model: ATA ST500LM000-1EJ16 (scsi)
Disk: /dev/sda: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1019kB 806MB 805MB ntfs Basic data partition hidden, diag
2 806MB 1612MB 805MB fat32 Basic data partition hidden
3 1612MB 1884MB 273MB fat32 EFI system partition boot. esp
4 1884MB 2019MB 134MB Microsoft reserved partition msftres
5 2019MB 240GB 238MB ntfs Basic data partition msftdata
6 240GB 340GB 99.7GB ext4
8 360GB 400GB 40.0GB ext4 Linux Home
9 430GB 479GB 48.6GB ext4
7 479GB 500GB 21.5GB ntfs Basic data partition hidden. diag
まずは/dev/sda8を/dev/sda9にコピーする。オプションはArch Linux Wikiを参考にした。
# dd if=/dev/sda8 of=/dev/sda9 bs=1M conv=noerror,sync status=progress
コピーが終わったら/dev/sda8を壊して新しく作り直す。
# parted /dev/sda8
(parted) rm 8
(parted) mkpart
Partition name? []?
File system type? [ext2]? ext4
Start? 340GB
End? 430GB
そうしたら退避させたファイルシステムを元に戻して最大化する。
# dd if=/dev/sda9 of=/dev/sda8 bs=1M conv=noerror,sync status=progress
# resize2fs /dev/sda8
あとは、覚えてるうちにパーティションの番号を順番通りに戻しておく。
# fdisk /dev/sda
Command (m for help): x
Expert command (m for help): f
Partitions order fixed.
最後に、ArchLinuxがちゃんとブートできるように、fstabを書き直しておく。
# mount /dev/sda6 /mnt
# mount /dev/sda3 /mnt/boot
# mount /dev/sda7 /mnt/home
# : > /mnt/fstab
# genfstab -U /mnt >> /mnt/etc/fstab
Ubuntuのインストール
UbuntuのインストールはGUIに従うだけなのでそのまま進める。
気をつけるのは、「インストールの種類」の画面で「それ以外」を選び、空けたパーティションをrootパーティション、共有homeパーティションをhomeパーティションとしてマウントするように指定すること。
個人的にはhomeパーティションが上書きされるのが怖かったので、一旦rootパーティションのみ指定し、インストールが終わってから以下のコマンドを打った。
# rm -rf /home/*
# apt install arch-install-scripts
# mount /dev/sda9 /home
# genfstab -U / | grep home >> /etc/fstab
これで再起動したらちゃんと自分のhomeディレクトリが両OSで共有されて、ブラウザのCookieやらgnomeの個人設定やらが全部共有されてとても便利になった。
コメント