Dotfilesでバックアップ不要な開発環境
ArchLinuxで仕事をするようになって結構な年月が経過したので、 ArchLinuxをメイン環境にしている現状について書いてみようと思います。
一般的にArchLinuxは玄人向けで普通の人が使うディストリビューションではないと言われているようです。 コマンドラインでの作業が必須になるので一般人には勧められないですが、ソフトウェアエンジニアが開発環境にするディストリビューションとしてはオススメできます。 何か必要になったらたいていのものはパッケージ1で揃います。 ArchLinuxを使うようになってプログラムを自前でビルドすることはほとんどなくなりました。 これは本当に楽で何かを始めるときに億劫になることがほとんどなくなります。
Arch Linux
ArchLinuxのパッケージの最新安定版はユーザー数が少ないので、変な使いかたをするとバグがでることもあります。 それは開発元の最新の安定版を利用しているから起きることです。 GitHubなどで開発されているソフトウェアの最新安定版は作者が想定した使い方の範囲内ではバグはそんなにでません。 たまにあってもそういうバグはArchLinuxユーザーが開発元に報告をいれるので1日以内になおることがほとんどです。 バグがなおるまでの対処法はこちらに書いておきます。 DebianやUbuntuなどのディストリビューションはユーザーが多いので、作者がテストしていない設定ファイルの組み合わせなど を使うユーザーがでてきます。そういったバグをユーザー数の多さで潰していくのです。
ArchLinuxには先端のとがったユーザーが多いと思われているようですが、実際は素直に使っていることがほとんどだと思います。 自分の開発しているソフトウェアやいれこんでいるソフトウェアだけGitHubのmainリポジトリをビルドすればよいのです。 それ以外のソフトウェアはArchLinuxのパッケージで提供される最新の安定版を素直に使えばそれほど難しくはないと思います。
バックアップとdotfiles
環境構築に話を移します。 環境がいつでも再現できるようにMakefileを作ったところ まったく期待していなかった副作用として バックアップについては一切考慮しなくてもよくなりました。 これは嬉しい誤算でひどいマシントラブルがあったとしても 何も考えずにThinkPadに対してmake allinstall するだけでよいのです。 バックアップしなくてもよい環境に慣れてしまうともう以前の環境には戻れません。 以下は私のGitHubのdotfilesのファイルを説明します。
Makefileとdotfilesで開発環境を作る
このドットファイルはArchLinux向けです。 makeがないディストリビューションなど存在しないので Makefileを作ればどんなディストリビューションにも対応できます。お好きなディストリビューション向けに書き換えてください。 さっそくMakefileを作りましょう。
Makefileがあるといいこと
環境構築がコマンド一つでできます。
make install
再び自分のPCを設定することについて心配する必要はありません。
デプロイがすぐできるdotfiles
このコマンドでデプロイできる。
make init
Makefileを使用すると、通常の開発環境を1時間以内に回復できます
クリーンインストールは最高のセキュリティ対策です。 定期的にクリーンインストールを行っていれば、オープンソースのメインラインにウイルスが入らない限りかなりセキュアな環境になります。オープンソースのメインラインにウイルスを入れるのはソフトウェアエンジニアが協力して開発している限りかなり難しいでしょう。ケン・トンプソンが初期のUNIXに仕込んだソースコードを読んでもわからないバックドアもありますが、現代においてはコンパイラもオープンソースなのでこのようなことは難しいと思います。2
make backup
環境作成後このコマンドでインストールされている ArchLinuxパッケージリストがGitHubのarchlinuxディレクトリにバックアップされます。 これは念の為ArchLinuxパッケージリストを保存しているだけです。
make allinstall
Makefileのallinstallの後に書かれているものすべてをインストールできます。3 Makefileが完成していれば一時間以内にいつもの環境が回復するでしょう。
make allbackup
パッケージをすべてバックアップすることができます。
make allupdate
パッケージをすべて更新することができます。
メインのエディタはEmacsを使っています。
メーラーはneomuttを使っています。 (neomuttに関するうんちくはこちら)
backupをしなくてもいつもの環境をすぐ再生する要件を満たすためDropboxを利用します。
Dropboxによって管理される物の基準
-
GitHubに配置できないもの
ssh公開鍵などの機密情報
-
更新ファイルが多いので、GitHubと同期するのは面倒なもの
.zsh_history .mozc シェルの履歴やIMEのファイルなど
-
公開できないがデータを保護する必要があるもの
メールデータ。 メールが到着すると、Dropboxに同期されるようにするので、バックアップについて考える必要はありません。 GmailについてはneomuttのIMAPで処理するのでバックアップする必要はありません。
セキュリティ保護のためDropbox 2段階認証を設定するのを忘れないでください。 この時点でDropboxフォルダとgitリポジトリのファイルはバックアップ不要になりました。 ほとんどのバックアップが必要な作業はこの2つの場所だけで行います。 これにより環境が完成するとバックアップ不要となります。
ArchLinuxインストール
なぜArchLinuxか?
-
あなたのPCが壊れない限り、ArchLinuxはローリングリリースなので、再インストールする必要はありません。 もしPCが壊れても Makefileを作ったので新しいPCを買ってきて一時間以内にいつもの環境を構築できるので無敵です。
-
私のPCの開発環境は古いパッケージだと厳しいので、最新の安定版がすぐパッケージ化されるArchLinuxはとても良いです。
-
私はカスタマイズが好きですが、カスタマイズがあまりにも多く行われると、コミュニティの利益を得ることができないので良くありません。 ArchLinuxは過度のカスタマイズには適していないので、ちょうどよい感じです。 原則として、Archのパッケージは、バニラのソースから構築するポリシーです。 (バニラは、それがArchLinuxに独自のパッチを適用しないことを意味しま す) ArchLinuxの特有の問題は起こりそうもないので、これは良いです。
-
ArchLinuxは余分なものがないので軽量です。
ArchLinuxをダウンロード
https://www.archlinux.org/releng/releases/
USBインストールメディアを作成します。
sudo dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress oflag=sync
SSDは250Gしかありませんが、ArchLinuxとemacsを使用する環境には十分です。
USBメモリでbootする
UEFI BIOSでUSBメモリで起動するように変更してください。
パーティショニング
-
UEFIとGPTを使う
ハードウェアに合わせて選択してください。
-
パーティションは / のみ
めんどうなことは徹底的に排除します。 ディスクの暗号化は体感速度が落ちるので行いません。 パスワードなどのデリケートな情報だけ暗号化して管理します。 パスワードについてはこちらの記事をご覧ください。
- スワップは作らない。
ESP(EFIシステムパーティション)を作成します。 UEFIブートを行うため、FAT32フォーマットのパーティションを作成します。
gdisk /dev/sda
Command (? for help):n
Permission number: 1
First sector : enter
Last sector : +512M
Hex code or GUID : EF00
残りすべてを / パーティションに設定します
Command (? for help):n
Permission number: 2
First sector : enter
Last sector : enter
Hex code or GUID : 8300
ext4およびfat32でフォーマットする
mkfs.vfat -F32 /dev/sda1
mkfs.ext4 /dev/sda2
mount /dev/sda2 /mnt
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot
Wi-Fiとインターネット接続を設定
ip link
rfkill list
rfkill unblock 0
wifi-menu wlp0s29f7u1
viを開いて最上部に一番近いArchLinuxミラーをコピーします。 JAISTかTsukuba WIDEを指定すればよいでしょう。
vi /etc/pacman.d/mirrorlist
ArchLinuxのbese bese-develをインストールする
pacstrap /mnt base base-devel linux linux-firmware
fstabを生成する
genfstab -U -p /mnt >> /mnt/etc/fstab
bashログインシェルとしてマウントしてログインする
arch-chroot /mnt /bin/bash
ホスト名を設定する
echo thinkpad > /etc/hostname
ロケールを設定する
vi /etc/locale.gen
en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8
次に実行する
locale-gen
シェルは英語環境にする
export LANG=C
その他はUTF-8にする
echo LANG=ja_JP.UTF-8 > /etc/locale.conf
タイムゾーンの例
ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ln -sf /usr/share/zoneinfo/US/Pacific /etc/localtime
ハードウェアの時間調整
hwclock --systohc --utc
カーネルイメージを生成する
mkinitcpio -p linux
ユーザーを生成する
useradd -m -G wheel -s /bin/bash ${USER}
パスワードを設定してください
passwd ${USER}
グループと権限の設定
pacman -S vim
visudo
以下をコメントアウト
Defaults env_keep += “ HOME ”
%wheel ALL=(ALL) ALL
ブートローダの設定
pacman -S grub dosfstools efibootmgr
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub --recheck --debug
grub-mkconfig -o /boot/grub/grub.cfg
ドライバとXorg Gnomeの準備
環境に合ったドライバをインストールする
lspci | grep VGA
pacman -S intel-media-driver intel-ucode libva-utils
pacman -S xorg-server xorg-apps
Gnomeは必要に応じて小さく入れられます
pacman -S gnome-backgrounds
pacman -S gnome-control-center
pacman -S gnome-keyring
pacman -S nautilus
ターミナルはurxvtとxtermを使います
sudo pacman -S rxvt-unicode urxvt-perls
sudo pacman -S xterm
gdmでグラフィカルログインを有効にする
pacman -S gdm
systemctl enable gdm.service
networkを設定
pacman -S networkmanager
systemctl disable dhcpcd.service
systemctl enable NetworkManager.service
pacman -S otf-ipafont
exit
reboot
${USER}でログインしてホームディレクトリを整理する
ホームディレクトリは英語にする
sudo pacman -S xdg-user-dirs
LANG=C xdg-user-dirs-update --force
sudo pacman -S zsh git
sudo pacman -S noto-fonts noto-fonts-cjk chromium
yayをインストール
mkdir -p ~/src/github.com/aur
cd src/github.com/aur
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
dropboxをインストールして同期する
yay -S dropbox
yay -S nautilus-dropbox
dropbox
dotfilesを準備する
mkdir -p ~/src/github.com/masasam
cd src/github.com/masasam
git clone https://github.com/masasam/dotfiles.git
cd dotfiles
make install
make init
Dconf設定
sudo pacman -S dconf-editor
dconf write /org/gnome/desktop/input-sources/xkb-options "['ctrl:swapcaps']"
dconf write /org/gnome/desktop/interface/gtk-theme "'Adwaita-dark'"
dconf write /org/gnome/desktop/interface/gtk-key-theme "'Emacs'"
dconf write /org/gnome/desktop/interface/text-scaling-factor 1.25
dconf write /org/gnome/desktop/interface/clock-show-date true
dconf write /org/gnome/desktop/interface/clock-show-weekday true
dconf write /org/gnome/desktop/interface/show-battery-percentage true
dconf write /org/gnome/desktop/wm/preferences/num-workspaces 1
dconf write /org/gnome/desktop/wm/keybindings/activate-window-menu "['']"
dconf write /org/gnome/shell/keybindings/toggle-overview "'<Alt>space'"
dconf write /org/gnome/mutter/dynamic-workspaces false
ここまでは手動でインストールします。 ArchLinuxのインストールを自動化してもメリットは少ないです。 ベースにするパソコンを買い換えると変わってしまいますし、ここはコミュニティの利益を享受すること優先します。 これ以下はMakefileですべて片付けることができます。
開発環境のインストール
Pacmanでインストールするもの
sudo pacman -S firefox firefox-i18n-ja
sudo pacman -S sylpheed emacs curl xsel openssh tmux
sudo pacman -S zsh-completions keychain
sudo pacman -S powertop gimp unrar
sudo pacman -S file-roller xclip atool evince inkscape
sudo pacman -S cifs-utils gvfs gvfs-smb eog lhasa lzop
sudo pacman -S seahorse the_silver_searcher
sudo pacman -S cups-pdf htop neovim go pkgfile rsync elixir
sudo pacman -S nodejs whois nmap poppler-data ffmpeg
sudo pacman -S aspell aspell-en httperf asciidoc sbcl
sudo pacman -S gdb hub wmctrl gpaste pkgstats
sudo pacman -S linux-docs pwgen gauche screen ipcalc
sudo pacman -S arch-install-scripts ctags parallel
sudo pacman -S pandoc texlive-langjapanese texlive-latexextra
sudo pacman -S shellcheck php cscope typescript
sudo pacman -S noto-fonts-cjk arc-gtk-theme jq dnsmasq
sudo pacman -S docker zsh-syntax-highlighting
sudo pacman -S npm llvm llvm-libs lldb hdparm rxvt-unicode
sudo pacman -S mariadb-clients postgresql-libs tig lsof fzf
sudo pacman -S debootstrap tcpdump pdfgrep
sudo pacman -S alsa-utils mlocate traceroute hugo mpv jhead
sudo pacman -S nethogs optipng jpegoptim noto-fonts-emoji
sudo pacman -S debian-archive-keyring tree python-pip
sudo pacman -S mathjax strace valgrind phantomjs p7zip unace
sudo pacman -S yarn geckodriver w3m neomutt iperf redis
sudo pacman -S highlight lynx elinks mediainfo cpio flameshot
sudo pacman -S oath-toolkit imagemagick
sudo pacman -S bookworm ruby ruby-rdoc
Yayでインストールするもの
yay -S drone-cli
yay -S git-secrets
yay -S global
yay -S google-cloud-sdk
yay -S goobook-git
yay -S ibus-mozc
yay -S mozc
yay -S nkf
yay -S nodenv
yay -S peek
yay -S rbenv
yay -S ruby-build
yay -S screenkey
yay -S yaourt
yay -S yay
Pipでインストールするもの
mkdir -p ${HOME}/.local
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python ${PWD}/get-pip.py --user
pip install --user --upgrade pip
pip install --user virtualenv
pip install --user ansible
pip install --user ansible-lint
pip install --user docker-compose
pip install --user virtualenvwrapper
pip install --user seaborn
pip install --user ipywidgets
pip install --user scikit-learn
pip install --user scipy
pip install --user pandas
pip install --user matplotlib
pip install --user jupyter
pip install --user neovim
pip install --user pylint
pip install --user jedi
pip install --user autopep8
pip install --user flake8
pip install --user pyflakes
pip install --user pygments
pip install --user speedtest-cli
pip install --user selenium
pip install --user ansible-container
pip install --user scrapy
pip install --user mycli
pip install --user pgcli
pip install --user pip-review
pip install --user yapf
pip install --user pydoc_utils
pip install --user rope
pip install --user importmagic
pip install --user awscli
pip install --user progressbar2
pip install --user ranger-fm
pip install --user rtv
pip install --user jupyterthemes
pip install --user httpie
pip install --user trash-cli
pip install --user jupyterlab
pip install --user cheat
pip install --user faker
Golangでインストールするもの
mkdir -p ${HOME}/{bin,src}
GO111MODULE="on" go get -u -v golang.org/x/tools/cmd/gopls
GO111MODULE="on" go get -u -v golang.org/x/tools/cmd/goimports
go get -u -v github.com/golang/dep/cmd/dep
go get -u -v github.com/motemen/ghq
go get -u -v github.com/sonatard/ghs
go get -u -v github.com/kyoshidajp/ghkw
go get -u -v github.com/simeji/jid/cmd/jid
go get -u -v github.com/jmhodges/jsonpp
GO111MODULE="on" go get -u -v github.com/mithrandie/csvq
Yarnでインストールするもの
mkdir -p ${HOME}/.node_modules
yarn global add babel-eslint
yarn global add create-component-app
yarn global add create-react-app
yarn global add eslint
yarn global add eslint-plugin-react
yarn global add firebase-tools
yarn global add gulp
yarn global add heroku-cli
yarn global add jshint
yarn global add ngrok
yarn global add npm
yarn global add prettier
yarn global add tern
yarn global add tldr
yarn global add vue-cli
yarn global add vue-language-server
yarn global add webpack
Rbenv railsなど
yay -S rbenv
yay -S ruby-build
rbenv install 2.5.1
Rustでインストールするもの
sudo pacman -S cmake
mkdir -p ${HOME}/.cargo
curl -sSf https://sh.rustup.rs | sh
cargo install racer
cargo install cargo-update
cargo install cargo-script
cargo install cargo-edit
cargo install ripgrep
cargo install exa
cargo install fd-find
cargo install xsv
cargo install hyperfine
rustup component add rust-src
ターミナル
ターミナルは urxvt をメインにする
DNS cacheを有効にする
dnsmasqをインストールする
sudo pacman -S dnsmasq
vim /etc/NetworkManager/NetworkManager.conf
[main]
dns=dnsmasq
NetworkManagerを再起動すると、dnsmasqは自動的に使用可能に設定されます。
sudo systemctl restart NetworkManager
同じドリルコマンドで2回実行してDNSキャッシュが効いているかチェックします。 2回目のDNSルックアップが0 msecになっていればDNSキャッシュが効いています。
Mozc
ibus-mozc
入力ソースmozcをリージョンと言語のみにする。
USキーボードなので、日本語変換はshift + spaceを使う。
それはemacsでバッティングしないようにするためです。
キーバインドはことえりベースをカスタマイズする ← emacsに一番近い
reboot
設定が終わったらシンボリックリンクをはる
ln -sfn ~/Dropbox/mozc/.mozc ~/.mozc
mozcの設定をdropboxに設定する
これでもう二度と設定する必要はないでしょう。
Makefileをテストする方法
dockerを利用してMakefileをテストする
make test
dockerを利用してMakefile Dropboxなしのテスト
make testsimple
手動でテストしたい場合
1.このDockerファイルをビルドする
docker build -t dotfiles /home/${USER}/src/github.com/masasam/dotfiles
2.docker runを実行
docker run -t -i -v /home/${USER}/Dropbox:/home/${USER}/Dropbox:cached --name arch dotfiles /bin/bash
3.dockerコンテナ内で次のコマンドを実行します。
cd /home/${USER}/src/github.com/masasam/dotfiles
make install
make init
ブログ記事を投稿したらTwitterでお知らせいたします。ブログを気に入っていただけた方はお気軽にフォローしてください。
— Solist Work (@SolistWork) 2018年11月27日
関連記事
最新記事
タグ一覧
-
ansible (2)
application (8)
chrome (1)
command (14)
django (1)
docker (3)
document (1)
emacs (14)
git (2)
google (1)
hugo (1)
kubernetes (1)
linux (20)
makefile (6)
mariadb (2)
melpa (1)
postgresql (2)
python (1)
security (2)
terminal (11)
thinkpad (2)
work (6)
zsh (10)