なんか書いていこうぜー.com

Let's write something good

Arch Linux で rootless docker を設定した

2020-03-11
  • Share on Facebook
  • Tweet
  • Add to Pocket

何点か躓いたので emoji-memo しておく。

https://docs.docker.com/engine/security/rootless/ の手順を参考に rootless docker を設定していった。

前提

https://docs.docker.com/engine/security/rootless/#arch-linux#prerequisites を確認した。

newuidmapnewgidmap コマンドはインストールされていた。 /etc/subuid/etc/subgid はなかったので、下記のコマンドで作成した。中身は空のまま。

$ sudo touch /etc/subgid /etc/subuid

Arch Linux 特有の準備作業

https://docs.docker.com/engine/security/rootless/#arch-linux を参照。

私の環境では、/etc/sysctl.conf はなく /etc/sysctl.d/ があったため、/etc/sysctl.d/100-rootless-docker.conf を作成して、kernel.unprivileged_userns_clone=1 を記述し、sudo sysctl --system を実行する。

$ sudo vim /etc/sysctl.d/100-rootless-docker.conf
kernel.unprivileged_userns_clone=1

$ sudo sysctl --system

インストール (下ごしらえ)

https://docs.docker.com/engine/security/rootless/#arch-linux#install を参照。

curl と sh でインストールすることになるのだが、/etc/subgid/etc/subuid が空の場合、これらにユーザの情報を書き込むように警告が出るので、その値を書き込む。 /etc/subuid, /etc/subuid どちらも空ならば、それぞれについて警告が出るので、両方に書き込む。

$ curl -fsSL https://get.docker.com/rootless | sh

Could not find records for the current user muryoimpl from /etc/subuid . Please make sure valid subuid range is set there.
For example:
echo "muryoimpl:100000:65536" >> /etc/subuid

書き込んで、再度実行する。システムに入った docker が起動していると下記の警告が出る。docker.service 停止して環境変数を設定した。

$ curl -fsSL https://get.docker.com/rootless | sh
Aborting because rootful Docker is running and accessible. Set FORCE_ROOTLESS_INSTALL=1 to ignore.

$ sudo systemctl stop docker.service
$ export FORCE_ROOTLESS_INSTALL=1

インストール

下ごしらえが終わったら、curl を使ってインストールする。 PATH と DOCKER_HOST の設定が出力されるので、私は ~/.zshrc に書き込んだ。

$ curl -fsSL https://get.docker.com/rootless | sh

# Installing stable version 19.03.7
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 60.7M  100 60.7M    0     0  22.8M      0  0:00:02  0:00:02 --:--:-- 22.7M
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 17.8M  100 17.8M    0     0  14.8M      0  0:00:01  0:00:01 --:--:-- 14.8M
# starting systemd service
# starting systemd service
● docker.service - Docker Application Container Engine (Rootless)
     Loaded: loaded (/home/muryoimpl/.config/systemd/user/docker.service; disabled; vendor preset: enabled)
     Active: active (running) since Wed 2020-03-11 23:08:04 JST; 36ms ago
       Docs: https://docs.docker.com
   Main PID: 12660 (rootlesskit)
     CGroup: /user.slice/user-1000.slice/user@1000.service/docker.service
             ├─12660 rootlesskit --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run /home/muryoimpl/bin/dockerd-rootless.sh --experimental --storage-driver=vfs
             ├─12669 /proc/self/exe --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run /home/muryoimpl/bin/dockerd-rootless.sh --experimental --storage-driver=vfs
             └─12676 vpnkit --ethernet /tmp/rootlesskit924008508/vpnkit-ethernet.sock --mtu 1500 --host-ip 0.0.0.0

Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + which slirp4netns
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + '[' -z ']'
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + which vpnkit
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + net=vpnkit
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + '[' -z ']'
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + mtu=1500
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + '[' -z ']'
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + _DOCKERD_ROOTLESS_CHILD=1
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + export _DOCKERD_ROOTLESS_CHILD
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + exec rootlesskit --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run /home/muryoimpl/bin/dockerd-rootless.sh --experimental --storage-driver=vfs
Client: Docker Engine - Community
 Version:           19.03.7
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        7141c199a2
 Built:             Wed Mar  4 01:19:42 2020
 OS/Arch:           linux/amd64
 Experimental:      false
