Ubuntu日和
【第34回】パーティションとファイルシステムとUbuntuとWindows
2023年9月2日 06:18
Windowsから
まずはWindowsがどうなっているかの確認からにしよう。よもや本誌の読者でWindowsをインストールしたことがないということもなかろうが。
執筆時点で最新版のWin11_22H2_Japanese_x64v2.isoからインストールしようとすると、デフォルトのパーティションは次のようになる。
実際にインストールしてみると次のようになる。
ここから、デフォルトだとパーティションは3つに分かれることが分かる。パーティション1は回復パーティション、パーティション2はEFIシステムパーティション、パーティション3は実際にWindowsがインストールされるパーティション、いわゆるCドライブだ。CドライブはNTFSでフォーマットされる。
USBメモリを接続した場合、あるいは内蔵SSDを増設した場合などは、ドライブレターが割り振られる。歴史的な理由でCから始まり、Zまで使用できるが、ネットワークドライブという共有フォルダーにドライブレターを振る機能もある。
ドライブレターはCドライブを除いて任意に変更できる。古のPC-98ユーザーは、CDドライブのドライブレターがQだったことを覚えていることだろう。筆者はPC/AT互換機に乗り換えたあとも久しくCD/DVDはQドライブ、2台目がある場合はRドライブとしていたが、昨今ではそもそも光学ドライブを必要としなくなってしまった。光学ドライブは不要でも5インチベイは必要なこともあるので、昨今のベイなしケースが流行している状況は筆者にはわりとつらい。
Ubuntuでは
Ubuntuは23.04からインストーラが変更されており、挙動も少し変わっているが、ここでは23.04の新インストーラを見ていくことにする。
Ubuntuをまっさらなパーティションにインストールする際は、あまり選択できることは多くない。手動パーティショニングなんてしないほうがいいに越したことはないので、基本的には「ディスクを削除してUbuntuをインストールする」を選択することになる。
「高度な設定」をクリックすると、LVMなるものも使用できることが分かる。
確認画面で2つのパーティションが作成され、Ubuntuがインストールされるパーティションのファイルシステムはext4であることが分かる。
実際にインストールしてみると次のようになる。
VirtualBoxを使用していることがバレバレであるが、それはさておきUEFIパーティションがWindows 11よりも大きめに取られていることが分かる。またWindows 11ではEFI、UbuntuではUEFIという表記になっているが、どちらも同じものと考えて差し支えない。詳細はWikipediaの解説が分かりやすい。
また、ここからUbuntuをインストールしたファイルパーティションは「/」(ルート)であることが分かる。ドライブレターらしき「デバイス」は「/dev/sda2」だが、これは直接は使われない。/dev/sda2は/に割り当てられており、これをマウントするという。マウントされているのでマウント中となるわけだ。
ということは、どこかで/dev/sda2を/にマウントするという設定があるはずだ。その設定は/etc/fstabであり、これを見てみよう。
$ 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).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/e8fecd89-37c3-4ca9-a9c5-83c989c3c10a / ext4 defaults 0 1
# /boot/efi was on /dev/sda1 during curtin installation
/dev/disk/by-uuid/465A-62DF /boot/efi vfat defaults 0 1
/swap.img none swap sw 0 0
ふむふむ、/dev/sda2を/にマウントするという設定にはなっていない。/dev/sda2のsda2は場合によっては変わることがあるので、ここに割り当てられているUUIDであるところの「e8fecd89-37c3-4ca9-a9c5-83c989c3c10a」を用いている。これで仮に/dev/sda2が/dev/sdb2になったとしても変わらずマウントできるわけだ。先のスクリーンショットをもう一度見てみると、下から2行目の「UUID」が「e8fecd89-37c3-4ca9-a9c5-83c989c3c10a」になっていることが分かる。
古のPC-98ユーザーは、AT互換機とは違いブートしたドライブがAドライブになったことを覚えていることだろう。これは非常に分かりにくいので、常にCドライブとか、UUIDで一意に特定というのは正しいとしかいいようがない。
ちなみに「sda」とか「sdb」は何かというと、どのドライバを通してそのストレージを認識しているかを示している。「sd」の場合は、実はSCSIを示している。Linuxの内部的には、SATA接続のSSDもUSBメモリもSCSIで接続されているように認識している。SCSIデバイスは今日日全く見かけなくなったが(それこそPC-98の時代が全盛期であったが)、プロトコルとしては現在でも使用されているわけだ。
NVMe SSDは分かりやすく「nvme」として認識する。
パーティション
Windowsでいうところのページファイルは、Ubuntuではスワップファイルという。/etc/fstabの最下行にある「/swap.img」がそれに該当する。
UbuntuというかLinuxのスワップファイルはWindowsのページファイルのような柔軟性はなく、ファイルサイズは固定となっている。Ubuntu 23.04のインストーラでは最大で4GBになるが、仮にこれで足りないということになればより大きなファイルサイズで作成し直す必要がある。詳細な設定方法は省略する。
少し前のUbuntuは、スワップファイルではなくスワップパーティションであった。古のUbuntuからずっとアップグレードしていると、未だにスワップパーティションが残っているかもしれない。しかしスワップパーティションとなるとスワップファイルよりも格段に柔軟性が落ちるので、もし今でもスワップパーティションが残っているのであれば、スワップファイルへの移行を検討すべきだろう。
さらに昔になると、/homeはパーティションを別にするべきであるとか、/varは別にするべきとかいろいろな話があったが、今は分ける必然的な理由がないといっていいだろう。
再インストールの際に/homeを残るので分けたほうがいいというのであれば、そもそもUbuntuには/homeを残したまま再インストールできるので、これを利用するのがいい。
ただし新しいインストーラーにはこの機能はまだ実装されていないようだ。
ファイルシステムとLVM
前述の通りUbuntuデフォルトのファイルシステムはext4だ。ではほかのLinuxディストリビューションもそうなのかと問われると、必ずしもそうでもない。著名なFedoraやopenSUSEは「Btrfs」を採用している。「Btrfs」は「バターエフエス」と読む。
Linuxで動作するNASも、Btrfs採用を謳っているものがある。たとえばSynologyがそうだ。
一方Ubuntuのext4も広く使われている。やはりext4採用を謳ったNASもある。QNAPがそうだ。この煽り方はいかがなものかと思うが。
このようにBtrfsとext4とでどちらが一方的に優れているというものではないが、ext4は機能が足りないのは間違いない。NTFSにはVSSというスナップショット作成機能がある。またパーティションサイズを任意に変更する機能もある。ext4にはいずれもない。NTFSではないがWindowsの機能として存在する記憶域スペースのような機能もない。こちらはもちろんBtrfsにはある。
Ubuntu的にこの欠点を克服するのが、「高度な機能」に出てきたLVMだ。LVMを有効にするとNTFSやBtrfsの使い勝手に似せることはできるが、扱うのはなかなか難しい。そもそも概念を理解する必要がある。そんなところが「高度な機能」たる所以だと思われる。そのような理由により使用はおすすめしないが、使いこなせると便利であるのは間違いない。
Windowsはext4には対応していないが、UbuntuというかLinuxではNTFSに対応している。Paragonによる開発の新しいドライバがUbuntu 22.04 LTSのカーネル5.15以降で使用できる。ほかにもNTFSにアクセスする方法はあるが、現在ではこれが最もいいと考えられている。
最近の大容量なUSBメモリやSDカードに使用されているexFATも、Linuxでは対応している。こちらは20.04 LTSからの対応だ。
このように、Windowsでよく使われるファイルシステムはUbuntuでも対応しているが、その逆はそうでもない。
Windows Subsystem for Linux(WSL)では、WindowsからWSLで動作しているUbuntu(だけではないが)のファイルにアクセスできる。
これは何らかのドライバが開発されたわけではなく、9Pというプロトコルを採用したサーバークライアントモデルで実現しているとのことだ。よってext4でフォーマットされたUSBメモリを接続しても開けるわけではない。
FHSとマウントポイント
Windowsでは、新しいアプリケーションをインストールした場合は原則としてC:\Program Files\以下にインストールされる。しかし、通常インストーラでインストール先を変更できるので、必ずしもここにインストールしなければいけないというものではない。
Ubuntuの場合は、パッケージをインストールする際にインストール先を聞かれたりはしない。なぜならファイルやフォルダーの置き場所がわりと厳格に決まっているから。
例として、フォントの表示やインストールを行なう「フォント」のパッケージはこのように構成されている。
$ dpkg -L gnome-font-viewer
/.
/usr
/usr/bin
/usr/bin/gnome-font-viewer
/usr/bin/gnome-thumbnail-font
/usr/share
/usr/share/applications
/usr/share/applications/org.gnome.font-viewer.desktop
/usr/share/dbus-1
/usr/share/dbus-1/services
/usr/share/dbus-1/services/org.gnome.font-viewer.service
/usr/share/doc
/usr/share/doc/gnome-font-viewer
/usr/share/doc/gnome-font-viewer/NEWS.gz
/usr/share/doc/gnome-font-viewer/changelog.Debian.gz
/usr/share/doc/gnome-font-viewer/copyright
/usr/share/icons
/usr/share/icons/hicolor
/usr/share/icons/hicolor/scalable
/usr/share/icons/hicolor/scalable/apps
/usr/share/icons/hicolor/scalable/apps/org.gnome.font-viewer.svg
/usr/share/icons/hicolor/symbolic
/usr/share/icons/hicolor/symbolic/apps
/usr/share/icons/hicolor/symbolic/apps/org.gnome.font-viewer-symbolic.svg
/usr/share/metainfo
/usr/share/metainfo/org.gnome.font-viewer.appdata.xml
/usr/share/thumbnailers
/usr/share/thumbnailers/gnome-font-viewer.thumbnailer
/usr/binには実行ファイルが、/usr/shareには「フォント」に必要な各種ファイルが含まれていそうなことが分かる。
ではこのフォルダーの使い分けはどのようになっているのかというと、Filesystem Hierarchy Standard(FHS)で決められており、おおむねこれに準じている。
/usr/binは「一般ユーザー向けだが基本的ではないコマンドの実行ファイル」、/usr/shareは「アーキテクチャに依存しない共有 (shared) データ」となっているが、まさに適合している。
USBメモリなどをUbuntu(デスクトップ)に接続すると、/media以下にマウントされる。FHSによるとリムーバブルメディア用のフォルダーとなっている。
実際には/media以下にユーザー名が作成され、パーティションにラベルが登録されている場合はその名前を、そうではない場合はパーティションのUUIDでフォルダーが作成され、そこにマウントされるようになっている。
このあたりの制御はudisksが行なっている。
あまり使う機会はないものの、たとえば/dev/sdb1として認識しているUSBメモリをマウントする場合は、
$ udisksctl mount --block-device /dev/sdb1
を実行する。Ubuntuではこれを裏で自動的に行なっているわけだ。ご覧の通りroot権限は必要ないので、昔ながらのmountコマンドよりも便利だ。