Ubuntu22.04インストール後にやることを(半)自動セットアップできるようにした

2023/01/05に公開

最近、自分の開発用PCをWindowsからUbuntuに移行したので、その覚書です。
環境構築中にOSぶっ壊れたり、変な挙動したりと、何回もインストールする羽目になるだろうと思っていて、実際15回くらいインストールし直したので、作っておいてよかったです。

GitHubリポジトリ

Usage

  1. CLI操作

    cd
    git clone https://github.com/senkenn/ubuntu-setup.git
    cd ubuntu-setup
    ./zsh/zsh-setup.sh # Zshのインストール
    zsh
    ./ubuntu-setup.sh [Git user name] [Git user email] [Rust Toolchain Version] [Reboot at the end(y/n)] # その他Ubuntuの設定
    
  2. GUI操作

    • 外見のスタイル
    • 日本語キーマップ
    • CopyQの設定

1. Zshのインストール

Zsh及び、ZshプラグインのPowerlevel10kをインストールします。

ubuntu-setup/zsh/zsh-setup.sh
#!/bin/bash

# install zsh
sudo apt-get install -y zsh
sudo sed -i.bak "s|$HOME:/bin/bash|$HOME:/bin/zsh|" /etc/passwd

# Powerlevel10k
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $HOME/.p10k

cp $HOME/ubuntu-setup/zsh/.zshrc $HOME
cp $HOME/ubuntu-setup/zsh/.p10k.zsh $HOME

Zshインストール後、sedコマンドでデフォルトのシェルをZshに変更しています。
そして予め用意しておいた.zshrcと、p10kの設定ファイル.p10k.zshをホーム下にコピーします。

2. ubuntu-setup.shファイルの実行

引数に環境変数を渡します。

./ubuntu-setup.sh [Git user name] [Git user email] [Rust Toolchain Version] [Reboot at the end(y/n)]

まず引数の数をチェック。足りなかったら突き返します。

ubuntu-setup.sh
#!/usr/bin/zsh

if [ $# -lt 4 ]; then
  echo Error: Missing arguments
  echo "./ubuntu-setup.sh [Git user name] [Git user email] [Rust Toolchain Version] [Reboot at the end(y/n)]"
  exit
fi

次に入力の確認を促します。

ubuntu-setup.sh
GIT_USERNAME=$1
GIT_USEREMAIL=$2
RUST_TOOLCHAIN=$3
echo "Git User Name         : $1"
echo "Git User Email        : $2"
echo "Rust Toolchain Version: $3"
echo "Reboot at the end(y/n): $4"

read "yn?ok? (y/N): "
case "$yn" in [yY]*) ;; *) echo "abort." ; exit ;; esac

こちらを使わせていただきました。

3. ホーム下のディレクトリ名を日本語から英語へ

ubuntu-setup.sh
LANG=C xdg-user-dirs-gtk-update

参考リンク

4. システム言語を英語に

ubuntu-setup.sh
sudo update-locale LANG=en_US.UTF8

これにはなんかかっこいいから以外に理由があって、日本語だとVSCodeのフォント幅がアルファベット:日本語 = 1:2になってしまい、とても見づらいのです。

システム言語が日本語⇩

システム言語が英語⇩

もちろん、VSCodeはeditor.fontFamilyでエディター部もターミナル部もフォントを変えられますが、個人的にしっくりくるフォントがありませんでした、、、
今後、VSCode以外にもこのような支障が出てくると考えたらもう英語でいいやとなりました(なんかかっこいいし)。

じゃあ最初から英語インストールしとけよってなるかもしれませんが、20.04か22.04からかは忘れましたが、日本語でインストールするとMozcがデフォルトでもれなくついてくるし、言語サポートで日本語のインストール促してくれるしでメリットが多いのです。なので一度日本語でインストールしたあとに英語に戻しています。

5. Gitの設定

ubuntu-setup.sh
git config --global user.name $GIT_USERNAME
git config --global user.email $GIT_USEREMAIL
git config --global init.defaultBranch main
git config --global --add safe.directory "*"

コマンドライン引数で受け取った値を入れています。

最後のは2022年の4月に脆弱性が発見されたものに対する対策ですね。ワイルドカードはあんま良くないでしょうが、まあシングルユーザーだし、/home下でしか作業しないのでよしとします。
詳しくは以下を参照

6. ログインキーリングの削除

ubuntu-setup.sh
cp $HOME/.local/share/keyrings/login.keyring ./login-bak.keyring && rm -f $HOME/.local/share/keyrings/login.keyring

おそらくUbuntuへのログインを自動ログインにすると、VSCodeやChromeを開くときにこんな感じでパスワードを求められると思います。