Server: Docker Engine - Community
 Engine:
  Version:          19.03.7
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       7141c199a2
  Built:            Wed Mar  4 01:19:50 2020
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
# Docker binaries are installed in /home/muryoimpl/bin
# WARN: dockerd is not in your current PATH or pointing to /home/muryoimpl/bin/dockerd
# Make sure the following environment variables are set (or add them to ~/.bashrc):\n
export PATH=/home/muryoimpl/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock

#
# To control docker service run:
# systemctl --user (start|stop|restart) docker

docker daemon の自動起動を設定する

インストール後、~/.config/systemd/user/docker.service が配置されるので、systemctl --user enable docker.service すると自動起動すると思いきやされないので、下記を参考に unit ファイルを編集した。

https://qiita.com/yasthon/items/26f943bd5f1b8fab87e0#rootless-docker%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%86

https://docs.docker.com/engine/security/rootless/#arch-linux#daemon を参考に、loginctl コマンドも実行しておいた。

$ vim ~/.config/systemd/user/docker.service
[Install]
-WantedBy=multi-user.target
+WantedBy=default.target
$ systemctl --user enable docker.service
$ sudo loginctl enable-linger $(whoami)

遭遇した問題ややり直す方法について

  • curl 時に出る警告 echo "muryoimpl:100000:65536" のとおりに設定しないと、docker.service の起動に失敗したので、素直に従っておくことにした
  • 最初から手順を確認したい、再インストールしたい場合は、~/bin を削除し、export した PATH, DOCKER_HOST をコメントアウト、/etc/subgid, /etc/subuid の値を空にして、curl すると再現できた
  • 元のシステムワイドな docker で動かしていた rails 環境を動かした際、、bootsnap の起動や volume のマウントあたりで権限エラーが発生した。docker image を削除して再度作成することで解消した。Rails.root/tmp の中の cache 等にも旧権限が残っていたりするので削除するなり、owner をユーザにしておくなりしておくとエラーを解消できた

BuriKaigi2020 に参加して発表してきた

2020-02-01
  • Share on Facebook
  • Tweet
  • Add to Pocket

BuriKaigi2020 が 2/1 に開催されたので、急遽発表者として参加してきた。

経緯

1/29 の 22 時過ぎくらいに、近所の中華屋で遅い晩ごはんを食べているときに、以下の tweet を見て衝撃を受ける。

なぜかこのときに、穴があくのはヤダなぁと思ったので、オリャーemoji-dashの精神でノープランで mugi さんに DM した。

22:26 あたりにお気持ち表明して 23:07 にはサイトに反映されているというこのスピード感すごい…

この間、実は会社のブログに書かれている GitHub issue には気がついてなかったが、やりとりの後に気がついたので発表者欄に反映された URL つけて報告しておいた。 ブログみてハードルあがったwemoji-sweat_smile

発表について

昨年 12 月の LT で発表したテスティングフレームワークに興味があって作ってみたいな、という話が下敷きになっている。

年末に『テスト駆動開発』の第Ⅱ部を Ruby 実装していたものと、minitest のコードを読んでいたこともあって、「minitest で学ぶメタプログラミング」ということで話ししようと晩ごはん食いながらのやりとりで決めたのであった。

1/29 中にアウトライン作成して、1/30, 1/31 でなんとかスライド作ったものの、当日も微調整して、発表者ノートがうまく開かず時間が確認できない中で時間超過やショートするかと思いきや、うまい具合に収まったので助かった… emoji-sweat_drops

発表後

当日発表が後半も後半で発表終わるまでガチガチに緊張していたので、終わってやって気持ちが楽になった。 他の発表者の皆さんと日々ぶちあたった問題やその解決案、説明方法等について話しができたので非常によい時間を過ごすことができた。

本編(ぶりしゃぶが出るほうが本編)で、すごいの出てきたので記録として残してしておく。

いやぁ、楽しいイベントだった emoji-smile

i3-wm と polybar に乗り換えた

2020-01-25
  • Share on Facebook
  • Tweet
  • Add to Pocket

2019年末から2020年年始の休みの間に、awesome-wm から i3-wm + polybar + dunst + picom に乗り換えた。

