kazeno memo

メモとか

DebianでMozc UT辞書を使いたい

Mozcデフォルトの辞書がショボくて、UT(2代目)辞書を使いたいと思いました。

Archlinuxだと、AURにfcitx-mozc-utというパッケージがありますが、Debianには無いので自分でビルドすることになります。

ダウンロード

UT辞書のダウンロード

OSDNから「mozcdic-ut-***.tar.bz2」をダウンロードします。

fcitx-mozcのダウンロード

apt-srcを使ってダウンロードします。事前に、sources.listdeb-srcコメントアウト(もしくは追加)する必要があります。

以下のコマンドでパッケージのソースコードをダウンロードします。ソースコードはカレントディレクトリにダウンロードされるので、事前に作業ディレクトリに移動しておくと良いでしょう。

$ apt-src update
$ apt-src install fcitx-mozc

UT辞書の追加

先程ダウンロードしたUT辞書のtarballを展開します。

以下のコマンドでUT辞書をmozcのdictionary00.txtに追加します。

$ cat mozcdic-ut-***/mozcdic-ut-***.txt >> mozc-***/src/data/dictionary_oss/dictionary00.txt

ビルド

apt-srcのビルドは簡単です。

$ apt-src build fcitx-mozc

インストール

aptのバックエンド、dpkgを使ってインストールします。

# dpkg --install ./*.deb

その他

実際にビルドしてみると、emacs-mozc, ibus-mozc, uim-mozcなどいらないパッケージが出来上がっていたので、dpkg --installする前に消すほうが良いかもしれないです。

リンク

Debian Busterのカーネルを4.19から5.10へ更新する

Debian BusterのBackportsリポジトリから5.10のカーネルをインストールする。

Backportsリポジトリの追加

Debianは固定リリースなので、多くのパッケージは最新バージョンではない。

Backportsは、一部のパッケージの最新版を配布しているリポジトリ。不安定版リポジトリから無理やりインストールしたりすると環境が壊れがちだが、Backportsは基本的に環境を壊すことなく最新のパッケージをインストールできる。

/etc/apt/sources.list.d/buster-backports.list

deb http://deb.debian.org/debian buster-backports main contrib non-free

カーネル関連パッケージの確認

$ dpkg --get-selections | grep ^linux-
linux-base                                      install
linux-compiler-gcc-8-x86                        install
linux-headers-4.19.0-14-amd64                   install
linux-headers-4.19.0-14-common                  install
linux-headers-amd64                             install
linux-image-4.19.0-13-amd64                     install
linux-image-4.19.0-14-amd64                     install
linux-image-amd64                               install
linux-kbuild-4.19                               install
linux-libc-dev:amd64                            install

--get-selectionsオプションでインストール済みパッケージの一覧が表示されます。

5.10のインストール

Linuxカーネル(linux-image-amd64)と関連パッケージをインストールします。

# apt update
# apt install -t buster-backports \
    linux-image-amd64 \
    linux-compiler-gcc-8-x86 \
    linux-headers-amd64 \
    linux-kbuild-5.10 \
    linux-libc-dev

initramfsとGrubエントリが更新されて、次回起動時最新カーネルで起動するはずです。uname -rで確認できます。

4.19の削除

5.10が正常に動作していれば、4.19のカーネルは必要ないので削除します。

まず、4.19のカーネル関連パッケージ名を確認します。

$ dpkg --get-selections | grep ^linux- | grep 4.19
linux-headers-4.19.0-14-amd64                   install
linux-headers-4.19.0-14-common                  install
linux-image-4.19.0-13-amd64                     install
linux-image-4.19.0-14-amd64                     install
linux-kbuild-4.19                               install

apt removeで削除します。

# apt remove \
    linux-headers-4.19.0-14-amd64 \
    linux-headers-4.19.0-14-common \
    linux-image-4.19.0-13-amd64 \
    linux-image-4.19.0-14-amd64 \
    linux-kbuild-4.19

もしかしたら、linux-headers-4.19などに依存しているパッケージがあるかもしれません。apt-cache rdepends パッケージ名パッケージ名に依存しているパッケージを検索できます。

ThinkPad T440pのBIOSから「WiFiホワイトリスト」と「Intel ME」を除去する(Linux)

ThinkPadといえば、カスタマイズや分解が容易な事が一つの特徴ですが、WiFiカード(NIC)は例外です。

