/homeを共有しながらArchLinuxの入ったPCにUbuntuをねじ込む

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の個人設定やらが全部共有されてとても便利になった。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です