実際に入ったのは、i3-gaps らしい。

$ sudo pacman -S i3

なぜ乗り換えたの?

awesomeからi3に同僚が乗り換えたというので、年末に試すかーと思っていたが、そのまま乗り換えた。

気に入った点は以下のとおり。

  • ワークスペースが外部ディスプレイにまたがって設定されるのでディスプレイ間の移動が簡単
  • 一部 awesome とショートカットが似ている
  • もともとの設定がよくできているのであまりカスタマイズしなくても使える
  • 設定は設定ファイルに記述 or シェルを呼び出すだけなので設定書くのに覚えることはそんなに多くない

どう設定したの?

だいたいここに書いてある。

https://github.com/muryoimpl/dotconfig

設定 したことをかいつまんで

外部ディスプレイに接続されたときに、決まったワークスペースを割り当てるようにした

workspace 1 output eDP1
workspace 2 output HDMI2 HDMI1 eDP1
workspace 3 output HDMI2 HDMI1 eDP1
workspace 4 output DP2 HDMI1 eDP1

左から順に同名のディスプレイあれば設定されて、そうでなければ次、なければ eDP1 (ノートPC本体のディスプレイ) にすべて設定される。

ノートPC本体、ワイドディスプレイ、縦ディスプレイの順で配置しているので、左から 1, 2 & 3, 4 のワークスペースが設定されるようになっている。

scrot で screenshot 撮れるようにした

awesome で設定していたものとだいたい同じものを設定した。Win + PrtScr で全画面、Win + Shift + PrtScr で選択範囲を撮るようになっている。

bindsym $mod+Print exec --no-startup-id "scrot -e 'mv $f ~/screenshots/ 2>/dev/null'"
bindsym $mod+Shift+Print exec --no-startup-id "sleep 0.5 && scrot -s '%Y-%m-%d_%H%M%S_scrot.png' -e 'mv $f ~/screenshots/ 2>/dev/null'"

コンポジットマネージャと壁紙とPolybar

## コンポジットマネージャ(ちらつき防止のため導入)
exec_always --no-startup-id picom -b -d :0
## 壁紙 (ディスプレイごとにかえたかったので nitrogen 導入)
exec_always --no-startup-id nitrogen --restore
## polybar (i3-status でもよかったが、ディスプレイごとに表示をかえたかった)
exec_always --no-startup-id $HOME/.config/polybar/launch.sh

Polybar の設定

i3-style で生成した色を使っている。

Polybar には接続しているディスプレイごとに表示するものを簡単にではあるが変えている。 ここ にあるように、縦ディスプレイに表示項目が多いと時刻が見えないのでかえている。

FontAwesome によるアイコンフォントの設定はフォント名の設定がちょっと変わっていたのでハマった。その他のアプリで表示されるフォント名と異なっているのはなぜ?

困っていることは?

外部ティスプレイを接続して arandr で設定したときに Polybar をリロードしないと Nitrogen の壁紙と bar の表示が乱れることがあるところが解決していないが、ショートカットでリロードできるのでなんとかなっている。

T495 に Arch Linux をインストールした

2020-01-25
  • Share on Facebook
  • Tweet
  • Add to Pocket

Ryzen CPU 搭載の PC に Arch Linux をインストールしたので、記録しておく。尚、最小手とは限らない。 基本的には https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89 を参考にしつつ、過去の経験と AMD 用の設定と ThinkPad T495 向けの設定と思われるものを追加している。

起動する USB メモリを作成する

archlinux-2020.01.01-x86_64.iso をあらかじめダウンロードしておき、dd コマンドで作成する。 ここでは USB メモリが /dev/sdb にマウントされている。

$ sudo dd bs=4M if=archlinux-2020.01.01-x86_64.iso of=/dev/sdb && sync

USB メモリを起動してインストール

eivars を確認
# ls /sys/firmware/efi/efivars

ディスクの一覧を表示
# fdisk -l

パーティション作成
# gdisk /dev/nvme0n1
Command (? for help): o
Command (? for help): n
Permission number: 何も押さずエンター
First sector     : 何も押さずエンター
Last sector      : +512M
Hex code or GUID : EF00