ThinkPadWiFiカードを市販(もしくは、他のモデル)のカードに換装後、「1802エラー」が発生し起動に失敗してしまいます。

要するに、「指定のデバイス以外は使うな」ということです。(サポートや技適の問題もあるので理解は出来るのですが……)

WiFiホワイトリスト」と「1802エラー」

ThinkPadBIOSには、サポートされているWiFiカードのPCI Vendor ID/Product IDがハードコードされていて、許可されていないデバイスを認識すると起動に失敗します。

このハードコードされたPCI IDが「WiFiホワイトリスト」です。

起動に失敗する際、「1802: Unauthorized network card is plugged in...」(許可されていないネットワークカードが挿入されています)というエラーが表示されます。

Intel ME

Intel Management Engineは、Intelベースのチップセットに搭載されているサブシステムで、(電源が供給されている限り)シャットダウン時でも動作可能。

例えば、遠隔でBIOSの操作を行える機能(Intel vPro)や、盗難時にラップトップの位置を追跡する機能(Intel AT)などを提供します。

一方で、これらの機能はバックドアそのもので無効化すべき、との主張もあります。実際、Intel MEには多数の深刻な脆弱性が発見います。

危険にも関わらず、(必須機能と統合されている為)完全に無効化することは不可能です。

me_cleaner

me_cleanerは、BIOSから可能な限りIntel MEを除去するPythonスクリプト

実際に使用してみると、BIOSからIntel ATなどを設定できなくなっています。また、Ctrl+PでIntel MEの設定画面へ入ることも出来ません。

BIOSの抽出

Lenovoが配布しているBIOS更新ツールから、BIOSイメージを抽出します。

Lenovoが配布しているBIOS更新ツールはWindows向けのみですが、Wineを使用することでLinux上でも問題なく動作します。

$ wine BIOSupdater.exe

exeファイルを実行すると、まずBIOS更新に必要なファイルが展開されます。その後、BIOS更新ツールを実行するか尋ねてきますが終了を選択します。

展開先のディレクトリに大文字英数字のディレクトリがあり、その中に

BIOS アップデート (ユーティリティ および 起動CD用) (Windows 10 64bit/ 8.1 64bit/ 8 64bit/ 7 32bit, 64bit) - ThinkPad T440p - Lenovo Support PH

Phoenix BIOS Crisis Recovery - Bibliotheca Anonoma

Flash your Lenovo Ideapad laptop BIOS from Linux using UEFI capsule updates | by Christophe Beyls | Medium

Removing WLAN/WWAN BIOS whitelist on a Lenovo laptop to use a custom Wi-Fi card | by p0358 | Medium

http://thinkpads.kr/xe/REVIEW01/3409

https://nadim.computer/posts/2018-10-26-thinkpad.html

書きかけ そのうち続きを書きます。

ProtonMail Bridgeの代替OSS「Hydroxide」をTor経由で使う

ProtonMail Bridgeとは

ProtonMail Bridgeは、ProtonMailをThunderbirdOutlookなどの一般的なEmailクライアントと統合できるソフトウェアです。

ProtonMail側とBridgeがHTTPSのAPIで通信、Emailクライアントは、ローカルのSMTP/IMAPサーバーを実行するBridgeと通信する仕組みです。

この機能は有料会員限定の機能として提供されていますが、2020年4月にはソースコードが公開されています。

Hydroxideとは

HydroxideSimon Serさんが開発している、Bridgeの非公式オープンソース実装です。Go言語で開発されています。

Bridgeと違い、CLIのみでGUIは提供されていません。また、Debianなど主要なLinuxディストリビューション用のパッケージは配布されておらず、自分でビルドする必要があります。(VoidLinuxのxbpsにはありました)

ProtonMail APIとOnion Service経由で通信

Hydroxideはデフォルトで、「https://mail.protonmail.com/api」と通信するようですが、ProtonMailのAPIはOnion Service(.onionアドレス)経由でもアクセス可能です。

Onion Serviceを使用する利点として、クライアント側IPアドレスの秘匿、E2EE(ただし、これはHTTPSのみで満たしているが)などが挙げられます。

ビルド

HydroxideをビルドするにはGo 1.13以上が必要です。

Debianの場合、APTでgolangパッケージをインストールします。Busterのリポジトリだと1.11なので、Backportsリポジトリを使用してください。

