解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

【GNU/Linux】マルチブート環境に mount --bind を活用する

前提 (Introduction)

もともと UNIX の代替として登場した GNU/Linux は、マルチユーザのワークステーションという形態が想定されてきました。 しかし今や、WindowsMacintosh に換わる個人専用のGUI作業環境としても、実用に足るものになっています。

そして、多くのディストリビューションがあり、多くの「デスクトップ環境」があり、独自のデスクトップ環境を売りにしているディストリビューションもあります。

ですから、GNU/Linux を、サーバ用途ではなく、またワークステーションというよりもむしろ、パーソナルコンピュータとして活用している人の中には、複数ディストリビューションやデスクトップ環境を試用するためにマルチブートのマシンにしている人が少なくないと思います。

問題の所在 (Motivation)

同じマシンでマルチブートをし、しかも、GUI作業環境、いわゆる「デスクトップ」として活用していると、個人的な様々なデータを保存することになります。 例えば、LibreOfficeのようないわゆる「オフィススイート」でつくった文書や、画像や動画や音楽のファイルなどなどを保存することになります。

その個人的データを保存する場所ですが、 もともとマルチユーザ形態を想定している GNU/Linux ですから、ユーザごとにホームディレクトリがつくられます。 そして、「デスクトップ」の標準規格化団体である freedesktop.org (XDG) は、 xdg-user-dirs というソフトウェアをもって、(デフォルトでは)ユーザのホームディレクトリの下にディレクトリを生成して保存するようにしています (https://wiki.freedesktop.org/www/Software/xdg-user-dirs/)。(ロケールにより翻訳されたディレクトリ名になることもありますが、)例えば Documents だとか Pictures だとかいうようなディレクトリがホームディレクトリの下に生成されます。

そうすると、マルチブートで複数GNU/Linux をインストールしている場合には、その GNU/Linux システムごとにホームディレクトリが別々にあって、その中に個人用のデータを保存することになってしまいます。 つまり、個人用データが別々のディレクトリに分散してしまい、システム(ディストリビューション)同士で共有することが不可能という事態になります。

従来の解決方法

従来の解決方法として

という方法があります。

しかし、前者の方法では不便です。

後者の方法は、問題点として、各システム環境特有の設定ファイルやキャッシュまで共有されてしまう、そのため conflict を起こすということがあります。 XDG は、ホームディレクトリの下に、設定ファイルを .config というディレクトリに、キャッシュを .cache というディレクトリに保存することにしています。

このXDGの設定はあくまでもデフォルトであって、(いわゆる「環境変数」(${XDG_CONFIG_HOME}など)で)変更することは可能です。 しかし、そのほかのアプリケーション・ソフトウェアなどでも、別個に、ホームディレクトリの下に、.で始まるファイルやディレクトリをつくったりして設定などを保存しようとするものが少なくありません。

したがって、 /home を共用しても完全には解決しません。

解決方法 (Solution)

パーティションをつくる

まず、データを保存するためのパーティションを別途つくるということです。 これで、どのシステムでも保存先は対等ですし、ホームディレクトリ自体を共有しても解決しないのですから。 この結果として、保存場所が一元化されてバックアップがとても楽になる、という副産物まであります。

つぎに、そのデータ保存用パーティションに、デフォルトで保存されるようにする必要があります

その方法としてはまず、 XDG の環境変数(${XDG_DOCUMENTS_DIR}など)で指定する案があります。

ただそうしても、すべてのソフトウェアがその環境変数を尊重してくれるとはかぎりませんし、 ファイルを探すたびに別パーティションのディレクトリに飛ぶという不便さは解決しません。

ホームディレクトリの下にマウントする

ですから、XDGの環境変数をデフォルトから変えるというのとまったく異なるアプローチをとります。 それは、ホームディレクトリ以下の Documents などに、保存用パーティションをマウントするというアプローチです。

ところがそうすると、DocumentsPicturesMusicなどなどの各ディレクトリごとにパーティションファイルシステム)が必要なのでしょうか?

もちろん、その必要もないのです。 なぜならば、mountは、ファイルシステムだけではなく、ディレクトリもマウント可能だからです。これが mount--bind オプションです。

つまり、例えば、保存用パーティション/media/Data にマウントしていて、その下に Documents などのディレクトリを作成しているとします。 ユーザのホームディレクトリが /home/user1 だったとすると、 /home/user1/Documents をマウントポイントにして /media/Data/Documents をマウントするわけです。

そして、保存用パーティションのマウントも、各ディレクトリのマウントも、 /etc/fstab に書くことで自動化することが可能です。 自動化してしまえばあとは、意識する必要はまったくなくなります。

ちなみに mount --bind/etc/fstab への書き方ですが、例えば

/media/Data/Documents  /home/user1/Documents  none  bind  0  0

のように、ファイルシステムではないのでnoneと書きます(LC_ALL=C man 8 mount 参照)。

ただし GNU/Linux 同士でないと不向き

mount は、 BSDMacOS X などでも使えるかもしれません(Windows なんかは問題外ですが)。

GNU/Linux では、ファイルシステムext4 や btrfs を利用していることが多いと思います。 ext4 にしても btrfs にしても、 Linux 由来のファイルシステムです。 他方で、例えば FreeBSD のデフォルトのファイルシステムは ufs です。MacOS X は HFS+ です。

GNU/Linux 以外のOSでも読み書きが可能なようにするには、両方に対応したファイルシステムを選ぶ必要があります。 そうすると、ネイティブなファイルシステムよりも性能が低下することが多いはずです。


この投稿は、

qiita.com

14日めの記事です。

13日めは、ふうせん氏の「CrunchBang が帰ってきた。BunsenLabs。」でした。