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 JP

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
  • 追記(2023/03/22): ProtonMailのブランド変更に伴ってドメイン名が変わったので書き換えてください

    mail.protonmail.com mail.proton.me
    protonirockerxow.onion protonmailrmez3lotccipshtkleegetolb73fuirgj7r4o4vfu7ozyd.onion

修正できたら、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を使った解決策があった。

追記

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ルール。

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

/usr/local/bin/spice-resizeファイルを作成し、下記のスクリプトを貼り付ける。

gist.github.com

ログの出力など余計な部分を省いたコード

#!/bin/bash
function x_resize() {
    declare -A disps usrs
    usrs=()
    disps=()

    for i in $(users);do
        [[ $i = root ]] && continue
        usrs[$i]=1
    done

    for u in "${!usrs[@]}"; do
        for i in $(sudo ps e -u "$u" | sed -rn 's/.* DISPLAY=(:[0-9]*).*/\1/p');do
            disps[$i]=$u
        done
    done

    for d in "${!disps[@]}";do
        session_user="${disps[$d]}"
        session_display="$d"
        session_output=$(sudo -u "$session_user" PATH=/usr/bin DISPLAY="$session_display" xrandr | awk '/ connected/{print $1; exit; }')
        sudo -u "$session_user" PATH=/usr/bin DISPLAY="$session_display" xrandr --output "$session_output" --auto
    done
}

x_resize

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