DotfileとBashスクリプトだけで新しいUbuntuデスクトップをセットアップする方法
GitHub上のオープンソースファイルを見るのが楽しみな理由のひとつは、.bashrcなどのdotfileの設定方法といった、一見地味な作業を他の人たちがどうこなしているのかを覗き見できる点にあります。Linuxを使い始めた頃ほど「ライシング(ricing)」に熱中しなくなったものの、見た目と動作速度を向上させてくれる設定を見つけると、今でもワクワクします。
最近、そんな発見がいくつもありました。特にTom Hudson氏のdotfilesです。Tom氏はスクリプト化がお好きなようで、シンボリックリンクの自動作成や、Ubuntuリポジトリのアプリケーションなどのインストールまで自動化しています。これを見てふと思いました。「新しいマシンのセットアップを自動化して、今使っている環境をそっくり再現できるのではないか?」
私は物を分解して仕組みを確かめるのが好きなタイプなので、ノートパソコンを壊したことも何度かあります(大抵は家を離れていてバックアップ用HDDがないときに限ります)。パソコンが「元の姿の抜け殻」になってしまった、そういう稀だけど本当に困った状況のときに、好みの状態へ素早く簡単に復元できる方法があるのは嬉しいものです。
ディスクイメージを作成して後で復元する方法と比べると、bashスクリプトのコレクションは作成・管理・持ち運びがはるかに簡単です。特別なユーティリティは不要で、外部への転送手段さえあればOK。まるでバンドトケーキそのものではなく、レシピを渡すようなものです(ケーキ、食べたい…)。
さらに、このような仕組みは仮想マシン(VM)やVPS(仮想プライベートサーバー)のセットアップにも非常に役立ちます。書いていて気づきましたが、どちらも破壊的な実験には寛容な相手かもしれませんね…失敗して学ぶのみ!
grepしたりGoogleで検索したり掘り下げたりした結果、今ではこんなスクリプト群が手に入りました。
セットアップの様子は動画でご覧いただけます。
これは、起動可能なUSBから起動した真っ新なUbuntuデスクトップでセットアップスクリプトを実行したテストの終盤です。すべてのプログラムと設定が3分足らずで復元されました!
本記事では、bashスクリプトを使ってUbuntu Desktop(筆者の場合はUbuntu LTS 18.04)の自動セットアップを実現する方法を解説します。内容の大部分はすべてのLinuxデスクトップに応用できますが、一部構文が異なる場合があります。bashスクリプトがカバーするのは主に3つの領域です。dotfileのリンク、ソフトウェアのインストール(Ubuntuリポジトリおよびその他)、そしてデスクトップ環境のセットアップです。それぞれの領域について重要なポイントを押さえ、皆さんが独自のスクリプトを作り始められるようにしましょう。
Dotfilesとは
dotfileとは、多くのLinux愛好者が設定ファイルと呼んでいるものです。通常はユーザーのホームディレクトリ(bashスクリプトでは組み込み変数$HOMEで表されます)に置かれ、さまざまなプログラムの外観や動作を制御します。ファイル名は.(ドット)で始まり、これはLinuxでは隠しファイルを意味します(だから「ドットファイル」と呼ばれるのです)。以下に、よく使われるdotfileとその活用例を紹介します。
.bashrc
.bashrcは、対話型の非ログインシェルが起動時に実行するコマンドのリストです。「対話型/非対話型」の違いは少し紛らわしいですが、ここでは気にする必要はありません。要するに、新しいターミナルを開いてプロンプトが表示され、コマンドを入力できる状態になったとき、あなたの.bashrcが実行されているのです。
このファイルに記述するエイリアスでキーストロークを減らしたり、有用な情報を表示するプロンプトを設定したりすることで、ワークフローを改善できます。Eddieのようなユーザー作成プログラムを実行させることさえ可能です。アイデアをもっと得たいなら、GitHubで私の.bashrcを覗いてみてください。
.vimrc
.vimrcは、テキストエディタの王者・Vimを設定するdotfileです(キーボードショートカットの力をまだ体験していないなら、Vimを楽しく学べるゲームを強くおすすめします)。
.vimrcでは、表示設定、カラー、カスタムキーボードショートカットなど、エディタの各種設定を行えます。GitHubで私の.vimrcも参照してみてください。
使用するプログラムによっては、.gitconfigや.tmux.confといった他のdotfileも役立つでしょう。GitHubでdotfileを探索すれば、どんなものが存在し、何が自分に役立つのかを感覚的に掴むのに最適です!
Dotfileのリンク
スクリプトを使えば、すべてのdotfileのシンボリックリンク(symlink)を作成できます。こうすると、すべてのファイルを中央のリポジトリにまとめて管理しやすくしながら、プログラムが設定ファイルを探す場所にはプレースホルダー的なリンクを置けるのです。配置場所は常にとは限りませんが、通常はユーザーのホームディレクトリです。たとえば私はdotfileをGitHubで管理しているため、~/github/dotfiles/のようなパスに実体を置き、それをシンボリックリンクすることで~/.vimrcのようなパスが実現されています。
既存のファイルやシンボリックリンクをプログラム的にチェック・処理してから新しいリンクを作成するには、次のエレガントなシェルスクリプトが使えます。「エレガント」と褒めるのは、その核心部分をTom氏のセットアップスクリプトから丸々拝借したものであり、この美しさの手柄は私のものではないからです。
symlink.shスクリプトは、$HOME内の各dotfileに対してシンボリックリンクの作成を試みます。まず同名のシンボリックリンクが既に存在するか、あるいは同じ名前の通常ファイルやディレクトリが存在するかを確認します。前者の場合は既存のリンクを削除して作り直し、後者の場合はファイルやディレクトリをリネームしてからシンボリックリンクを作成します。
ソフトウェアのインストール
シェルスクリプトを探検していて美しいと感じるのは、コマンドラインだけでどれほどのことが達成できるかを発見できる点です。GUIのOSからコンピュータに入った身としては、ターミナルでの作業は爽快なほど速く感じられます。
Ubuntuなら、必要になりそうなほとんどのプログラムはデフォルトのソフトウェアリポジトリで入手できます。通常はapt search <program>で検索し、sudo apt install <program>でインストールします。欲しいソフトウェアがデフォルトリポジトリにない場合や、最新版が提供されていない場合は、PPA(Personal Package Archive)を使えばUbuntuにインストールできることがあります。ただし、選ぶPPAが公式ソース由来であるかどうかには注意が必要です。
デフォルトリポジトリにもPPAにも見当たらないプログラムでも、コマンドライン経由でインストールできる可能性があります。「installation command line」などで検索すれば、答えが見つかることが多いでしょう。
bashスクリプトは、ターミナルで個別に実行できるコマンドの集まりにすぎないため、欲しいプログラムを全部インストールするスクリプトを作るのは、単にコマンドをスクリプトファイルに並べるだけの話です。私は、デフォルトリポジトリから入れるものを扱うaptinstall.shと、外部ソースを伴うプログラムを扱うprograms.shに、インストール用スクリプトを分けて整理しました。
デスクトップ環境のセットアップ
真っ新なデスクトップを手にするたびに(意図的であろうとなかろうと)、いつも忘れてしまうのが、デスクトップ環境の設定を思い出して探して変更するのにどれだけ時間がかかるかということです。キーボードショートカット、ワークスペース、サウンド設定、ナイトモード…積もり積もればかなりの時間になります!
幸い、これらの設定はどこかに非グラフィカルな形式で保存されているはずです。ということは、その仕組みを突き止められれば、bashスクリプトで設定を簡単に操作できる可能性が高いわけです。そこで登場するのがターミナルコマンドgsettings list-recursivelyです。
GNOMEデスクトップ環境には膨大な数の設定があります。(私のように「全部見せてくれれば自分で欲しいものを見つけるから!」というタイプなら)lessにパイプしてgsettings list-recursively | lessとすれば、リストをスクロールしやすくなります。あるいは、探しているものの当たりがついているならgrepで絞り込み、gsettings list-recursively | grep 'keyboard'とするのもよいでしょう。
設定の変更にはgsettings setコマンドを使います。目的の設定の構文を見つけるのは時に難しいので、最初にスクリプトを組む段階では、GUIで変更を加えてから、対応するgsettingsの行を見つけて値を記録しておくことをおすすめします。
ヒントが欲しい方は、GitHubで私のdesktop.sh設定スクリプトをご覧ください。
すべてをまとめる
スクリプトをモジュール化しておくと(シンボリックリンク用1つ、プログラムインストール用2つ、デスクトップ設定用1つ)、整理しやすいだけでなく、自動セットアップの一部だけを実行することもできます。たとえばコマンドラインしか使わないVPSを立てるなら、グラフィカルなプログラムやデスクトップ設定のインストールは不要ですよね。
とはいえ、すべてのスクリプトを実行したい場合、ひとつずつ実行するのは少し面倒です。ありがたいことに、bashスクリプト自体もターミナルコマンドで実行できるので、全スクリプトを実行するマスタースクリプトを書けば済みます!
新しいUbuntuデスクトップマシンのセットアップを担う私のマスタースクリプトはこちらです:
#!/bin/bash
./symlink.sh
./aptinstall.sh
./programs.sh
./desktop.sh
# すべてのアップグレードを取得
sudo apt upgrade -y
# bashの変更を反映
source ~/.bashrc
# 楽しい挨拶
figlet "... and we're back!" | lolcat
念のためアップグレード行も加えています。これにより、真っ新なデスクトップにインストールされたプログラムが最新の更新を確実に受け取れます。これで、たったひとつのシンプルなbashコマンドですべてが完了します!
お気づきかもしれませんが、デスクトップの見た目と動作は馴染みのあるものになった一方で、これらのスクリプトがカバーしていない非常に重要な領域があります。それは「ファイル」です。信頼できる外部ハードウェアを使ったバックアップ方法を持っていることを願います。もし持っていないなら、GitHubやGitLabのような外部リポジトリホストに作業ファイルを置く習慣がある方には、bashワンライナーでGitHubリポジトリを自動クローン&バックアップする方法もあります。
ただし、外部リポジトリホストに頼っても100%の網羅にはなりません。外部ホストのリポジトリには置かない(公開・非公開を問わず)ファイルは当然pullできませんし、含まれるファイルから生成できないGit無視オブジェクト(秘密鍵やシークレットなど)は再現されません。とはいえ、そうしたファイルは小さいものが多いので、暗号化USBメモリ数本にたくさん収まるでしょう(秘密鍵のバックアップをまだ持っていないなら、まずそれを優先すべきかもしれません?)。
というわけで、本記事がdotfileとbashスクリプトによる真っ新なデスクトップの自動セットアップのヒントになれば幸いです。便利な設定を見つけたら、ぜひ自分のdotfileを共有して、他の人の発見にも協力してください!
-
Bash-it – スクリプトとエイリアスを一元管理できるBashフレームワーク
Bash-itは、Bash 3.2+向けに設計されたコミュニティ製のBashコマンド&スクリプト集です。自動補完、テーマ、エイリアス、カスタム関数などが最初から含まれており、日々の作業でシェルスクリプトや独自コマンドを開発・管理・活用するための実用的なフレームワークを提供します。 Bashシェルを日常的に使っていて、散らかりがちなスクリプト、エイリアス、関数を簡単に一元管理したいなら、Bash-itは最適な選択肢です。~/binディレクトリや.bashrcファイルを汚すことなく、Bash-itをフォーク/クローンして、快適なシェル環境づくりを始めましょう。 LinuxへのBash-itのインス
-
Ubuntu Linuxのアップデート方法【デスクトップ・サーバー両対応ガイド】
デスクトップ版のUbuntu Linuxをお使いの場合、内蔵のアップデートツールによって定期的に更新を促されます。しかし、Ubuntu Serverを使用している場合や、保留中のアップデートを手動で確認・実行したい場合には、コマンドラインからの操作方法を知っておく必要があります。 このチュートリアルでは、デスクトップ版とサーバー版の両方でUbuntu Linuxをアップデートするために必要な手順を解説します。あわせて、以下の関連記事も参考にしてください。 aptとapt-getコマンドの違いとは? 「lsb_release」コマンドでUbuntu LinuxのOSバージョンを確認する方法