🍊

Ubuntuを開発で使う時にハマらないための手引き

2020/10/11に公開

仕事の開発はMacBookProにParallels DesktopでUbuntu Serverを使い、趣味の開発はUbuntu Desktopを使うようになり、メインの開発環境として3年以上Ubuntuを使い続けています。
自分の開発するアプリの多くは、Kubernetes上で動作するDockerコンテナであるため、開発環境もLinuxに揃えておけると、非常にはかどります。
アップデートも半年に一度あるため、比較的最新のアプリケーションをかなり安定した環境で使うことができます。
今までに遭遇した開発のはまりポイントを紹介します。

1. Linuxbrew をなるべく使わない

Linuxbrewは、HomebrewのパッケージシステムがLinuxでも使えるようになる便利なツールです。しかし、常に最新のコードが入り込むため頻繁に壊れたり、一つのパッケージのインストールが依存するパッケージを引っ張ってしまい、Ubuntuのパッケージを隠してしまうことも多々発生します。
正常に動作している時は良いのですが、LinuxbrewのライブラリとUbuntuのライブラリがLinuxbrew上では両方とも参照される状態になり、期待通りのライブラリを参照させることに失敗したことがあります。
今は以下のような基準でLinuxbrewを使うようにしています。

  • gcc、clangなど、ソフトウェアビルドに必要とされるツールセットでは Linuxbrew は使わない
  • プログラミング言語(Go、Python、Nodejsなど)のインストールには Linuxbrew は使わず、Ubuntuのパッケージか、公式がサポートするAPTリポジトリを利用する
  • 言語のパッケージマネージャ(PyPI、npmなど)で提供されるツールの場合、なるべく言語のパッケージマネージャを用いる
  • kubectl、ghq、ghなど、言語のパッケージマネージャ(PyPIなど)の外のCLIツールでのみ、Linuxbrewを使う
    Linuxbrewを使うにしても、必要なソフトウェア以外はunlinkするようにしています。
    https://github.com/74th/dotfiles/blob/master/homebrew/tasks.py#L146-L168

2. メモリのある限りファイルキャッシュに溜め込まれるので、上限メモリを設定する

Linuxではメモリのある限りファイルキャッシュとして使うようになります。ホストOSとしてLinuxが動作している場合には良いですが、ゲストOSとしてLinuxが動作している場合、ゲストOSに上限として設定したメモリの量だけ、ファイルキャッシュを貯め込むようになります。
現在、WindowsのWSL2や、MacOSのHypervisorFrameworkを用いた場合であっても、同様です。この解決には、ゲストOSの場合には搭載メモリの全容量を設定しないこと(32GのMacBookProに対しては、ゲストOSに22Gを上限に設定しています。WSL2でも設定が可能です。)、ゲストOSを時々再起動することで、回避しています。

3.ファイルシステムは壊れる

ファイルシステムはときに壊れます。特にParallels Desktop上では、MacOSが時々リセットがかかるのにファイルシステムが耐えられなくなるのか、壊れることがあります。
ファイルシステムをチェック、修復するfsckのコマンドは事前に覚えておくと、アクシデントに耐えられます。

4. dockerではファイルシステムをバインドしない

Windows/MacOSでは docker Desktop を使うと、ローカルのファイルシステムとDocker内のファイルシステムの差をだいぶ埋めてくれます。一方、Linuxでは素のDockerを使うことができます。docker -vでファイルシステムをマウントする時、ディレクトリのUIDはDocker内でもホストでもおなじものが使われます。Docker内ではよくroot権限でアプリケーションを動作させていますが、マウントしたファイルシステムにコンテナ内で書き込んだ時、その時のUIDはrootになってしまいます。また、コンテナ内で異なるUIDを使っていた場合も、同じことが起きます。
また逆にローカルで実行した chmod -R ~/ のせいで、Docker内のバインドしたディレクトリが参照できなくなった、ということもありえます。
多くのケースではローカルとファイル共有したいというよりも、コンテナの外の永続化ディレクトリとして確保したいというケースが多いと思います。そうであれば、docker volume createを使ってボリュームを作成することで永続化されます(ただし、docker run --rmを使うとvolumeも一緒に消してしまうので注意が必要です)。

5. キーリマップのxmodmapは完璧ではない

MacOS を使っていると karabiner-elements というソフトウェアでキーボードのレイヤで様々なことができて非常に便利です。Linuxではxmodmapを使うとキーの再配置ができますが、これは常に動作するわけではありません。GUIアプリケーションによってはxmodmapが操作するレイヤを通らずに動作するものがあり、時々そのようなアプリと遭遇することがあります。
今の所私自身の解としては、自作キーボードのファームウェアQMK Firmwareでそのあたりをするようにしています。

ぜひ、Linuxで快適に開発しましょう。
MacBookAir/Proに、MacOSを捨てて、Ubuntuをインストールしたくなった時の手順も添付します。https://qiita.com/74th/items/a374b0462dfabb6fb51c

Discussion