BlogBracken

FOR_MYSELF

ワンコマンドでOSの環境を整える

ワンコマンドでUnix系OSの環境構築を行えるようにする話です。

はじめに

このエントリでは、OSが初期化されている状況から自環境の構築をワンラインで行うために書いたスクリプト群の配置構成について解説しています。 また現時点での筆者の環境はArch Linuxで、この構成ではUnix系以外のOSについて考えられていません。

f:id:brackenblack:20191231133648p:plain

目的

  • ワンラインで自環境を復元・構築できる
  • 環境を構築する手段を後から容易に参照できる

環境構築というのは実に面倒な作業で、1度行うのは楽しかろうとそれを複数回となってしまうのは避けたいところです。 そこで、そのプロセスをスクリプト群にまとめ、リモートリポジトリをGitHub上においておくことで半自動化します。 これによって不測の事態*1が発生してもすぐに自環境を取り戻すことができます。嬉しいですね。

実際に、Arch Linuxを導入した後以下のコマンドを入力することで、 デスクトップ環境や開発環境、それらの設定とドライバがまとめて導入されます*2

bash -c "$(curl -sL bracken.black/gearbox/arch.sh)"

構成

はじめに実例として、筆者のスクリプト群は以下のリポジトリにあります。Starして貰えると喜びます。 github.com

リポジトリ名は自由ですが、折角なので壮大な名前にすると良いと思います*3

基本

まっさらのOSには限られたソフトウェアしか入っていません。 依存は最小限かつ信頼性の高いものに抑えるべきです。

よって、インストールにはMakefilebashを用いることとします。

また後々の為にトップディレクトリには可能な限りファイルを散らかさず、適切なディレクトリに振り分けましょう。

実行したときの流れは以下のようになります。

  1. docs/DISTRO.shcurl/wget経由で呼び出す
  2. docs/DISTRO.shMakefileに変数を与えつつ呼び出す
  3. Makefileが共通の処理を行いながら、適切なinit/DISTRO/init.shを呼び出す
  4. セットアップの完了

ディレクトリ構成

$INIT_PATH
  ├─ bin/
  ├─ config/
  ├─ docs/
  │    └─ arch.sh
  ├─ dotfiles/
  ├─ init/
  │    └─ arch/
  │          ├─ common/
  │          ├─ optional/
  │          ├─ ordered/
  │          └─ init.sh
  ├─ res/
  └─ Makefile

bin/

独自コマンドなどの、実行可能なファイルを置くためのディレクトリ。

~/.zshrc~/.bashrcで予め環境変数を通しておきます。実行権限はまとめてMakefileで与えると良いでしょう。

config/

設定ファイルを置くためのディレクトリ。dotfilesとは分けます

dotfilesは風習としてホーム直下に置かれる設定ファイルですが、すべてのconfigが1つの定まったディレクトリ下に置かれるとは限りません。 これらを同居させてしまうとまとめて操作を行うのが困難になります。

設定ファイルは、後のinit/下のスクリプトで適用させていきます。

docs/

外部から呼び出せるシェルを置くディレクトリ。

このリポジトリスクリプト群は外部から正しく呼び出せなければなりません。その為にGitHub Pagesの機能を用います。 詳しくは Configuring a publishing source for your GitHub Pages site - GitHub Help を参照してください。

上記の構成では、Arch Linuxの初期化スクリプトを呼び出すためのarch.shを作っています。

dotfiles/

dotfilesを置くためのディレクトリ。

これらはホームディレクトリ直下に全てシンボリックを張ってしまって良いと思います。 ただ、他にdotfiles用のリポジトリを作成してそれのsubmoduleにしてしまった方がより汎になるかもしれません。*4

init/

導入を行うスクリプト群を置くためのディレクトリ。

ここでは、アプリケーションのインストールや設定ファイルのシンボリック作成、有効化などを行います。

第1階層にはOS名を入れます。これは、Makefileなどの他ファイルから呼び出すときの識別子にする為です。 筆者の環境ではarch以外作成していないのでディレクトリは単一ですが、例えとしてMacOSを考えるならosx/というディレクトリがここに追加されます。

第2階層以下には抽象化のため統一して呼び出すことの出来るファイルを用意する必要があり、今回の構成ではinit.shがそれに当たります。

また、ordered/には順序通りに実行されなければならない*5スクリプト群が、 common/は順序関係なく呼び出せる一般のアプリケーションを導入させるためのスクリプト群が、 optional/にはインストールに時間が掛かる上に最初は必要でないようなアプリケーション*6を導入させるためのスクリプト群が入っています。

スクリプト群は各人の思う単位で切り分けて良いと思いますが、細かすぎる分割は後々の参照を阻みかねないので加減が必要です。

res/

画像ファイルなどの資源ファイルを置くためのディレクトリ。

筆者は壁紙やデスクトップ環境のテーマを置いています。

Makefile

init/の呼び出し元。ディストロに関係なく行うべき処理なども書く。

参考

反省

  • 更新と初期化が密になってしまっている
  • WindowsでもWSL2の登場とchocolateyの使用でまあ何とかなる気がしている
  • rawなArchLinuxだとsudo systemctl start dhcpcdしないとインターネットに繋がらないので厳密には1コマンドでない
  • エントリ書いている内に良くない点が見つかったのでそのうち直す

おわりに

人によってこういった構成は変わりうるものなので、構成例の1つとして参考にしていただければと思っています。 快適な開発ライフを。

では。

追記(2020/05/25)

chocolateyよりwingetの方がアツいかもしれませんね。

*1:筆者の場合2ヶ月に1回起こる

*2:dhcpcdを有効にしないとインターネットに繋がらないので厳密には1コマンドでない

*3:ほんまか?

*4:筆者はしていないが

*5:yayのインストールにはgitが必要なように

*6:筆者にとってはHaskell IDE EngineとかUnityとか