Thinkpad X1 nano
ノートパソコン Thinkpad X1 nano を購入したときに実施した初期設定について記述します. 購入した計算機についての情報は以下のとおりです.
- Model Name: X1 nano Gen1
- Type Number: 20UN-CT01WW
- Fabrication in 2021/05
Install Linux Mint
まずは Windows を消去して Linux Mint をインストールします. この当時使用可能だった Linux Mint 20.1 Cinnamon Edition を選択しました.
$ cat /etc/linuxmint/info
RELEASE=20.1
CODENAME=ulyssa
EDITION="Cinnamon"
DESCRIPTION="Linux Mint 20.1 Ulyssa"
DESKTOP=Gnome
TOOLKIT=GTK
NEW_FEATURES_URL=https://www.linuxmint.com/rel_ulyssa_cinnamon_whatsnew.php
RELEASE_NOTES_URL=https://www.linuxmint.com/rel_ulyssa_cinnamon.php
USER_GUIDE_URL=https://www.linuxmint.com/documentation.php
GRUB_TITLE=Linux Mint 20.1 Cinnamon
なお Linux の USB インストールメディアが USB3.0 経由では認識されないという問題がありました. あいにく X1 nano には Type-C の USB コネクタしかなかったため, インストールメディアを USB2.0 で認識させるためには Type-C のコネクタを持ちつつ USB2.0 にしか対応していない USB ハブを経由する必要がありました.
System Update
まずは何も考えずにネットワークにつないでシステムを最新の状態にしておきます.
$ sudo apt update
$ sudo apt upgrade
GUI setting
GUI 周りの設定を済ませておきます.
- Keyboard 設定から Caps-lock を Ctrl に変更
- Mouse & Touchpad 設定からタッチパッドを使用不可に設定
- Windows 設定から以下の 3 つを変更
- タイトルバー上でのマウスホイール操作を Adjust opacity に設定
- Window focus mode を Sloppy に設定
- Focus mode for new windows を Smart に設定
Console setting
ターミナル関係の設定をします. 入力補間を case-insensitive にする設定を追加しました. また Ctrl-p``,
Ctrl-n` で履歴検索ができるように設定しました.
$ cat ~/.inputrc
# ignore case in completion
set completion-ignore-case on
# set history-search
"\C-p": history-search-backward
"\C-n": history-search-forward
最低限の aliases を設定しておきます. 最後の行は自作のバックアップスクリプトを簡単に実行するためのものです.
#!/bin/bash
alias emacs='emacs -nw'
alias rm='rm -i'
alias mv='mv -i'
alias cp='cp -i'
## backup ##
alias backup="sudo /home/rohsawa/.local/bin/diff_backup /home /media/rohsawa/BACKUP"
新たに ~/.bash_variables
というファイルを作成して環境変数を定義します. 最低限の環境変数として以下を定義しました.
#!/bin/bash
# set default PAGER to less
export PAGER="less"
# set default gnuplot terminal to wxt
export GNUTERM='wxt'
起動時にこのファイルを読み込むように ~/.bashrc
に以下の設定を書き加えます.
if [ -f ~/.bash_variables ]; then
. ~/.bash_variables
fi
また shell の補間で $HOME
などの変数を展開するように ~/.bashrc
に以下の設定を追加します.
shopt -s direxpand
Git setting
Git の基本設定を済ませておきます. global 設定の内容は以下のとおりです. git-lfs
のインストールをしておく必要がありますが, ここでは省略します.
$ git config -l --global
user.name=Ryou Ohsawa
[email protected]
push.default=simple
color.ui=true
alias.wdiff=diff --word-diff
alias.cdiff=diff --word-diff --word-diff-regex=.
alias.tree=log --graph --oneline --exclude=refs/remotes/origin/gh-pages --all
diff.wserrorhighlight=all
core.editor=vi
pull.ff=only
fetch.prune=true
init.defaultbranch=master
pager.log=less
filter.lfs.required=true
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
Install Python
Python 環境をインストールします. 異なるバージョンの Python を使用できるようにするため, またシステムにインストールされている Python 環境はできるだけ触らないようにするため, pyenv
をもちいてローカルに Python 環境をインストールします.1
まずは Python のビルドに必要なパッケージをインストールします.
$ sudo apt install build-essential zlib1g-dev \
liblzma-dev libncurses5-dev libgdbm-dev libnss3-dev \
libssl-dev libreadline-dev libffi-dev libbz2-dev \
libsqlite3-dev wget screen
GitHub から pyenv
を clone します. 慣習に倣って .pyenv
ディレクトリを作成しました. また plugins
に pyenv-virtualenv
を clone して virtualenv
を使えるようにしておきます.
$ git clone https://github.com/pyenv/pyenv.git .pyenv
$ cd .pyenv/plugins/
$ git clone https://github.com/pyenv/pyenv-virtualenv.git
~/.bash_pyenv
というファイルを作成して pyenv
を有効にするための設定を記述します.
#!/bin/bash
export PYENV_ROOT="/home/rohsawa/.pyenv/"
export PATH="${PYENV_ROOT}/bin:${PATH}"
eval "$(pyenv init --path)"
eval "$(pyenv virtualenv-init -)"
~/.bashrc
に以下の設定を追記して設定が自動で読み込まれるようにします. ターミナルを再起動して pyenv
コマンドが使えるようになっていることを確認します.
if [ -f ~/.bash_pyenv ]; then
. ~/.bash_pyenv
fi
今回は Python 3.9.9 をインストールしました.2 ついでに pip
を最新にしておきます.
$ pyenv install 3.9.9
$ pyenv global 3.9.9
$ pip install --upgrade pip
SandS by xkeysnail
SandS3 を使用するために xkeysnail
をインストールします.
$ pip install xkeysnail
xkeysnail
はシステムのかなりローレベルな機能を使用しているため, 管理者権限で実行するか適切な権限をもつアカウントで実行する必要があります. そこで miy4 さんの記事 を参考にしながら xkeysnail
を実行するためのユーザを作成して運用することにしました.
まずは xkeysnail
ユーザを作成します.
$ sudo groupadd uinput
$ sudo useradd -G input,uinput -s /sbin/nologin xkeysnail
以下の設定を追加して xkeysnail
に /dev/input
へのアクセスを許可させます.
$ cat /etc/udev/rules.d/40-input-xkeysnail.rules
KERNEL=="event*", NAME="input/%k", MODE="660", GROUP="input"
起動時に自動的に SandS が有効になるように設定します. xkeysnail
ユーザとして xkeysnail
を実行するときにパスワードを求められないようにしておきます.
$ cat /etc/sudoers.d/10-installer
rohsawa ALL=(ALL) ALL,\
(xkeysnail) NOPASSWD: /home/rohsawa/.pyenv/shims/xkeysnail
実行するための準備が整ったので SandS を実行するためのスクリプトを用意します.
#!/bin/bash
XKEYSNAIL=$(which xkeysnail)
CONFIG=$(dirname "$0")/config.py
while :;
do
if [ ! -z "${XKEYSNAIL}" ]; then
xhost +SI:localuser:xkeysnail
sudo -u xkeysnail DISPLAY=${DISPLAY} ${XKEYSNAIL} ${CONFIG}
fi
done
ここでは xkeysnail
ユーザに既存のディスプレイへのアクセスを許可するために xhost
で権限を与え, コマンドを sudo
を介して実行しています. sudoers.d
に記述した設定のおかげでパスワードを聞かれることはありません. このスクリプトを sands.sh
として適当なディレクトリに保存しておきます. キーリマップの設定は引数として与えている consig.py
に記載されています. SandS を有効にするための設定は以下のとおりです.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
from xkeysnail.transform import *
define_multipurpose_modmap({
Key.SPACE: [Key.SPACE, Key.LEFT_SHIFT],
})
define_keymap(re.compile('Google-chrome'), {
K('C-h'): Key.BACKSPACE,
}, 'Chrome BackSpace')
起動時に自動実行させるための設定を追加します. ~/.config/autostart
以下に適切な設定ファイルを記述します. ここでは sands.desktop
というファイルを作成しました.
[Desktop Entry]
Name=SandS by xkeysnail
Exec=/home/rohsawa/Packages/sands/sands.sh
Type=Application
Terminal=false
MimeType=text/plain
X-GNOME-Autostart-Delay=3
~/.bash_aliases
に xkeysnail
を再起動するための alias を追加ます. 該当するプロセスを強制終了させることで立ち上げ直します. 以前の計算機ではたまに効かなくなったことがあったために用意しました, この計算機になってから alias のお世話になった記憶はありません.
## Restart xkeysnail
alias snail='sudo kill $(ps aux | grep -e "^root.*snail" | awk "{print \$2}")'
Install TeXLive
Linux Mint ではパッケージマネージャから TeX 環境が簡単にインストールできますが, メジャーバージョンをアップグレードするなどの自由が効かないので, 公式のドキュメントに沿って TeX Live をインストールすることにしました.
install-tl-unx.tar.gz
をダウンロードして Quick install for Unix に沿ってコマンドを実行します.
適当な作業ディレクトリ (/tmp
) に移動してダウンロードしたアーカイブを展開します. 当時ダウンロードしたアーカイブには install-tl-20211227
が含まれていました. install-tl
を実行することで TeX Live 2021 のインストールが完了します (かなり時間がかかるので注意).
$ cd /tmp
$ tar xvvf ~/Downloads/install-tl-unx.tar.gz
$ cd install-tl-20211227
$ sudo perl ./install-tl --no-interaction
$ ls /usr/local/texlive/ -l
total 8
drwxr-xr-x 9 root root 4096 Mar 3 2022 2021
drwxr-xr-x 10 root root 4096 Jul 18 17:56 texmf-local
コンパイルに必要なコマンドは /usr/local/texlive/2021/bin/x86_64-linux/
にまとまっています. 起動時にこのディレクトリが PATH
に含まれるように .bash_variables
に以下の設定を追記します.
# add PATH to TeXLIVE 2021
export PATH="/usr/local/texlive/2021/bin/x86_64-linux/:${PATH}"
Install gnuplot
パッケージマネージャからは最新のバージョンがインストールできないので自前でビルドしまし. 公式ウェブページ 経由でインストールしたいバージョンをダウンロードします. 今回は version 5.4.2 をダウンロードしました.
$ cd Packages
$ tar xvf ~/Downloads/gnuplot-5.4.2.tar.gz
$ ln -s gnuplot-5.4.2 gnuplot
$ cd gnuplot
$ ./configure --with-readline=gnu
./configure
の出力を見ながら必要な機能が揃うまで根気よく apt install
でライブラリを追加していきます (メモを忘れました). 最終的に make && make install
して完了です.
$ make
$ make install
Install VSCode
公式サイト から .deb
ファイルをダウンロードします. Linux x64 であれば以下のリンクをブラウザで開くだけで最新の .deb
ファイルのダウンロードが始まります.
ダウンロードしてきたパッケージをインストールします. 今回は version 1.63 でした.
$ sudo apt install ./code_1.63.2-1639562499_amd64.deb
インストールすると /etc/apt/sources.list.d
に (おそらく) 自動で vscode.list
というファイルが追加されます. 以後, 新しいバージョンが出たら apt update && apt upgrade
でインストール可能になります.
$ cat /etc/apt/sources.list.d/vscode.list
### THIS FILE IS AUTOMATICALLY CONFIGURED ###
# You may comment out this entry, but any other modifications may be lost.
deb [arch=amd64,arm64,armhf] http://packages.microsoft.com/repos/code stable main
GUI のメニューから起動すると自動で前回開いていたディレクトリを開くようになっています. この設定をオフにする機能が見つからなかったので /usr/share/applications/code.desktop
を編集して, GUI のメニューから起動したときには空のウィンドウを開くように設定します.4
--- /usr/share/applications/code.desktop.orig
+++ /usr/share/applications/code.desktop
@@ -1,18 +1,18 @@
[Desktop Entry]
Name=Visual Studio Code
Comment=Code Editing. Redefined.
GenericName=Text Editor
-Exec=/usr/share/code/code --unity-launch %F
+Exec=/usr/share/code/code --new-window %F
Icon=vscode
Type=Application
StartupNotify=false
StartupWMClass=Code
Categories=TextEditor;Development;IDE;
MimeType=text/plain;inode/directory;application/x-code-workspace;
Actions=new-empty-window;
Keywords=vscode;
[Desktop Action new-empty-window]
Name=New Empty Window
Exec=/usr/share/code/code --new-window %F
Icon=vscode
Install Docker
最新のバージョンを使用するために Docker 公式のリポジトリを追加します.
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" \
| sudo tee /etc/apt/sources.list.d/docker.list
これで最新の Docker をパッケージマネージャに追加することができました. 必要なパッケージをインストールします.
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
Install Onedrive
GitHub に Linux 用の Onedrive client が公開されています (abraunegg/onedrive). 下記のドキュメントに記されている手順に従ってインストールします.
- https://github.com/abraunegg/onedrive/blob/master/docs/ubuntu-package-install.md
もし間違った client をインストールしていたら削除しておきます. OpenSuSE Build Service repository でホストされているリポジトリを追加してインストールします.
$ wget -qO - https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_20.04/Release.key \
| sudo apt-key add -
$ echo 'deb https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_20.04/ ./' \
| sudo tee /etc/apt/sources.list.d/onedrive.list
$ sudo apt-get update
$ sudo apt install --no-install-recommends --no-install-suggests onedrive
Install Dropbox
公式のリポジトリからインストールします. メモによると PyGObject
をインストールするために追加で以下の -dev
パッケージが必要になったようです. トラブルの詳細は覚えていません.
$ sudo apt install dropbox
$ sudo apt install python3-dev libcairo2-dev libgirepository1.0-dev
$ pip install PyGObject
インストールされる dropbox
自体は Python スクリプトになっています. この中で使用されている threading.Event.isSet
が deprecated になってるのでスクリプトを書き換えました. この操作は最新のバージョンでは必要ないかもしれません.
$ sudo sed 's/isSet()/is_set()/' /usr/bin/dropbox -i
Dropbox クライアントはディレクトリを置く場所は選べてもディレクトリ名 (Dropbox
) を変えることはできません. 今回は ~/Documents/dropbox
という場所で運用したかったので以下のようなトリックを使いました.
$ cd ~/Documents
$ mkdir dropbox
$ mkdir .box
$ ln -s dropbox .box/Dropbox
$ ls -l ~/Documents/.box
total 0
lrwxrwxrwx 1 rohsawa rohsawa 11 Dec 28 2021 Dropbox -> ../dropbox/
Dropbox client には ~/Documents/.box/Dropbox
を共有ディレクトリにするよう設定しておきます. すでに Dropbox
という名前のシンボリックリンクが存在しているので, client は新しいディレクトリを作ることなくこの場所を使用してくれます.5 普段使用している分には .box
ディレクトリは見えないので気になりません.
Other applications
その他必要なアプリケーションをインストールしました (必要に応じて追記).
$ sudo apt install inkscape
$ sudo apt install swarp
$ ln -s /usr/bin/Swarp ~/.local/bin/swarp
-
個人的に慣れているため
pyenv
+virtualenv
を採用していますが, 最近はあまりこの組み合わせは推奨されていないようです. この構成が deprecated にならないことを祈っています. ↩ -
このときは Python 3.10 がリリースされていたが使いたいパッケージ (このときは
Pytorch
) が対応していなかったので 3.9 系をインストールしました.pyenv
経由でインストールしておくとこういった小回りがきくので助かります. ↩ -
スペースキーにシフトキーの機能も持たせる設定 (= Space and Shift) です. 他のキーと同時押しすることでスペースキーがシフトキーとして機能します. ↩
-
このファイルは VSCode のバージョンが変わるたびに刷新されるので毎回変更しています… ↩
-
もしかすると
.box/Dropbox
という通常ののディレクトリを作って client に認識させてから削除 → シンボリックリンクに置き換えという手順だったかもしれません. 試行錯誤の末にたどり着いた構成なので記憶が曖昧です. ↩