Skip to content

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 ディレクトリを作成しました. また pluginspyenv-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_aliasesxkeysnail を再起動するための 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

  1. 個人的に慣れているため pyenv + virtualenv を採用していますが, 最近はあまりこの組み合わせは推奨されていないようです. この構成が deprecated にならないことを祈っています. 

  2. このときは Python 3.10 がリリースされていたが使いたいパッケージ (このときは Pytorch) が対応していなかったので 3.9 系をインストールしました. pyenv 経由でインストールしておくとこういった小回りがきくので助かります. 

  3. スペースキーにシフトキーの機能も持たせる設定 (= Space and Shift) です. 他のキーと同時押しすることでスペースキーがシフトキーとして機能します. 

  4. このファイルは VSCode のバージョンが変わるたびに刷新されるので毎回変更しています… 

  5. もしかすると .box/Dropbox という通常ののディレクトリを作って client に認識させてから削除 → シンボリックリンクに置き換えという手順だったかもしれません. 試行錯誤の末にたどり着いた構成なので記憶が曖昧です.