Lenovo ThinkPad T14 Gen 1 (AMD)を自宅サーバにする

View post on imgur.com

同じシリーズのGen 6に乗り換えて不要になったPCを活用していく。

Headless ThinkPad

冷却を考慮すると不要になるディスプレイユニット外したほうが良いんじゃね?って思って調べてこれを見る限り簡単そうだしそのつもりになっていたのだが、
よく考えてみると自宅サーバーで冷却気にしないと行けないほどCPUヘビーなことやらせないなと思ったのでやめた。

準備

BIOSのConfigからDisplay > UMA Frame buffer Size: 512MとPower > Lid Sensor: Disabledを設定した。
OSにはDebianを選択しインストールとセットアップの後に蓋の開閉が問題ないかやCPUに負荷をかけてちゃんとファンが回るかを確認した。

トラブル

Debianのインストール自体は正常終了するがブートメニューにDebianが無いしGRUBの再インストールなども効果が無くて困り果てていたが、
BIOSのStartup > Boot Order Lockが原因でこれをDisabledに戻したら解決した。
これは以前Windows 10で使っていた頃に突然再起動してWindowsを見失うという不安過ぎる挙動を起こしたときにEnabledにしたやつだった。

雑感

自宅サーバーとしてはRaspberry Pi 4(2.5インチ SSD, 6010ファン)のものが5年以上稼働中でこれでことは足りているので過剰性能ではある。
T14 Gen 1は右方排熱なのでそっちを手前にすれば本棚みたいなものにも入れやすいのが良い。

セットアップログ

echo "Defaults timestamp_timeout=120" | sudo tee -a /etc/sudoers
sudo apt install bat curl fd-find fzf git git-delta gpg libarchive-tools lsd ripgrep starship tmux vim xh zoxide

# [bat](https://github.com/sharkdp/bat)
sudo ln -s $(which batcat) /usr/local/bin/bat

# [fd](https://github.com/sharkdp/fd)
sudo ln -s $(which fdfind) /usr/local/bin/fd

# [fish](https://fishshell.com/)
echo 'deb http://download.opensuse.org/repositories/shells:/fish:/release:/4/Debian_13/ /' | sudo tee /etc/apt/sources.list.d/shells:fish:release:4.list
curl -fsSL https://download.opensuse.org/repositories/shells:fish:release:4/Debian_13/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/shells_fish_release_4.gpg > /dev/null
sudo apt update
sudo apt install fish

# [ghq](https://github.com/x-motemen/ghq)
curl -fLSs https://github.com/x-motemen/ghq/releases/latest/download/ghq_linux_amd64.zip | bsdtar xvf -
sudo cp ghq_linux_amd64/ghq /usr/local/bin/ && sudo chmod 755 /usr/local/bin/ghq

# [dotfiles](https://github.com/ebith/dotfiles)
ghq get ebith/dotfiles
cd ghq/github.com/ebith/dotfiles
./create_link.py .config .gitconfig .tmux.conf .vim 
mkdir -p ~/.vimlocal/{backup,swap,undo}
chsh -s $(which fish)
exec fish
rm .bash* .profile
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher
fisher update

# sudoedit
sudo update-alternatives --config editor

# ntp 
echo "NTP=ntp.nict.jp" | sudo tee -a /etc/systemd/timesyncd.conf

# sshd
mkdir ~/.ssh
curl -s https://github.com/ebith.keys | tee -a ~/.ssh/authorized_keys
echo "PasswordAuthentication no" | sudo tee -a /etc/ssh/sshd_config
sudo systemctl reload sshd

# network
echo "
interface enp5s0
static ip_address=192.168.0.111/24
static routers=192.168.0.1
static domain_name_servers=1.1.1.1 1.0.0.1
" | sudo tee -a /etc/dhcpcd.conf

その他

Tailscale

DNSのAレコードをTailscaleで割り振られる100.x.y.zに向けつつTraefikをリバースプロキシとして動かすことで、わかりやすいドメインで自宅サーバーで動いてるアプリ類にアクセスできて良い。
出先からアクセスするため大昔は沢山ポートを開けていたが今は外部に公開したいやつだけCloudflare Tunnel経由で受け入れる運用にしている。

Docker

なんでもDocker Composeで管理しておくと楽でありがたい。
ほぼ全部Bind Mountしてきたのだが設定ファイル類以外はNamed VolumeでDockerに任せておくのが良いというのを今更知った。

Traefik

設定が複雑というか公式のドキュメントがとっ散らかっててわかりにくいが、機能としてはやはり優れているしDocker Composeを活用してるなら便利。
設定の書き方自体はTraefik 3.x Quick Start Exampleを参考にしたりAIに頼った。

Kopia

シングルバイナリだけど他のものにあわせてdocker composeで管理しておく。
バックアップ対象の設定とかスケジュールの管理とか全部これだけに任せておけるところが良い。
ただバックアップのポリシーの設定にだいぶクセがあって特定のファイルだけのバックアップ頻度を下げるみたいなのはできないのが惜しい。

Fastladder

Fastladderが今もメンテされてるの本当にありがたい。
livedoor Reader, Live Dwango Reader, Inoreader, Feedeenと使ってきてその後はCommaFeedをしばらく使っていたがそもそもLDR/Fastladderが求めているフィードリーダーなのでセルフホストすべきはこれであった。
OPMLのインポートに失敗するのでRACK_QUERY_PARSER_PARAMS_LIMITを設定したり、それでもなんか一部しか登録されないので繰り返しインポートしたりする必要があったり、また登録済みフィードの管理の挙動も怪しかったが、
一度DB初期化してインポートするXMLを分割したり死んでるフィードを削除したりして整理したやつをインポートしたら問題なかった。