詳しくは以下を参照

なのでそのためのログインキーリングの削除ですね。セキュリティ上よろしくないでしょうが、家から持ち運んで外で作業するようなことが少ないのでまあこれも良しとします。
意味があるかはわかりませんが、一応バックアップを残すようにしてあります。

7. VSCode

ubuntu-setup.sh
curl -L "https://go.microsoft.com/fwlink/?LinkID=760868" -o vscode.deb
sudo apt-get install -y ./vscode.deb && rm ./vscode.deb
sudo apt-get install -y python3-venv # for PlatformIO extension

venvは、ArudinoやESP32などでPlatformIOを使う機会があるので、そのためです。

VSCodeにもChromeと同じように、設定の同期をすることができますのでおすすめです。MicrosoftかGitHubのアカウントがあれば同期できます。
ちなみに、キーバインドはOSごとに異なるので注意が必要です。WindowsとUbuntuを同期させようといろいろ拡張機能を試しましたが、良さそうなのがありませんでした。もしおすすめの拡張機能をご存知でしたら教えていただきたいです。

8. Chrome

ubuntu-setup.sh
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt-get install -y ./google-chrome-stable_current_amd64.deb && rm ./google-chrome-stable_current_amd64.deb

9. Discord

ubuntu-setup.sh
wget -O ./discord.deb "https://discordapp.com/api/download?platform=linux&format=deb"
sudo apt-get install -y ./discord.deb && rm ./discord.deb

10. Slack

ubuntu-setup.sh
sudo snap install slack

Slackはコマンドラインで最新版を取得する方法が見つからなかったのでSnapでインストールします。
3分くらい時間がかかるし、Snap版はバグが出やすいのであまり使いたくないんですけどね、、、しょうがなく。インストールしてる間にインストールが終わった他のVSCodeとかChromeのアカウントログインでもしておくといいでしょう。

11. CopyQ

ubuntu-setup.sh
sudo apt-get install -y copyq

コピー履歴を参照・管理できるツール。

インストール後、設定から「自動的に起動する」にチェック。

メインウィンドウ(コピー履歴の表示)のグローバルショートカットを追加。
WindowsのWin+Vと同じにしたいのですが、デフォルトでは通知ウィンドウの開閉に割り当たっているので、このあとのgsettingsでUbuntuのショートカットを変更後、Super(Meta)+Vに割り当てています。

あと、CopyQはスクリーンショットも範囲選択したあとに指を離したら自動的にスクショしてくれてWindowsっぽくて好きなのですが、背景が真っ暗になってコピーしたクリップボード画像も真っ黒になってしまうのです。22.04でWaylandになったせいでしょうかね、、、(同じ人いないかググってみたけど見つからなかった)

12. Rust

ubuntu-setup.sh
sudo apt-get install -y gcc
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \
    sh -s -- -y --default-toolchain "${RUST_TOOLCHAIN}"
source "$HOME/.cargo/env"

公式通りにインストールします。ここもコマンドライン引数で受け取ったToolchainのバージョンを指定。

最後のはこのあと早速cargoを使うので、パスを通すために環境変数を読み込み直しています。

13. xremap

ubuntu-setup.sh
cargo install xremap --features gnome

リマッパーです。ホットキーの設定などができます。すげえ人が作ったやべえリマッパーです。詳しいことは作者の開発経緯ブログへどうぞ。

また、xremapをOS起動とともに自動で起動させるようにします。

ubuntu-setup.sh
sudo cp $HOME/ubuntu-setup/xremap/xremap.service /etc/systemd/system/
sudo systemctl enable xremap.service

なお、これに関してはちょっと長くなりそうなので別記事で書きたいと思います。

14. Docker Engine

ubuntu-setup.sh
sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

公式に則ってインストールしています。

私はDocker Desktopがあまり好きではないのでインストールしていません。

そして、sudoなしでもdockerコマンドが使えるようにsudoグループに追加します。

ubuntu-setup.sh
sudo groupadd docker
sudo usermod -aG docker $USER

15. Volta

ubuntu-setup.sh
curl https://get.volta.sh | bash
echo 'export VOLTA_HOME="$HOME/.volta"' >> $HOME/.zshrc
echo 'export PATH="$VOLTA_HOME/bin:$PATH"' >> $HOME/.zshrc

nodeやyarnなどのバージョン管理ツールです。

16. UbuntuのキーバインドやUIの変更

gsettingsコマンドを使って変更していきます。基本的にWindowsっぽくしています。
gsettings.shファイルにまとめています。

