FreeBSDをThinkpad X250にインストール【充電制御実現】

# 概要
　Windows11にバージョンアップできないThinkpad X250にFreeBSD 14.1-Releaseをインストールし、あわよくばollamaとか動かないか試してみた。
　なお、作業用母艦としてWindows11マシンを使っている。
　これは、その記録である。

　（なお、脳内ナレーションはプロジェクト×風に。）
 
 
 ## Thinkpad X250の仕様
  対象は数年前中古で手に入れた下記の仕様のマシンである。

  <dl>
  <dt>CPU</dt><dd>Core i5-5300U 2.3GHz</dd>
  <dt>GPU</dt><dd>Intel HD Graphics 5500(内蔵)</dd>
  <dt>主記憶装置</dt><dd>8Gバイト</dd>
  <dt>補助記憶装置</dt><dd>SATA SSD 250Gバイト</dd> 
  </dl>
 
## 実現したい要件
 　望みは庶民的だった。
 * デスクトップ環境としてKDE5を入れる。
 * 日本語入力を使えるようにする。
 * Windowsのように充電制御を行う。←New

# インストール
　基本的に[FreeBSDハンドブック英語版](https://docs.freebsd.org/en/books/handbook/preface/ "FreeBSD Handbook")に従ってFreeBSDとKDE5をインストールした。
　FreeBSDはハンドブックに必要な情報がまとまっているので、まずこれを元にするのが良い。

## インストール用USBメモリの作成
　インストールイメージは[ミラーサイトのページ]("https://docs.freebsd.org/ja/books/handbook/mirrors/")を参考に日本のサイトからダウンロードした。なお、オフラインで基本部分をインストールできることを優先してDVD ISOを選んだ（ネット接続してpkgでインストールするなら関係ないけど）。
　ISOイメージをUSBメモリにセットするには[rufus]("https://rufus.ie/ja/")を使用した。このソフトを使うと作成したUSBメモリに、後から必要なファイルを追加できる場合があるので便利。そのマシン専用のドライバや設定ファイルなどをコピーしておけば、そのまま作業できる。
## 基本システムインスートルの概要
　基本システムのインストールは、作成したUSBメモリをセットし、インターネットに有線で接続して起動し、メニューに沿ってインスートルしただけ。
　注意点として、一般ユーザーはX11を使えるようVideoグループに追加しておく。
　ネットワーク設定はlaggsを試したが、現時点で失敗している。
 
 :::note info
 Wifiはそもそもうまくいかないという情報もあるけど・・・。
:::

## 追加設定について
　デスクトップ環境構築、充電制御のため追加設定を行っている。
　ここしばらく非力なATOMマシンを使っていたのでlxqtにしていたが、kubuntuを試したところKDE5は、かなり軽いことがわかり再びKDE5を使うことにした。
### デスクトップのための設定の要点
 このあたりもハンドブックに従って作業する。
 インテル用x11ドライバとdrm-kmodをインストールし、起動時に読み込むよう/boot/loader.confに設定を行っている。
  日本語表示用にadobeとgoogleが共同開発したnotoフォントをインストールしている。これをインストールすると確かにX11で日本語がきれいに表示される。
  KDE5はpkgでインストールするもので十分。
  日本語入力はfcitx5+mozcを入れたが、入れ直してfcitx5+anthyにしている。qtベースのソフトウェアで日本語が入らない場合、日本語入力とqtをつなぐソフトウェアのインストールが必要【情報追加必要】。
```
 pkg install xorg,xf86-video-intel,drm-komd
 sysrc kld_list+=i915kms
 pkg install kde5,konsole,chromium,falkon,noto,urwfonts
```
### 充電制御の要点
　Thinkpad T460sはバッテリー保護のため充電の上限設定ができるようになっている。
　今回のX250のバッテリーは既に劣化しているが、今後のことも考えバッテリーの充電の上限設定ができないか調べてみた。
　まずFreeBSDの標準機能やパッケージで無いかネット検索したがみつからない。
　調べていくとACPIでいろいろバッテリーの情報取得や制御を行えるらしい。
　これを手かがりに検索していくと、FreeBSDフォーラムで[ラップトップの充電制御に関するやりとり](https://forums.freebsd.org/threads/how-to-set-battery-charging-thresholds-on-laptop.79807/ "How to set battery charging thresholds on laptop...")が見つかった。
　2021年4月24日付けのFuzzbox氏の書き込みが、ズバリ回答になる。
　こういう情報を知っている人って、どうやって調べているんでしようね。

<details><summary>Fuzzbox氏の書き込みの引用</summary>

>Hi,
>
>T430 here.
>
>What works for me to set charge start threshold to 80% and stop charge threshold to 95% :
>
>Get battery acpi handle :
>
>sysctl dev.acpi_ibm.0.%location
>dev.acpi_ibm.0.%location: handle=\_SB_.PCI0.LPC_.EC__.HKEY
>
>Use it to set the start charge threshold :
>acpi_call -p '\_SB_.PCI0.LPC_.EC__.HKEY.BCCS' -i 80
>
>and set the stop charge threshold :
>acpi_call -p '\_SB_.PCI0.LPC_.EC__.HKEY.BCSS' -i 95
>
>Quite close to what was described in the Reddit post.
>Don't know if it works on a T480.
>Good luck.
>
</details>

　この情報を元にacpi_ibmを読込acpi_callをインストールしてから、X250で試したところ充電制御ができた。
　しかし、再起動すると設定が消えてしまう。
　さこで起動する度に自動設定する方法として、rc.dを利用することとした。
　こんな感じのスクリプトtpchargeを作って/usr/local/etc/rc.dに保存した。
　充電率が50%を下回ったら充電開始し、75%未満で停止させる。
 ```
 #!/bin/sh

#
. /etc/rc.subr

name="tpcharge"
rcvar="${name}_enable"

start_cmd="${name}_start"
stop_cmd="${name}_stop"

load_rc_config $name
: ${rcsample_enable:="NO"}

tpcharge_start(){
	/bin/echo "Charge Control Start."
	/usr/local/sbin/acpi_call -p '\_SB_.PCI0.LPC_.EC__.HKEY.BCCS' -i 50
	/usr/local/sbin/acpi_call -p '\_SB_.PCI0.LPC_.EC__.HKEY.BCSS' -i 75
}

tpcharge_stop(){
}

run_rc_command "$1"
 ```
　そして、このスクリプトをrc.confに登録したところ、再起動しても充電制御がきいている。

### 各種設定ファイル
* loader.conf
```
kern.vty=vt
acpi_ibm_load="YES"
acpi_call_load="YES"

if_lagg_load="YES"
fusefs_load="YES"
```
* rc.conf
　laggに再挑戦するため設定をコメントアウトしているので、汚いです。
```
hostname="oreias.localhost"
keymap="jp.kbd"
sshd_enable="YES"
ntpd_sync_on_start="YES"
powerd_enable="YES"
powerd_flags="-a adaptive -b minimum -m 1700 -M 3700"
moused_nondefault_enable="NO"
tpcharge_enable="YES"
webcamd_enable="YES"

# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"

#Network
#cloned_interfaces="lagg0"
#network_interfaces="AUTO"

wlans_iwm0="wlan0"
#ifconfig_wlan0="wpa country JP regdomain ETSI"
ifconfig_wlan0="WPA DHCP"
create_args_wlan0="country JP regdomain ETSI"

#ifconfig_em0="inet 192.168.71.200 netmask 255.255.255.0"
#defaultrouter="192.168.71.1"

#link 
#ifconfig_em0="up"
#ifconfig_lagg0="inet 192.168.71.201 netmask 255.255.255.0 laggproto failover laggport em0 laggport wlan0"

#ifconfig_em0="up"
#ifconfig_wlan0="up"
#defaultrouter="192.168.71.1"

kld_list="i915kms"
dbus_enable="YES"

font8x16="b16.fnt"

kld_list="/boot/modules/i915kms.ko"

cupsd_enable="YES"

#wlans_iwn0="wlan0"
#ifconfig_wlan0="WPA DHCP"
#wlans_iwm0="wlan0"
```
* sysctl.conf
```
#
#  This file is read when going to multi-user and its contents piped thru
#  ``sysctl'' to adjust kernel values.  ``man 5 sysctl.conf'' for details.
#

# Uncomment this to prevent users from seeing information about processes that
# are being run under another UID.
#security.bsd.see_other_uids=0

hw.acpi.suspend_state=S3
hw.acpi.thermal.min_runtime=300
hw.acpi.battery.info_expire=30
hw.acpi.power_button_state=S5
hw.acpi.sleep_button_state=S3
hw.acpi.lid_switch_state=NONE

hw.acpi.reset_video=1
hw.syscons.sc_no_suspend_vtswitch=1

vfs.usermount=1
hw.snd.default_unit=1
```
* fstab
```
# Device	Mountpoint	FStype	Options	Dump	Pass#
/dev/ada0p2	/		ufs	rw	1	1
/dev/ada0p1	/boot/efi		msdosfs	rw	2	2
/dev/ada0p3	none		swap	sw	0	0
proc		/proc		procfs	rw	0	0

```
## 課題・その他
　リムーバブルメディアのオートマウントを[このサイト]("https://running-dog.net/2022/11/post_2737.html")を参考に設定した。
　いつも参考にしてます。
 # 未解決の課題
　以上でかなり実用的なデスクトップ環境を構築できたが、いくつか未解決の問題がある。
 * laggを用いて有線LANと無線LANを自動切り替えできるようにする。
 * バッテリー充電制御はsysctl.confへの設定で何とかならないのか。
 * スリープモードを有効した場合、スリープモードに入ると電源押しても復帰しない。
　以上の解決策をご存じの方は教えてください。
# このマシンで生成AIを試してみた
　バッケージでollamaはインストールできる。
　起動は先にサービスを起動してから、LLMを起動する。
　ただし、これが正しい方法かは疑念がある。
```
ollama serve
ollama run 使いたいLLM
```
　これで起動すると高い頻度でollamaが落ちる。やはり非力すぎるのだろうか。
 　また起動できてもプロンプトを入力できるまでには、かなりの時間がかかる（およそ6分くらい）。
　試しにtanuki8bを動かしてみたところ、このマシンでは動くけど、かなり遅い。
　遅すぎてコマンドプロンプトがおかしくなるくらい遅い。年代が近いThinkpad T460s(Nvidia入ってる、主記憶24Gバイト)は、ちょろちょろと回答が返ってくるのでGPGPUの有無がかなり影響していると思う。
 
# 使ってみての感想
　ubuntu系統のLinuxディストリビューションと比べて手間がかかるけど、そんなに大変ではない。
　Windows11に移行できない、第7世代までのCore iシリーズを積んだマシンでもOSをFreeBSDやLinuxに換えれば、（電力効率とか無視すれば）まだまだ使えるマシンがあると思う。
　今のFreeBSDは日本語の表示も凄くきれいになっていて、KDE5ならWindows11より見た目が良いし、動作も軽い。普通の事務仕事（ワープロや表計算、ブラウザで済むレベル）なら、このマシンでもまだできますね。
　ていうか、昨年夏、職場で新型マシンになったけど、旧マシンの処理能力はこれとどっこいどっこいだった。新型も第10世代core i3でpassmarkが6000位なので、旧来の事務作業なら実用になるよなあ。
　けど生成AIをローカルで動かすとか考えるなら、少なくともGPGPU搭載が必要かと。
 　
　以上は、個人的に試した結果です。
　もし、おかしな点、改善すれば良いところがありましたら教えていただけるとありがたいです。