Plamo Linux 7.x パッケージ作成メモ

Plamo 7.0 リリース後も環境に合わせたり、MLでの質問の回答を載せたりと更新を続けています。

# 更新履歴

* **2022-02-09**: ca_certificate パッケージの部分で、CA証明書の更新処理を自動で行うようになったことを追記しています。glibc のバージョンを現状に合わせました（内容は変わっていません）
* **2021-09-15**: elogind を導入しました。詳細は [Plamo Linux の elogind 対応](https://zenn.dev/tenforward/articles/aad089940a1277) をご覧ください。
* **2020-03-07**: PHP を Apache から使う場合の注意点を追記しました
* **2019-05-06**: 令和対応パッチを当てましたw）
* **2019-02-25**: glibc 2.26 → 2.28 へ update されたのでセクションタイトル変更。内容は変わっていません

# glibc 2.33

基本はこれまでと変化はありませんが、ロケールの部分が少し変わっています。

（あまり理解していないので以下は間違ってるかも）

Plamo-6.x までは `/usr/share/locale` 以下にすべての関連ファイルがそろっていましたが、イマドキは `/usr/share/locale`は各種ソフトウェアのメッセージカタログが置かれているだけで、システム上で定義されている（使える）ロケールは `/usr/share/i18n` のデータを元に `localedef` コマンドを実行すると、`/usr/lib/locale/locale-archive` ファイルに保存されるようです。

glibc では、コンパイル後のインストール時に

```shell-session
$ make localedata/install-locales
```

と実行すると、`localedata/SUPPORTED` ファイルに定義されているロケールに対して `localedef` コマンドが実行されます。このファイルにはデフォルトでは glibc がサポートしている全ロケールが書かれていますが、Plamo では全部は不要ですので、

```
SUPPORTED-LOCALES=\
C.UTF-8/UTF-8 \
en_US.UTF-8/UTF-8 \
ja_JP.EUC-JP/EUC-JP \
ja_JP.UTF-8/UTF-8 \
```

というファイルに差し替えて `make localedata/install-locales` を実行しています。なお、`C.UTF-8` は標準では含まれていませんので、パッチを適用しています（Red Hat系、Debian/Ubuntu、Slackware 辺りには同様のパッチが当たっているようです）。

このように作られたパッケージをインストールすると、

```shell-session
$ locale -a
C
C.utf8
POSIX
en_US.utf8
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
```

`japanese` とかは `/usr/share/locale/locale.alias` ファイル辺りからエイリアスとして作られるのでしょうか。

2.28 B4 パッケージで令和対応しました (^^)

```shell-session
$ date +%Ex 
令和元年05月06日
```

# 起動時処理・デーモン起動

これまでは起動時の処理は /etc/rc.S、/etc/rc.M、/etc/rc.inet{1,2} などで BSD 的に書かれていました。以前良くあった /etc/init.d などに置かれる起動スクリプトは rc.M から呼ばれていましたが、Plamo 7.0 では、以前のメジャーなディストリビューションが採用していた /etc/rc.d/init.d 以下にスクリプトを置き、/etc/rc${runlevel}.d/ 以下に起動順に並ぶようなシンボリックリンクが置かれる形式になりました（LFS/BLFSの起動スクリプトを採用しています）。

起動する、しないは、CentOS6 や以前の Debian なんかのようにコマンドで /etc/rc.d/rc${runlevel}/ 以下のリンクを動的に生成するのではありません。リンクはパッケージに含まれていますが、その先の /etc/rc.d/init.d/ 以下のスクリプトに実行権限があるかないかによって決まります。

***全員が起動して使うわけでもないだろう、というデーモンについては、起動スクリプトをインストールはするものの、実行権を付けていませんので必要に応じて `chmod` コマンドで `/etc/rc.d/init.d/` 以下のスクリプトに実行権をつけてください。***

## キーボード設定

Plamo-6.2 までは /etc/rc.d/rc.keymap みたいなファイルを呼んでいたと思いますが、7.0 からは /etc/rc.d/init.d/console ファイルでキーボードを設定します（他にコンソールフォントも設定できるようです）。

日本語キーボード（jp106）の場合、`/etc/sysconfig/console` ファイルを次のような内容で作成すれば OK です。

```
KEYMAP="jp106"
```

Plamo 7.0 リリース時点で、インストーラで日本語キーボードを選んだ場合（そしてオプションのキーバインド（CtrlとCapsLockを逆にするとを選択した場合）、インストーラがこの設定を行ってくれるはずです。

# run ディレクトリ

実行時の可変データを置くディレクトリは、イマドキの FHS に従って `/run` になりました。パッケージでも必要に応じて configure オプションでそちらを指定しています。

`/run` は tmpfs です。`/var/run` は `/run` へのリンクになっています。

```shell-session
$ ls -l /var/run
lrwxrwxrwx 1 root root 4  1月 12日  20:30 /var/run -> /run/
$ cat /proc/self/mounts | grep run
tmpfs /run tmpfs rw,relatime 0 0
```

まだ決め打ちで /var/run を向いてるソフトウェアもありますね。

ご自分でパッケージを作ったり、何かインストールする際に `/var/run` のリンクを消してしまったり、普通にディレクトリにしてしまったりすると色々と問題が生じますので注意が必要です。

# elogind

elogind を導入しました。これは udev と同様に、systemd からログインセッション管理関連の機能を抜き出したもので、ConsoleKit2 を置き換えるものです。

特に使うに当たっては注意する点はないですが、詳細についてまとめてありますのでご覧ください。

* [Plamo Linux の elogind 対応](https://zenn.dev/tenforward/articles/aad089940a1277)

# pam

/etc/pam.d 以下は従来とは大きく変わりました。システム共通の include 用のファイルとして

* system-account
* system-auth
* system-password
* system-session

の 4 ファイルがあります。以前のようにデフォルトの `system-auth` に全エントリを書いてそれを参照する方式ではありませんのでご注意を。`plamo-default` ファイルもありません。

デフォルトのパスワードは sha512 で生成されます（`system-password`ファイルを参照してください）。

この 4 つのファイルを必要に応じて include します。

```
account		include system-account
auth    	include system-auth
password	include	system-password
session		include	system-session
```

# カーネルモジュール

起動時に読み込ませたいカーネルモジュールがある場合は `/etc/sysconfig/modules` ファイルにモジュール名を書きます。

# コンソールログがうざい

Linux カーネルでデフォルトで設定されているコンソールログのレベルがそれなりにたくさんのログが表示されるようになっているためのようです。

起動後に

```sh
dmesg -n 1
```

のように調整するか、カーネルの起動パラメータに

```
loglevel=1
```

を追加してみてください。

# eudev

udev は今や systemd に統合されていますので、systemd を使っていない Plamo では gentoo 由来の [eudev](https://github.com/gentoo/eudev) を使用しています。

## 複数の NIC がある場合

Plamo マシンで複数 NIC があるってケースはあまりないのかもしれませんが…

Plamo-6.x のときの udev では、標準でインストールされるファイルの中に NIC に与えられる名前が起動するたびに変わらないようにするために `/lib/udev/rules.d/75-persistent-net-generator.rules` というルールが、`/etc/udev/rules.d/70-persistent-net.rules` が存在しない場合にはこのファイルを生成して、常に特定の NIC には特定の名前が割り当たるようになっていました（CentOS 6なんかでもそうでした）。

eudev になってからそのような処理を行うルールはなさそうですので、LFS では udev-lfs という LFS カスタムのルールやスクリプトをまとめたものを準備しています。

Plamo-7.0 でも、この udev-lfs のファイルをインストールするようにしてあります（55-lfs.rules だけはインストールしてません）。

ただ、前述の `70-persistent-net.rules` ファイルを生成するような処理は含まれていませんので、複数 NIC を使っている場合は手動でスクリプトを実行して、このファイルを作る必要があります（いまのところ）。

```shell-session
sh /lib/udev/init-net-rules.sh
```

ただ、今の eudev では、カーネルが付与する NIC の名前 eth*、wlan* をルールの中で決めるのはちゃんと動かないようですので（よく理解してないけどたぶん）、複数 NIC があって、固定した名前を使いたい場合は、上で紹介したコマンドで生成した `/etc/udev/rules.d/70-persistent-net.rules` ファイルで指定する名前は、例えば `net0`、`net1` など、バッティングしない名前にするのが良いようです。

```
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="(MAC Address)", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="net0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="(MAC Address)", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="net1"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="(MAC Address)", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="net2"
```

Plamo ではデフォルトではカーネルの起動パラメータで `net.ifnames=0` というのを指定しています。これが指定されていると、`/lib/udev/rules.d/80-net-name-slot.rules` 内の処理はスキップされますので、上記のように指定すると、対応する MAC Address に対応して `net0`、`net1`、`net2` で起動してくるはずです。

起動パラメータで `net.ifnames=0` を指定する代わりに

```
touch /etc/udev/rules.d/80-net-name.slot.rules
```

とすると、`/lib/udev` にある方のルールが `/etd/udev` の方のファイルで上書きされますので同じように動くはずです。

Network I/F デバイス名を変えた場合は `/etc/sysconfig/ifconfig.*` ファイルの名前と中身も変えるのをお忘れなく。

### Predictable Network Interface Names

もしくは起動パラメータで `net.ifname=0` を指定せず、`/etc/udev/rules.d/80-net-name.slot.rules` も作成せずに起動すると `Predictable Network Interface Names` と呼ばれる規則性があり、かならず一意に名前が決まる方法で名前が決まって起動してきます。ただ `enp1s1` とか覚えにくい名前なので使いづらい気がするなあ。


# network
ネットワークインターフェースの設定は lfs/blfs の方法に従うようになりました。

## DHCPの場合（dhclient）

例えば eth1 を DHCP で設定したい場合、`/etc/sysconfig/ifconfig.eth1` を

```
ONBOOT="yes"
IFACE="eth1"
SERVICE="dhclient"
```

のように書けば eth1 を dhclient を使って DHCP で設定してくれます。

dhclient は　`/sbin/dhclient-script` を呼びますが、 `/etc/dhclient-enter-hooks` スクリプトを準備しておくと、 `resolve.conf` ファイルを作成する関数を定義した直後にこのスクリプトが呼ばれます。

私はこの `/etc/dhclient-enter-hooks` の中身を以下のようにして `/etc/resolv.conf` ファイルを dhclient が生成（書き換え）しないようにしています。

```sh
make_resolv_conf() { :; }
```

dhclient-scirpt の処理終了直前に `/etc/dhclient-exit-hooks` スクリプトが呼ばれます。

dhclient-script には、`/etc/dhclient-enter-hooks.d/` 、 `/etc/dhclient-exit-hooks.d/` 以下に存在する実行ファイルを実行するような処理が書かれていますが、Plamo 7.0 の run-parts コマンドが、 dhclient-script での呼び方と非互換なので動きません（しかもrun-partsコマンドはlibpaperパッケージに含まれているので必ずしもあるわけではない）。

## 固定IPアドレスの場合

eth0 を固定 IP アドレスで設定する場合、以下のような `/etc/sysconfig/ifconfig.eth0` ファイルを作成します（基本はインストール時に質問に答えると作ってくれるはず）。

```
ONBOOT=yes
IFACE=eth0
SERVICE=ipv4-static
IP=192.168.1.2
GATEWAY=192.168.1.1
PREFIX=24
BROADCAST=192.168.1.255
```

## bridge の場合

ブリッジ br0 を作成し、物理インターフェース eth0 に接続したい場合は、以下のように `/etc/sysconfig/ifconfig.br0` を作成します（[blfsのbridge-utilsページ](http://www.linuxfromscratch.org/blfs/view/svn/basicnet/bridge-utils.html)のパクりです）。

```
ONBOOT=yes
IFACE=br0
SERVICE="bridge ipv4-static"  # Space separated
IP=192.168.1.32
GATEWAY=192.168.1.1
PREFIX=24
BROADCAST=192.168.1.255
CHECK_LINK=no                 # Don't check before bridge is created
STP=no                        # Spanning tree protocol, default no
INTERFACE_COMPONENTS="eth0"   # Add to IFACE, space separated devices
IP_FORWARD=true
```

## 無線LAN

wpa_supplicant をインストールすると、サンプルとして `/etc/sysconfig/ifconfig_wlan0-sample` をインストールしますので、中を DHCP か static かに応じて編集し、例えば `/etc/sysconfig/ifconfig.wlan0` として保存します。

続いてSSID、パスフレーズなどの情報を書いた設定ファイルを以下のように `/etc/sysconfig/wpa_supplicant-wlan0.conf` に作成します。

```shell-session
wpa_passphrase SSID SECRET_PASSWORD > /etc/sysconfig/wpa_supplicant-wlan0.conf
```

`/etc/sysconfig/ifconfig.wlan0` のサフィックス（`wlan0`）の部分と設定ファイル `/etc/sysconfig/wpa_supplicant-wlan0.conf` の `-` と `.conf` に挟まれた部分が一致していることが重要です。

詳しくは

* [BLFSのwpa_supplicantページ](http://www.linuxfromscratch.org/blfs/view/svn/basicnet/wpa_supplicant.html)

をご覧ください。（スクリプトをみる限りではファイル名の `wlan0` みたいな文字列と実際のインターフェース名は違っていても OK っぽいです。ifconfig.* ファイルの IFACE 変数が一致していれば）

# acpid

次のリリースでハンドラースクリプトを変更しました。

```
2019-02-06  KATOH Yasufumi

        * acpid 2.0.31
          すべてのイベントを取得し、ハンドラーに渡すようにした。
          ハンドラーはログ出力のみを行うようにしてある
          (plamo/05_ext/acpid-2.0.31-x86_64-B3.txz)
```

電源ボタンを押すとか、ノートPCの蓋を閉じるなどのイベントが発生すると、すべてのイベントを `/etc/acpi/handler.sh` で捕捉するようにしました。

引数で色々なパラメーターが取得できます。シェルスクリプトになっていますので、これをサンプルに必要なイベントをキャッチして必要な処理を行ってください。

デフォルトのスクリプトは `logger` コマンドでログを出力する処理のみ行っています。

筆者は Xfce4 の「電源管理」で必要な設定を行っており、acpid のハンドラで処理をするとどうやら両方が働いてサスペンドからの復帰がうまくいかない感じなので、デフォルトのログ出力のみ行うようにしています。

詳しくは ArchLinux の Wiki が参考になるでしょう。

* [acpid](https://wiki.archlinux.jp/index.php/Acpid)

# perl

Perlの site_{lib,arch} と vendor_{lib,arch} をきちっとわけてみました。公式パッケージではパスに perl のバージョン番号が入りません。

perl 5.24.0 パッケージ作成時には以下のようにオプションを与えています。

```bash
    if [ $arch = "x86_64" ]; then
        arch_opts="-Dcccdlflags='-fPIC'"
    else
        arch_opts=""
    fi
  :(snip)
    sh Configure \
       -des \
       -Dprefix=/usr \
       -Dvendorprefix=/usr \
       -Dprivlib=/usr/share/perl5/core_perl \
       -Darchlib=/usr/${libdir}/perl5 \
       -Dsitelib=/usr/share/perl5/site_perl \
       -Dsitearch=/usr/${libdir}/perl5/site_perl \
       -Dvendorlib=/usr/share/perl5/vendor_perl \
       -Dvendorarch=/usr/${libdir}/perl5/vendor_perl \
       -Dman1dir=/usr/share/man/man1 \
       -Dman3dir=/usr/share/man/man3 \
       -Dpager="/usr/bin/less -isR"  \
       -Dcc='gcc -isystem /usr/include' \
       -Dlddlflags="-shared ${LDFLAGS}" \
       -Dldflags="${LDFLAGS}" \
       -Dusethreads \
       ${arch_opts} \
       -Duseshrplib
```

perl module のパッケージ作成の際は

```
perl Makefile.PL INSTALLDIRS=vendor
```

のように実行しています。

# Python

Python は 3 がデフォルトです。

```shell-session
$ ls -l /usr/bin/python
lrwxrwxrwx 1 root root 7  1月 12日  18:43 /usr/bin/python -> python3*
```

Python モジュール作成の際は

* 2, 3 用のモジュールがひとつのパッケージに同梱可能であれば同梱（実行コマンドがなくライブラリコードのみの場合なんかがこれに当たるかな？）
* 2, 3 用は分けて作る必要がある場合は python2_(package), python3_(package) のような名前でパッケージを作るようにしています（全部当てはまるとは限らないけど）
* パッケージ作成の際は `/usr/bin/python` ではなく、なるべく `/usr/bin/python2`、`/usr/bin/python3` を指定するようにしています。

# iptables

`/etc/rc.d/init.d/iptables` スクリプトは blfs バージョンを元にカスタマイズしています。オプションとして取れる引数の種類を増やしました。

```
$ ./iptables help
Usage: ./iptables {start|stop|clear|lock|status|status6|save}
```

* `start` は起動時に実行されるものです。`/etc/sysconfig` 直下に:
    - `iptables`ファイルがあれば `iptables-restore /etc/sysconfig/iptables` を実行します
	- `ip6tables` ファイルがあれば `ip6tables-restore /etc/sysconfif/ip6tables` を実行します
* `stop` と `clear` は同じ処理です。INPUT、OUTPUT、FORWARDING のポリシーを ACCEPT に設定し、Flush を行い、チェーンを削除します（iptables が設定されない状態になります）。IPv4、v6 両方に適用されます
* `lock` は INPUT、OUTPUT、FORWARDING のポリシーを DROP に設定し、Flush を行い、チェーンを削除します（ローカルからはアクセスできます）。IPv4、v6 両方に適用されます
* `save` は現在のルールを `/etc/sysconfig/iptables`、`/etc/sysconfig/ip6tables` にそれぞれ保存します（`ip{,6}tables-save` を呼んでいるだけです）
* `status` は IPv4 向けに設定されているルールを、`status6` は IPv6 向けに設定されているルールを表示します

BLFS で使われる `/etc/rc.d/rc.iptables` ファイルは使いません。

# Firefox/Thunderbird

これまで通り Firefox は unofficial で作成していますので "Nighty" で作成されています。

ただ、適用する日本語リソースをちょっといじって、ブラウザ名は "Plamo Browser" となるようにしてあります。

![firefox1.png](https://qiita-image-store.s3.amazonaws.com/0/27073/4d1071a5-9ea5-6b1c-4aa3-3b7db5afc012.png)

ただ、「Plamo Browser について」というメニューを選択すると、"Nighty" と出てきます（これは画像なのかな?）。このダイアログ中のリンクをクリックすると、mozilla のページに飛びます。

![firefox2.png](https://qiita-image-store.s3.amazonaws.com/0/27073/d01154aa-2072-afae-8e7e-315f19431dae.png)

Thunderbird も "Plamo Mailer" という名前が表示されます。

# Google Chrome

google chrome や chrominium はパッケージとしては提供されませんが、chrome のオフィシャルなパッケージをダウンロードしてきて、Plamo パッケージに変換するスクリプトを次のように配布しています。

* [PlamoBuild.google_chrome-stable_current](https://raw.githubusercontent.com/plamolinux/Plamo-src/plamo-7.x/contrib/network/google_chrome/PlamoBuild.google_chrome-stable_current)

rpm コマンドがインストールされている環境であれば、rpm パッケージからバージョンを抜き出してパッケージに設定します。rpm コマンドがない環境で実行すると、バージョン番号は `stable_current` となります。

# 各種サーバプログラム

Plamo 7.0 では一部の人しか使わないであろうサーバプログラムについては開発の優先度を下げていました（というつもりで私はパッケージを作っていた）。

とりあえず私が必要とするであろうサーバプログラムは作りましたがテストは不十分です。

## Apache httpd

Web サーバは従来通り Apache httpd です。nghttp2 パッケージを `03_libs` に含めてあり、これを有効にして mod_http2 を作成してありますので HTTP/2 にも対応できます。ただし全くテストしていません。

## PHP

従来の cli, modules 版に加え、`--enable-cgi --enable-fpm` を指定した CGI 版も同梱しています。BLFS の起動スクリプトも同梱しています。Apache で mod_proxy_fcgi を有効にすると例えば次のように設定したりして使えるでしょう。

Apache module 版は NTS 版としてビルドしていますので Apache の MPM は prefork でお使いください。event MPM などで使う場合は fpm をお使いください。

```
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/srv/httpd/htdocs/$1
```

PHP の configure オプションについては `phpinfo()` でご確認ください。[ビルドスクリプト](https://github.com/plamolinux/Plamo-src/blob/plamo-7.x/plamo/08_daemons/php) でどのような configure オプション付けているのかはちょっと見づらいと思うので。

## bind / DNS 関連

bind は `dig` などのクライアントコマンドのみインストールする `bind_tools` パッケージになりました。サーバプログラムはパッケージを作成していません。

Plamo で DNS の権威サーバを運用する人はほとんどいないでしょうけど、サーバプログラムとしては nsd のパッケージを準備しました。デフォルトでは設定ファイルなどはインストールされませんので、すべて自分で設定する必要があります。

キャッシュサーバは unbound パッケージを準備しています。こちらは起動させれば最低限の設定で起動するような設定ファイルにしてあります。

bind のように権威サーバとキャッシュサーバを同居させたい場合は工夫が必要です。

## その他

* DB エンジンは mariadb を作成してあります
* Mail 関係は postfix, dovecot を作成しているのでとりあえずサーバは運用できるはず。ただし、この辺りもテストが不十分です

# 音楽プレーヤー

個人的にはこれまで Rhythmbox を使ってきましたが、気分を変えて [lollypop](https://wiki.gnome.org/action/show/Lollypop) パッケージを作ってみました。問題なく動いています。

![lollipop.png](https://qiita-image-store.s3.amazonaws.com/0/27073/6bb98570-b9d1-b455-d4ce-732eb4eafc24.png)

# フォント

TrueType/OpenType フォントはこじまさん作成のパッケージとして

* B&H Lucida
* Liberation
* Dejavu
* Migu
* MiguMix

あたりが基本的なフォントとして入っているところに、Google の

* Noto
* NotoCJK

を入れています。Noto フォントシリーズは全部入れるととんでもないことになるので、基本的なアルファベット系のフォントだけ選んで入れています。

もしかしたらVLゴシックあたりも入れるかも（Noto の Mono フォントが細すぎて見づらい…）

# 日本語入力

uim に加えて fcitx のパッケージを作成しました。ibus、scim は作りません。

fcitx に対する日本語入力エンジンは mozc を準備しています。emacs から使う場合は XIM でも使えますが、ちょっと使いづらいので、mozc.el と mozc_emacs_helper をインストールしますので、そちらで使うのが良いと思います。

Emacs は XIM を使わないように

```
Emacs*useXIM: false
```

と `.Xdefaults` や `.Xresources` で指定すると良いでしょう。



## fcitx

`adduser` コマンドでユーザを作成する際に `fcitx` を指定しても `~/.xinitrc` や `~/.xsession` 内で静的に指定されている uim が起動しますので、`fcitx` を使う場合はコメントアウトしてください。（adduser コマンドでそのあたりも処理しようかと思ったけど面倒だったのでやめたのと、あまり完璧にやるよりは自分で調整するのが Plamo らしいと思ったので）

fcitx を使用するように設定し、最初に Desktop 環境を起動した場合は、キーボードが**英語キーボード**の設定になっているようです。

他に runlevel 5 で起動したり、もしかすると runlevel 3 で起動した場合も fcitx が起動するようになっていると同様かもしれません。

![fcitx1.png](https://qiita-image-store.s3.amazonaws.com/0/27073/933c4d62-c86a-3a29-b4dc-e8fbee4460d1.png)

日本語キーボードを使う場合は「＋」ボタンを押し、「キーボード - 日本語」を選択して追加します。

![fcitx2.png](https://qiita-image-store.s3.amazonaws.com/0/27073/f21f3a62-5af6-c01a-8785-72ba47134469.png)

そして「キーボード - 英語」を削除し、「キーボード - 日本語」を一番上に持っていけば OK です。

![fcitx3.png](https://qiita-image-store.s3.amazonaws.com/0/27073/43c0c134-e137-d66b-6a79-dc3dcf1b73c8.png)

（筆者は英語キーボードを使っているのでこのあたり間違えていたらご報告ください）

## emacsでの日本語入力

`adduser`コマンドでユーザ登録すると、`/etc/template/Default` 以下のファイルがホームディレクトリにコピーされます。この時、`$HOME/.emacs.d/site-start.d/` 以下に emacs の日本語入力関係のファイルが3つコピーされます。

* uim.el
* mozc_el
* skk_el

このうち、そのままの状態で読み込まれるのは `.el` で終わるファイルだけなので `uim.el` が読み込まれます。もし Desktop 環境で fcitx を使っている場合は `mozc` を使うと良いでしょう。

```shell-session
$ cd ~/.emacs.d/site-start.d
$ mv uim.el uim_el (uimの設定が読み込まれないようにする)
$ mv mozc_el mozc.el (mozcの設定が読み込まれるようにする)
```
`mozc_el`の中にはサンプル設定が書かれているので必要に応じてコメントを外したり、設定を追加したりしてください。

（ちなみに ~/.emacs.d/site-start.d 以下のファイルでデフォルトでは読み込まないファイルが他にもいくつかディレクトリには存在するはずです）

現時点では、もうひとつ mozc 用の設定ファイルとして `mozc-el_el` というファイルがありますが、これは不要ですので消しても OK です（fcitx_mozc パッケージを作り直す時に消します）。

# CA証明書

curl や wget で使う信頼する root CA の証明書群は、Plamo-6.2 以前は openssl コマンドに含まれていました。

しかし、Plamo-7.0 では `ca_certificate` という独立したパッケージとなりました。これは mozilla からダウンロードした rootCA の証明書データ（firefoxなどで使われるnss内のものです）を元に、使えるデータに変換を行っています。

この変換を行うのが

* [make-ca](https://github.com/djlucas/make-ca/)

スクリプトです。

このスクリプトは

```shell-session
$ sudo make-ca -g
```
というように `-g` オプションを付けると mozilla のサーバに繋いで最新の root CA 証明書のデータファイルを取得し、ホスト上の証明書データを更新します。

現在のパッケージでは `/etc/cron.weekly/update-cacert.sh` というスクリプトがインストールされるようになっており、このスクリプトの中身が `make-ca -g` を実行するようになっています。（2022-02-09更新）

# lightdm

ここしばらくは Plamo は runlevel 3 で、コンソールログインした後に `startx` コマンドで X を起動するのが通常で、runlevel 5 の調整はほとんどされていなかったと思います。

今回、少しモダンに（というか今や普通ですが）runlevel 5 で起動してディスプレイマネージャ経由でログインできるように調整してみました。デフォルトは runlevel 3 ですが、たまには気分を変えて runlevel 5 で起動してみてはいかがでしょう?

lightdm 起動時はセッションラッパーとして `/usr/bin/lightdm-session` が実行されます。この中で設定ファイルとして、

1. `/etc/profile`
2. `$HOME/.profile`
3. `/etc/xprofile`
4. `$HOME/.xprofile`
5. `/etc/X11/app-defaults/xinitrc./` 以下のスクリプト
6. `$HOME/.xsession`（実行権がついている場合のみ）

を順に読み込みの記述を実行します。`adduser` でコピーされる $HOME 以下のファイルでは、`.xprofile` を準備していますので、この中で起動時に設定したい環境変数を設定します。具体的には LANG やインプットメソッド方面の、従来は `.xinitrc` で実行していたことを実行すれば良いでしょう。

つまり、`.xprofile` は、`.xinitrc` の最後でデスクトップ環境を起動する記述がありますが、その部分だけ除いた記述になります。

他に

* `/etc/X11/Xresources`, `$HOME/.Xresources` があれば xrdb を実行する
* `/etc/X11/Xmodmap`, `$HOME/.Xmodmap` があれば xmodmap を実行する

という処理が行われます。

私は普段 2 画面環境なのですが、何も設定しないと lightdm のログインダイアログがどっか行ってしまったり、表示が変だったりしますので、`/etc/lightdm/lightdm.conf`に以下のような設定をしています（左側に HDMI、右側に VGA のモニタ）。

```
[Seat:*]
display-setup-script=xrandr --output HDMI1 --primary --left-of VGA1
```

lightdm-gtk-greeter を使っていますので、`/etc/lightdm/lightdm-gtk-greeter.conf` でログインダイアログを設定します。

```
[greeter]
active-monitor=0
```

# libvirt, qemu

Plamo 7.0 リリース時点の libvirt, qemu ではローカルに VM を作るには色々と足りていませんでした。パッケージを更新、追加していますのでパッケージを更新してください。`contrib/virtualization` 以下のパッケージすべてが必要なはずです（contrib/network/ 以下の ebtables 含め）。

すべて更新すると Windows も動きます。

![Windows10_install.png](https://qiita-image-store.s3.amazonaws.com/0/27073/0dc710af-3609-c700-2370-5551bbffa31a.png)


# virt-manager

これは contrib パッケージですし、あまり使う人はいないかもしれませんが、6.x のころから kvm や libvirt などとともに contrib に置いてあって、私は仕事で使っています。最近は kvm + libvirt は別に準備した Ubuntu マシンに構築し、virt-manager を使ってリモートの libvirt を操作しています。

Plamo 7.0 用の virt-manager を作成するにあたって、ちょっと Plamo 用のパッチを適用してみました。

## libosinfo

virt-manager を使って VM を作成する際に、OS を指定しますが、OS/Distribution の一覧は [libosinfo](https://libosinfo.org/) というライブラリを使って取得します。この OS などの DB は [libosinfoの公式サイトのリリースディレクトリ](
https://releases.pagure.org/libosinfo/) に osinfo-db-(日付).tar.gz のように置かれています。

ダウンロードして見てみると、単に XML ファイルがディレクトリに分類されて収録されているだけでした。そこで Plamo 用の XML ファイルを他のディストリビューションのファイルをコピーして変更してでっち上げました。

```
$ osinfo-query os
 短縮 ID            | 名前                                             | バージョン | ID                                      
----------------------+----------------------------------------------------+----------+-----------------------------------------

  : (snip)
 opensuse42.1         | openSUSE Leap 42.1                                 | 42.1     | http://opensuse.org/opensuse/42.1       
 opensuse42.2         | openSUSE Leap 42.2                                 | 42.2     | http://opensuse.org/opensuse/42.2       
 opensusetumbleweed   | openSUSE Tumbleweed                                | tumbleweed | http://opensuse.org/opensuse/tumbleweed 
 plamo6.2             | Plamo 6.2                                          | 6.2      | http://plamolinux.org/plamo/6.2         
 plamo7.0             | Plamo 7.0                                          | 7.0_20180220 | http://plamolinux.org/plamo/7.0         
 rhel-atomic-7.0      | Red Hat Enterprise Linux Atomic Host 7.0           | 7.0      | http://redhat.com/rhel-atomic/7.0       
 rhel-atomic-7.1      | Red Hat Enterprise Linux Atomic Host 7.1           | 7.1      | http://redhat.com/rhel-atomic/7.1       
 rhel-atomic-7.2      | Red Hat Enterprise Linux Atomic Host 7.2           |
  : (snip)
```

というような感じで Plamo もリストアップされます。

## virt-manager

virt-manage の VM 作成時の OS 一覧は、"Linux" を選択するとメジャーなディストリビューションが一覧されますが、「すべての OS オプションの表示」を選ぶと、ディストリビューションがグループ分けされてメニュー表示されます。

![virt-manager1.png](https://qiita-image-store.s3.amazonaws.com/0/27073/182bc386-4137-0f6d-4c83-b26672db3c32.png)

この中に Plamo というグループを作ってみました。このグループはコードに直に書かれていました。

![virt-manager2.png](https://qiita-image-store.s3.amazonaws.com/0/27073/3bf1b688-b980-c3e0-592c-d5b8a192bf50.png)

これで Plamo から "Plamo 7.0" を選択すると、あらかじめ定義されたリソース値を指定した状態で VM 作成画面が現れます。

これだけだとまあ見た目だけの問題ですが、一応 Plamo 7.0 を選択すると、デフォルトのでディスクは virtio ディスクに、デフォルトの NIC は virtio-net になるように osinfo の DB を調整してあります。これがないと IDE で rt8139 とかで作られて遅いので、一度 VM 作成前に定義し直さないとだめで意外に面倒です。

![virt-manager4.png](https://qiita-image-store.s3.amazonaws.com/0/27073/06bb3859-a59c-6e3c-842a-bd4970970be9.png)