Grafana, Prometheus(Node exporter, cAdvisor), InfluxDB

この辺もそこそこややこしい、特にInfluxDBがマジでアレなんだが公式とRedditとAIを行ったり来たりすることでなんとかなった。
LibreHardwareMonitorにPrometheusサポートが入ったのありがたい。

Grafana Dashboard

Rybbit

かなり新し目のアクセス解析でセルフホスト向けのガイドも充実してて良い。
Cloudflare Tunnelsで/^/apiを別々に公開しつつ、Zero Trust(Cloudflare One)のAccess ControlでAPIはBypassしてDashboardはAllowで認証かけるってのをやった。
これでCloudflareが提供する防御を経由してからのアクセスだけが/apiに届くしアクセス解析自体もCloudflareの認証を突破してからでないとアクセスできない。

n8n

スクリプト書いたりするのでも良いんだけど書いた後の管理の方が面倒なのでこういうので済ませておきたい。
わかりやすいdocker-compose.yml用意してくれてるのも楽で良い。

昔ほど音楽も聞かなくなったがこの機会にデスクトップのHDDに入ってるのをサーバーに移してどこからでも再生できるようにした。

rep2

プレイ人口の少ないゲームとかの情報はまだ5chが現役というかどこが代わりになるのか知らない。

追記

ノートPC本体のディスプレイ付けっぱなこと忘れてたので対策した

sudoedit /etc/default/grub
  # GRUB_CMDLINE_LINUX_DEFAULT="quiet consoleblank=600"
sudo update-grub

バッテリー充電率の制限

sudoedit /etc/systemd/system/battery-charge-limit.service
  # [Unit]
  # Description=Set Battery Charge Limit to 60%
  # After=multi-user.target

  # [Service]
  # Type=oneshot
  # ExecStart=/bin/sh -c 'echo 50 > /sys/class/power_supply/BAT0/charge_control_start_threshold'
  # ExecStart=/bin/sh -c 'echo 60 > /sys/class/power_supply/BAT0/charge_control_end_threshold'
  # RemainAfterExit=yes

  # [Install]
  # WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now battery-charge-limit.service

2026/03

Dungeons & Dragons Online

2026年に遊ぶDungeons & Dragons Onlineという感じで5年ぶりにDDOをやっている。
古臭いが楽しいし毎年拡張が出ていて停滞はしていないゲームなのだが英語かつ読みにくいフォントとか時間帯によってはラグいとか日本人が遊ぶにはイマイチな要素が多すぎるんだよなーというやつ。
英語しんどい問題は自作のツール(ホットキーで画面キャプチャしてGemini APIに投げてOCRと翻訳してDiscordに流すやつ)でちょっと楽になった。

Xiaoxin Pad Pro GTを買った

今使っているタブレットはFire HD 10 PlusでDiscordを開いておくとか、ちょっとブラウザで調べ物するとか、小説を読むとかは問題ないけどZwiftをタブレットでできると良いなと思ったのでそこそこ良いSoCが載っていて安いやつを探した。
Xiaoxin Pad Pro GTはAliExpressでめちゃ安く買えるが中国語と英語しか選択できずGoogle Playも入っていない。
しかしLenovo Yoga TabのROMを書き込むことでグローバル版化が可能らしく手間をかけられるなら普通に使えるやんということで選択した。
どちらも型番はTB710FUで同機種なのでROMを使い回せるということらしい。

ちなみにSoCはSnapdragon 8 Gen 3となっているが選別落ちの6コア版らしく8コア版と比較すると性能は落ちる。
それが問題になるようなタブレットでも無いし安いので良しという感じだが。

3/16からのアニバーサリーセールで8GB/128GB版が37308円だった。
去年とかならもっと安かったらしいがこういう特殊な安いタブレットの存在を知らなかったのでまぁ仕方ないなというところ。

セットアップメモ

グローバル版化をしつつ不要なアプリケーションの削除をする。

タブレット

  1. 初期セットアップを全てキャンセルし開発者モードとUSBデバッグをオンにして再起動しておく

PC

  1. winget install Google.PlatformTools
  2. Software Fix (Rescue and Smart Assistant)を使ってTB710FUのファームウェアをダウンロードする
  3. Other | Re*Index.LabからQuectel QDLoader 9008 Driverをダウンロードしてインストールする
  4. miner7222/LTBoxをダウンロードして展開し、そこにファームウェアのimageフォルダを移動する
  5. Start.batしてROMを書き込む

その後

adb shell pm uninstall --user 0 com.aura.oobe.lenovo
adb shell pm uninstall --user 0 com.lenovo.ota
adb shell pm uninstall --user 0 com.tblenovo.lenovowhatsnew
adb shell pm uninstall --user 0 com.lenovo.tbengine
adb shell pm uninstall --user 0 com.tblenovo.center

雑感

概ね自動でやってくれるツールのお陰で思いの外手軽に完了した。
ここ数年のLenovoのTabletにはROM書き込みのために使える脆弱性がありそれを利用したツールらしくなるほどなぁといったところ。

これまで使っていたFire HD 10 Plusとは比べ物にならないスペックなので何もかも快適で良い。
もちろん目的であったZwiftも問題ないがPC版でも良くはないグラフィックがAndroid版は更に悪くなってなかなか酷い見た目なのがちょっと笑える。

参照