# apt install -t buster-backports golang

//Goのバージョン確認
$ go version

HydroxideのGitリポジトリから、ソースコードをCloneします。

$ git clone https://github.com/emersion/hydroxide.git
$ cd hydroxide/

ソースコードの修正

Onion Serviceを経由で通信するようにソースコードを修正します。

修正するファイルは、auth.gomain.goの2つです。

//main.goの「mail.protonmail.com」を「protonirockerxow.onion」に置き換え
$ sed -e 's/mail.protonmail.com/protonirockerxow.onion/' cmd/hydroxide/main.go

//auth.goの「http://www.protonmail.ch」を「https://protonirockerxow.onion」に置き換え
$ sed -e 's/http:\/\/www.protonmail.ch/https:\/\/protonirockerxow.onion/' protonmail/auth.go

修正できたら、go buildでビルドします。

$ GO111MODULE=on go build ./cmd/hydroxide

ビルドが正常に完了すると、カレントディレクトリにhydroxideという実行ファイルが生成されています。

Hydroxideの実行

Onion ServiceにアクセスするにはTorを経由する必要がありますが、torsocksは上手く機能しなかったので、HTTPS_PROXY変数を設定することにします。(torsocksが使えないのは、goがlibcに依存しておらずLD_PRELOADが機能しない為だと思う)

  1. hydroxide authでログインしAPIキーを生成します。

    $ HTTPS_PROXY='socks5://127.0.0.1:9050' ./hydroxide auth <ProtonMail ID>

  2. hydroxide smtp/imapでローカルSMTP/IMAPサーバーを実行します。(サーバーはフォアグラウンドで実行されます。)

    $ HTTPS_PROXY='socks5://127.0.0.1:9050' ./hydroxide smtp

    $ HTTPS_PROXY='socks5://127.0.0.1:9050' ./hydroxide imap

  3. メールクライアントでログインします。

    クライアント毎の設定方法は公式サイトで解説されています。

    パスワードはhydroxide authで生成されたAPIキー、SMTP/IMAPサーバーのアドレスはlocalhostを指定します。

これでメールクライアントからProtonMailを送受信できるようになります。

実際にOnion Service経由でアクセス出来ているか確認するには、--debugオプションを使ってください。

Hydroxideの実行時には必ずHTTPS_PROXY変数を設定する必要があります。忘れると.onionアドレスにアクセスできないとエラーを吐いて、通信エラーになります。(設定し忘れてもリークはしないと思いますが)

パケットキャプチャで雑に確認した限り、生IPのリークはしていなかったです。

メッセージ送信後にエラーが出る

少なくともThunderbird使用時、メッセージ送信後にメッセージを保存できないというエラーが出ます。

これは、(多分)送信済みメッセージをSentフォルダに保存できないということで、HydroxideのIssueを漁っていると言及されていました。曰く、APIの仕様とのこと。

Thunderbirdだと、フォールバックでローカルメールに保存することが可能なようです。

Rootless Docker with Btrfs

一般ユーザーでdockerdを動かすDockerのrootless modeは、Btrfsストレージドライバに対応しています。(ただし、サポートされてない)

Rootless Dockerのインストール

$ sudo apt install uidmap
$ curl -fsSL https://get.docker.com/rootless | sh

//.bashrc
$ echo -e '## Docker rootless\nexport PATH=$HOME/bin:$PATH\nexport DOCKER_HOST=unix:///run/user/1000/docker.sock"' >> ~/.bashrc

//サービスの有効化
$ systemctl --user enable docker
$ systemctl --user start docker

ストレージドライバを確認

$ docker info 2>/dev/null | grep "^ Storage Driver:"
 Storage Driver: btrfs

Btrfsのマウントオプション

一般ユーザーで作成したSubvolumeをsubvolume deleteしてみると、パーミッションエラーが出ます。

user_subvol_rm_allowedというマウントオプションを追加することで、一般ユーザーがSubvolumeを削除することが出来るようになります。

/etc/fstab

/dev/sda3 /home btrfs default,user_subvol_rm_allowed 0 0

再起動するか、mount -o remount,user_subvol_rm_allowed /homeでマウントオプションを適用します。

テスト

AlpineLinuxのイメージをdocker pullした後、docker rmiしてみます。

//Alpine Linuxのイメージをダウンロード
$ docker pull alpine:latest