# keybindings
# 左のワークスペースに移動(Windows like)
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left "['<Super>Page_Up', '<Super><Alt>Left', '<Control><Super>Left']"

# 右のワークスペースに移動(Windows like)
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right "['<Super>Page_Down', '<Super><Alt>Right', '<Control><Super>Right']"

# 上のワークスペースに移動
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-up "['<Control><Super>Up']"

# 下のワークスペースに移動
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-down "['<Control><Super>Down']"

# ウィンドウのリサイズ。VSCodeの"Alt + F8"とかぶるので変更
gsettings set org.gnome.desktop.wm.keybindings begin-resize "['<Super>F8']" # Because it conflicts with "Alt + F8" in VSCode

# スクリーンショット(Windows like)
gsettings set org.gnome.shell.keybindings show-screenshot-ui "['Print', '<Super><Shift>s']"

# 通知トレイ
gsettings set org.gnome.shell.keybindings toggle-message-tray "['<Ctrl><Super>v', '<Super>m']"

# VSCodeの"Ctrl + .", "Ctrl + ;"とかぶるため変更
gsettings set org.freedesktop.ibus.panel.emoji hotkey "[]" # previous setting: ['<Control>period', '<Control>semicolon']

# UI
# ダークテーマにする
gsettings set org.gnome.desktop.interface color-scheme "prefer-dark"

# Fix windswitcher extending and retracting up and down.
gsettings set org.gnome.desktop.interface font-name 'Noto Sans CJK JP 11'

# ドックを先頭似表示
gsettings set org.gnome.shell.extensions.dash-to-dock show-apps-at-top true

# ドックを下部に配置
gsettings set org.gnome.shell.extensions.dash-to-dock dock-position "BOTTOM"

# ドックのアイコンサイズ
gsettings set org.gnome.shell.extensions.dash-to-dock dash-max-icon-size 24

# お気に入りにするアプリのリスト(順番も適用される)
gsettings set org.gnome.shell favorite-apps "['google-chrome.desktop', 'code.desktop', 'org.gnome.Nautilus.desktop', 'discord.desktop', 'slack_slack.desktop']"

# Others
# ワークスペースを切り替えるときにすべてのディスプレイを切り替える
gsettings set org.gnome.mutter workspaces-only-on-primary false # workspaces on all displays

# 入力ソースでMozcを最初にする
gsettings set org.gnome.desktop.input-sources sources "[('ibus', 'mozc-jp'), ('xkb', 'jp')]" # Change the order of input sources

# 画面オフを15分にする
gsettings set org.gnome.desktop.session idle-delay "uint32 900"

# 画面オフ時に画面ロックしない
gsettings set org.gnome.desktop.screensaver lock-enabled false

ここらへんは個人の好みですね。基本的にGUIでできることは全部CUIでできますね。

UIはこんな感じ(ほんとは上のメニューバーも下に位置させたい、、、)

スタイルでダークテーマにしていますが、ここはコマンドで変更したあと、一度設定から「外観」にアクセスしないとダークに切り替わりません。なんだこの仕様、、、

ちなみに、次のコマンドでgsettingsで設定できるコマンドやスキーム名、その値などを一覧表示できます。

gsettings list-schemas | gsettings list-recursively

あとはgrepとかで絞り込んで求めているものを探してました。

17. 日本語キーボードのキーマップ

私は日本語キーボードを使っていて、無変換をIMEオフに設定しています。ちなみにIMEオンはxremapを使って変換+無変換でIMEオンにしています。
設定をテキストファイルでエクスポートできるので、予めエクスポートしたものをインポートしていきます。

Ubuntuの設定からキーボードでMozcの設定を開きます。ちなみにこれが開けない場合がありますが、大体は言語サポートで日本語をインストールしていないだと思います。

"Keymap style"の"Customize"から

"Edit"で"Import from file"からインポートするファイルを選びます。リポジトリにはkeymap.txtで置いてあります。

エクスポートも一番下の"Export to file"で行いました。
ここも自動化できるのかな?できたらしたい。

その他

今回は、もともとWindows11が入っていたHPのPavilionのノートPCにUbuntu22.04をインストールしたのですが、いくつか問題がありました。

  • 起動時に黒いBIOS画面?で10行くらいの謎のエラー文が出る(今は特に問題なく動作しているので無視している。おそらくドライバがないよとかのエラーだと思われる)
  • トラックパッドのスワイプ操作などが動作しない
  • 指紋認証が反応しない

今度しっかり調査してUbuntuと相性のいいPCを買いたいですね。

今後の展望

  • ファイアウォールの設定(今はコメントアウト中)
  • すべてが正常にインストールされているかのチェック
  • 日本語キーマップの自動インポート

Discussion