https://server.etutsplus.com/allocate-swap-space/ ハイバネートが1.5 になってたから 24 * 1.5 = 36
Command (? for help): n
Permission number: 何も押さずエンター
First sector     : 何も押さずエンター
Last sector      : +36G
Hex code or GUID : 8200

Command (? for help): n
Permission number: 何も押さずエンター
First sector     : 何も押さずエンター
Last sector      : 何も押さずエンター
Hex code or GUID : 8300

Command (? for help): w
Do you want to proceed? (Y/N) Y
The operation has completed successfully.

パーティションにファイルシステム作成
# mkfs.fat -F32 /dev/nvme01p1
# mkswap /dev/nvme01p2
# swapon /dev/nvme01p2
# mkfs.ext4 /dev/nvme01p3

パーティションのマウント
# mount /dev/nvme01p3 /mnt
# mkdir /mnt/boot
# mount /dev/nvme01p1 /mnt/boot

システムクロックの更新
# timedatectl set-ntp true

paclist の編集 Japan なものをすべて上にもってきた
# vim  /etc/pacman.d/mirrorlist

ベースシステムの導入
# pacstrap /mnt base base-devel git linux linux-firmware vim

fstab の生成
# genfstab -U /mnt >> /mnt/etc/fstab

# arch-chroot /mnt

# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# hwclock --systohc --utc

en_US.UTF-8 UTF-8 と ja_JP.UTF-8 UTF-8 を uncomment
# vi /etc/locale.gen
# locale-gen

※ この段階で ja_JP を入れると文字化けする
# echo LANG=en_US.UTF-8 > /etc/locale.conf

# echo ホスト名 > /etc/hostname
# vim /etc/hosts
127.0.0.1  localhost
::1    localhost
127.0.1.1  ホスト名.localdomain  ホスト名

netctl, wifi-menu 使えるようにしておく
# pacman -S iputils dialog wpa_supplicant iw
# pacman -S netctl dhcpcd

# mkinitcpio -P

root のパスワード設定
# passwd

microcode の更新用
# pacman -S amd-ucode

grub をインストールする
# pacman -S grub efibootmgr
# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub
# grub-mkconfig -o /boot/grub/grub.cfg
# vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT に acpi_backlight=native を追加
⇡ https://wiki.archlinux.jp/index.php/Lenovo_ThinkPad_T495 を参照

# grub-mkconfig -o /boot/grub/grub.cfg

ユーザ作成
# pacman -S zsh
# useradd -m -G wheel -s /usr/bin/zsh ユーザ名
# usermod -aG users ユーザ名 # users グループに追加
# passwd ユーザ名

# pacman -S sudo
# EDITOR=vim visudo
 %wheel      ALL=(ALL) ALL
# chown -c root:root /etc/sudoers
# chmod -c 0440 /etc/sudoers

Ryzen 最適化 kernel の導入 と その他
# pacman -S linux-zen
# pacman -S linux-zen-headers
# pacman -S mesa
# pacman -S xf86-video-amdgpu
# pacman -S lm_sensors
# vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT に↓を追加する
amdgpu.si_support=1 radeon.si_support=0 acpi_backlight=native

# grub-mkconfig -o /boot/grub/grub.cfg

フォントをインストール
# pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji noto-fonts-extra

ノートPC の蓋締めたときのアクションを設定する
# mkdir /etc/systemd/logind.conf.d/
# cp /etc/systemd/logind.conf /etc/systemd/login.conf.d/
# vim  /etc/systemd/login.conf.d/logind.conf
HandleLidSwitch=hybrid-sleep

swapへのSSDの書き込み回数を減らす
# echo 10 > /proc/sys/vm/swappiness

TLP alsa 等
# pacman -S libxss alsa-utils tlp dkms

arch-chroot を抜けて再起動し、終了したら USB メモリを抜く
# exit
# reboot

一旦ログアウトしてユーザとしてログインして追加作業する

arch-chroot 状態だと systemctl が使えないため、一旦ログアウトしてインストールされたシステムにログインして作業を続ける。

wifi-menu を使えるように dhcpcd を有効化
$ sudo systemctl enable dhcpcd
$ sudo ip link set wlp1s0 up
$ sudo wifi-menu

$ sudo pacman -S openssh
$ sudo vim /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no