//イメージを削除
$ docker rmi alpine:latest

user_subvol_rm_allowedでマウントされていれば、エラーは出ないはずです。

Plank DockにFirefoxを追加できない

Debian Busterのaptでインストール出来るFirefoxはESRですが、ローリングリリース版を使いたい。

ということで、公式サイトからfirefox.tar.bz2をダウンロードし、手動でインストールします。

ダウンロード

firefox.com

$ wget "https://download-installer.cdn.mozilla.net/pub/firefox/releases/85.0/linux-x86_64/en-US/firefox-85.0.tar.bz2"
$ tar xf firefox-*.tar.bz2 -C ~/

bin に追加

# ln -s ~/firefox/firefox /usr/local/bin/firefox

update-alternatives

# update-alternatives --install /usr/bin/x-www-browser x-www-browser /usr/local/bin/firefox 0

.desktop ファイルの作成

~/.local/share/applications/firefox.desktop

[Desktop Entry]
Name=Firefox
Comment=Browse the World Wide Web
GenericName=Web Browser
X-GNOME-FullName=Firefox Web Browser
Exec=firefox %u
Terminal=false
X-MultipleArgs=false
Type=Application
Icon=firefox.png
Categories=Network;WebBrowser;
MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/vnd.mozilla.xul+xml;application/rss+xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https;
StartupWMClass=Firefox
StartupNotify=true

アイコンの追加

$ mkdir ~/.local/share/icons
$ cp ~/firefox/browser/chrome/icons/default/default128.png ~/.local/share/icons/firefox.png

FirefoxのリリースGPGキー

Firefoxの場所

ftp.mozilla.org

公開鍵

// ftp.mozilla.org からダウンロード
$ curl -s https://ftp.mozilla.org/pub/firefox/releases/85.0/KEY | gpg --import -

// OpenPGP.org 公開鍵サーバからダウンロード
$ gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x097B313077AE62A02F84DA4DF1A6668FBB7D572E
// Ubuntu 公開鍵サーバからダウンロード
$ gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys 0x097B313077AE62A02F84DA4DF1A6668FBB7D572E

検証

$ gpg --verify firefox*.tar.bz2.asc firefox*.tar.bz2

ソース

blog.mozilla.org

SPICE(virt-viewer)のディスプレイを自動リサイズ

virt-viewerをフルスクリーンにしても、VMの画面サイズはそのままなので、ディスプレイのサイズを手動で変更しなければならない。

VirtualBox Guest Additionsみたいに、spice-vdagentを入れておけばどうにかなる訳でも無く。

一応、解像度の変更はVM側に通知しているようなので、それを読み取って画面サイズを更新すれば良い。

spice display auto resizeとかで調べてみたら、udevを使った解決策があった。 superuser.com

udevルールの作成

# vim /etc/udev/rules.d/50-spice-resize.rules
ACTION=="change",KERNEL=="card0",SUBSYSTEM=="drm",RUN+="/usr/local/bin/spice-resize" 

ディスプレイの変更を検出すると、/usr/local/bin/spice-resizeを実行するudevルール。

画面サイズを変更するスクリプト

# vim /usr/local/bin/spice-resize
#! /bin/sh
PATH=/usr/bin
export DISPLAY=:0.0

xrandr --output "$(xrandr | awk '/ connected/{print $1; exit; }')" --auto

spice-resizeに実行権限を与える

# chmod +x /usr/local/bin/spice-resize

piping-server-rustのOpenRC initスクリプト

AlpineLinuxでpiping-server-rustをビルドして起動時に実行する。

piping-server-rustのビルド

# apk add --update git curgo

# git clone https://github.com/nwtgck/piping-server-rust.git
# cd piping-server-rust/
# cargo check
# cargo build
# cp ./src/target/piping-server /usr/local/bin/

OpenRC init

Supervisorにはstart-stop-daemonではなくsupervise-daemonを使う。

ポートはデフォルトの8080ではなく80で受ける。

/etc/init.d/piping-server

#!/sbin/openrc-run
supervisor="supervise-daemon"

description="piping-server - Infinite streaming any data over HTTP/HTTPS"

command="/usr/local/bin/piping-server"
command_args="--http-port 80"

depend() {
    need net
    after firewall
}

サービスの有効化

# rc-update add piping-server
# rc-service piping-server start