$ sudo systemctl enable sshd.service
$ sudo systemctl start sshd.service

時刻合わせ
$ sudo pacman -S ntp
$ sudo systemctl enable ntpd
$ sudo systemctl restart ntpd

lightdm をインストールする
$ sudo pacman -S lightdm
$ sudo pacman -S lightdm-gtk-greeter
$ sudo vim /etc/lightdm/lightdm.conf
 [Seat:*]
 …
 greeter-session=lightdm-gtk-greeter
$ sudo systemctl enable lightdm.service

X の設定
$ sudo pacman -S xorg-server
https://wiki.archlinux.jp/index.php/AMDGPU#Xorg_.E3.81.AE.E8.A8.AD.E5.AE.9A で
$ sudo vim /etc/X11/xorg.conf.d/20-amdgpu.conf
Section "Device"
  Identifier  "AMD"
  Driver    "amdgpu"
  Option    "DRI"  "3"
EndSection

fcitx の設定
$ sudo pacman -S fcitx-mozc
$ sudo pacman -S fcitx-gtk2 fcitx-gtk3 fcitx-configtool
$ vim ~/.xprofile
 export GTK_IM_MODULE=fcitx
 export QT_IM_MODULE=fcitx
 export XMODIFIERS="@im=fcitx"
 export DefaultIMModule=fcitx
 fcitx &
$ fcitx-configtool
MOZC を追加する

synaptics でトラックパッドの設定をする
$ sudo pacman -S synaptics
$ sudo vim /etc/X11/xorg.conf.d/70-synaptics.conf
Section "InputClass"
  Identifier  "touchpad"
  Driver    "synaptics"
  MatchIsTouchpad  "on"

  Option  "VertTwoFingerScroll"  "on"
  Option  "HorizTwoFingerScroll"  "on"
  Option  "EmulateTwoFingerMinZ"  "40"
  Option  "EmulateTwoFingerMinW"  "8"
  Option  "CoastingSpeed"    "0"
  Option  "FingerLow"    "30"
  Option  "FingerHigh"    "50"
  Option  "MaxTapTime"    "125"

  Option  "VertScrollDelta"  "-111"
  Option  "HorizScrollDelta"  "-111"

  Option  "SoftButtonArea"  "70% 0 50% 0 0 0 0 0"

  # disable trackpad while typing
  Option  "PalmDetect"    "1"
  Option  "PalmMinWidth"    "10"
  Option  "PalmMinZ"    "200"
EndSection

yay の導入
$ mkdir tmp
$ git clone https://aur.archlinux.org/yay.git
$ cd yay
$ makepkg -si

あとは好みのアプリを導入すれば動くはず。

追記(2020-01-30):

/etc/mkinitcpio.conf の MODULES に amdgpu を追加すると、XF86Audio のボリュームまわりが認識されるようになった模様。音はなっていたが、音量を調整するアプリがずっとミュートを示していたが、値の調整ができるようになった。

$ sudo vim /etc/mkinitcpio.conf
MODULES=(amdgpu)
$ sudo mkinitcpio -P
$ sudo reboot

追記(2020-02-03):

たまに USB 接続のキーボードが効かなくなったので、 ThinkPad T495 の TLP のページにある /etc/default/tlp への設定を追記した。

感想

以前と違って、wpa_supplicant と dialog さえインストールしておけば wifi-menu が動く、とはなっていなかったので、無線LANにつながるまで何度もUSB メモリさして mount して arch-chroot /mnt してを繰り返すことになった。

知識と経験はアップデートしなければ役に立たなくなることもある。

2019年ふりかえり

2019-12-31
  • Share on Facebook
  • Tweet
  • Add to Pocket

2019年にやったこと (順番は適当)

2019年感想

いろいろやったけど、2018年までにやった積み上げ(知見)で2019年は過ごしてた気がする。2020年はなにか自分にとって新しいことしないとな、という気持ちになっている。

生活に季節感が少ないので、季節感のあるイベントは県外に出てでも経験したほうがいいな、と思った。外に出ないと。

2020年にやるつもり

  • (2020年はなんかやることが増えそうな予感がしている)
  • テスティングフレームワーク勉強するつもり
  • 引き続き北陸の地域コミュニティに参加していこう