この記事は openSUSE Advent Calendar 2022 の6日目です。

systemd が使われるようになると、daemon の制御とかのやり方は大きく変わりました。/etc/init.d にあるスクリプトから、systemd パッケージに含まれるコマンドを使うようになってきました。それらのコマンドは、xxxxxctl という、末尾に ctl が含まれるものが多いように感じました。そこで、/usr/bin/ の中にある、末尾が ctl なプログラムがどんなものかを簡単に調べて見ることにしました。

今回は、localectl を紹介します。

コマンド名: localectl
パッケージ: systemd-249.12-150400.8.13.1.x86_64
動作: ○

詳細:
localectl は、システムのロケールを表示したり、変更を行うコマンドです。そのほかに、キーボードマッピングの変更も行えます。locale コマンドと loadkeys や kbdconfig の後継とも考えることができます。ただし、機能は強化されています。
ロケールの表示については、 locale コマンドと localectl コマンドでは内容が違い、locale コマンドの方が環境変数に設定されている値を表示するのに対し、localectl コマンドでは、最低限の物のみを表示します。

%locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

%localectl
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp
      X11 Layout: jp
       X11 Model: microsoftpro
     X11 Options: terminate:ctrl_alt_bksp

また、localectl list-locales でロケールの一覧を表示することができますが、その結果は locale コマンドの結果とは異なっていました。locale コマンドで表示できる、UTF-8系以外のロケールが、localectl では表示されません。

% locale -a | grep ja
ja_JP.eucjp
ja_JP.shiftjisx0213
ja_JP.sjis
ja_JP.utf8

%localectl list-locales | grep ja
ja_JP.UTF-8

但し、localectl でロケールの一覧に表示されていない、たとえば ja_JP.sjis を指定しても、変更することはできました。ちなみに、ロケールの変更は、localectl のサブコマンド set-locale で指定します。

キーボードマップの変更はサブコマンド set-keymap で指定します。これも、loadkeys で指定できるキーマップと異なります。loadkeys の場合ですと、IA アーキテクチャを使用する場合には /usr/share/kbd/keymaps/i386/ 配下にあるキーマップを使いますが、そこにあるマップ一覧と同じものになっています。ただ、標準 jp106 以外の使い道は少ないと思いますが….

%localectl list-keymaps | grep jp
jp
jp-OADG109A
jp-dvorak
jp-kana86
jp106
mac-jp106
%find /usr/share/kbd/keymaps -name "jp*" -print
/usr/share/kbd/keymaps/i386/qwerty/jp106.map.gz
/usr/share/kbd/keymaps/xkb/jp-dvorak.map.gz
/usr/share/kbd/keymaps/xkb/jp-OADG109A.map.gz
/usr/share/kbd/keymaps/xkb/jp-kana86.map.gz
/usr/share/kbd/keymaps/xkb/jp.map.gz

localectl でのロケール変更は、システム全体の変更となるので、一時的な変更には使えません。一時的な変更は、環境変数を設定し直すことになります。キーボードの変更についても、loadkeys と同等のことはできますが、locale と言う名前でキーボードの操作、と言うことになるので、ちょっと分かりにくいかもしれません。使い道は限定されそうです。

この記事は openSUSE Advent Calendar 2022 の4日目です。

systemd が使われるようになると、daemon の制御とかのやり方は大きく変わりました。/etc/init.d にあるスクリプトから、systemd パッケージに含まれるコマンドを使うようになってきました。それらのコマンドは、xxxxxctl という、末尾に ctl が含まれるものが多いように感じました。そこで、/usr/bin/ の中にある、末尾が ctl なプログラムがどんなものかを簡単に調べて見ることにしました。

今回は、busctl を紹介します。

コマンド名: busctl
パッケージ: systemd-249.12-150400.8.13.1.x86_64
動作: ○

詳細:
busctl は、D-Bus の状態を表示させたり、設定を行ったりするためのツールです。取りあえず起動してみると、

NAME                                  PID PROCESS         USER    CONNECTION    UNIT                          SESSION DESCRIPTION
:1.0                                    1 systemd         root    :1.0          init.scope                    -       -
:1.1                                  632 wickedd-dhcp6   root    :1.1          wickedd-dhcp6.service         -       -
:1.10                                 705 wickedd-nanny   root    :1.10         wickedd-nanny.service         -       -
:1.105                               3249 busctl          ribbon  :1.105        session-4.scope               4       -
:1.13                                 720 ModemManager    root    :1.13         ModemManager.service          -       -
:1.16                                1120 gdm             root    :1.16         display-manager.service       -       -
:1.17                                1128 accounts-daemon root    :1.17         accounts-daemon.service       -       -
:1.2                                  618 avahi-daemon    avahi   :1.2          avahi-daemon.service          -       -
:1.24                                1275 power-profiles- root    :1.24         power-profiles-daemon.service -       -
:1.26                                1280 rtkit-daemon    root    :1.26         rtkit-daemon.service          -       -
:1.27                                1274 upowerd         root    :1.27         upower.service                -       -
:1.3                                  628 wickedd-auto4   root    :1.3          wickedd-auto4.service         -       -
:1.32                                1324 wpa_supplicant  root    :1.32         wpa_supplicant.service        -       -
:1.4                                  630 wickedd-dhcp4   root    :1.4          wickedd-dhcp4.service         -       -
:1.45                                1437 colord          colord  :1.45         colord.service                -       -

のように、現在のバスの一覧が表示されます。とは言っても、D-bus がどういう物で、何をしているかを分かっていないと、この表示の意味も分かりませんね。Wikipedia先生に聞いてみると、

D-Bus(Desktop Bus、ディーバス)は、メッセージバスと呼ばれる、アプリケーション間でやりとりを行うための、プロセス間通信 (IPC) 実装の1つである。

なのだそうです。
Unix系のプロセス間通信としては、パイプ、シグナル、ソケットとかいろいろありました。また、KDE や Gnome も独自のプロセス間通信機能を持っていました。それらの乱立を統一化するために作られたのが D-Bus ということになります。
ただ、D-Bus そのものは、ユーザが直接さわる物ではありません。あくまでもプロセス(プログラム)の世界で使われるものです。そのため、busctl も、D-Bus の動作の確認やデバッグ、テスト用に使われるものと思った方がよいでしょう。

この記事は openSUSE Advent Calendar 2022 の1日目です。

systemd が使われるようになると、daemon の制御とかのやり方は大きく変わりました。/etc/init.d にあるスクリプトから、systemd パッケージに含まれるコマンドを使うようになってきました。それらのコマンドは、xxxxxctl という、末尾に ctl が含まれるものが多いように感じました。そこで、/usr/bin/ の中にある、末尾が ctl なプログラムがどんなものかを簡単に調べて見ることにしました。
今回は、bluetoothctl を紹介します。

コマンド名: bluetoothctl
パッケージ: bluez-5.55-150300.3.11.1.x86_64
動作: ○

詳細:
bluetooth の制御をするためのコマンドです。初っ端からですが、systemd とは無関係です。動作には、bluethoothd が必要です。
手持ちの、openSUSE が動く物理マシンでは、bluetooth 機能が標準で入っていなかったので、USB 接続の、バッファローの USB アダプタを使って検証してみました。

まずは、systemd で bluetoothd を起動しておきます。
続いて、USB アダプタを差し込み、bluetoothctl を起動します。
起動すると、プロンプトが表示されるので、デバイスのスキャンをするため、スキャンコマンドを入力すると、エラーになってしまいます。

# bluetoothctl
Agent registered
[CHG] Controller 00:1B:DC:F3:8B:51 Pairable: yes
[bluetooth]# scan on
Failed to start discovery: org.bluez.Error.NotReady
[bluetooth]#

これは、USB Bluetooth アダプタを差し込んだだけでは、まだ機能が動いていないためです。まずは、Bluetooth アダプタの機能を有効にするため、power on と入力します。すると、今度は見えるようになりました。

# power on
[CHG] Controller 00:1B:DC:F3:8B:51 Class: 0x00000104
Changing power on succeeded
[CHG] Controller 00:1B:DC:F3:8B:51 Powered: yes
[bluetooth]# scan on
Discovery started
[CHG] Controller 00:1B:DC:F3:8B:51 Discovering: yes
[NEW] Device 77:6C:E6:94:2A:38 77-6C-E6-94-2A-38
[NEW] Device 7E:4D:FE:CB:CC:D9 7E-4D-FE-CB-CC-D9
[CHG] Device 77:6C:E6:94:2A:38 RSSI: -73
[NEW] Device 4C:FD:32:93:41:95 4C-FD-32-93-41-95
[CHG] Device 77:6C:E6:94:2A:38 RSSI: -65
[NEW] Device 46:D9:DC:39:CC:E8 46-D9-DC-39-CC-E8
[NEW] Device 8C:DE:52:B8:AB:EA SRS-X33
[CHG] Device 77:6C:E6:94:2A:38 RSSI: -73
[CHG] Device 77:6C:E6:94:2A:38 RSSI: -65
[bluetooth]#

ここで、pair コマンドを入力すると

# pair 8C:DE:52:B8:AB:EA
Attempting to pair with 8C:DE:52:B8:AB:EA
[CHG] Device 8C:DE:52:B8:AB:EA Connected: yes
[CHG] Device 8C:DE:52:B8:AB:EA Modalias: bluetooth:v0039p1582d2110
[CHG] Device 8C:DE:52:B8:AB:EA UUIDs: 00001108-0000-1000-8000-00805f9b34fb
[CHG] Device 8C:DE:52:B8:AB:EA UUIDs: 0000110b-0000-1000-8000-00805f9b34fb
[CHG] Device 8C:DE:52:B8:AB:EA UUIDs: 0000110c-0000-1000-8000-00805f9b34fb
[CHG] Device 8C:DE:52:B8:AB:EA UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[CHG] Device 8C:DE:52:B8:AB:EA UUIDs: 0000111e-0000-1000-8000-00805f9b34fb
[CHG] Device 8C:DE:52:B8:AB:EA UUIDs: 00001200-0000-1000-8000-00805f9b34fb
[CHG] Device 8C:DE:52:B8:AB:EA ServicesResolved: yes
[CHG] Device 8C:DE:52:B8:AB:EA Paired: yes
Pairing successful
[bluetooth]#

となり、ペアリングが出来るようになりました。

この先は試してみていませんが、デバイスの削除とか情報の取得とか色々できるようです。
GUI な環境が無い状況での bluetooth 利用には使えると思います。

tftp を使う時に xinetd は不要だった

By ribbon @ 2022-11-14 09:37

ネットワークブートなどを行う時、tftp を起動させるために xinetd を使うことがあります。Cent OSだとバージョン7くらいまではそうなってました。しかし、openSUSE Leap 15.4 の /etc/xinetd.d を見ると、tftp の記述がありません。いろいろ調べて見ると、

systemctl enable tftp
systemctl start tftp

で出来てしまうのですね。
サービスの類いはすべて systemd で、という流れなのでしょう。
15.4 では、/etc/xinetd.d/ には、chargen,daytime,discard,echor,servers,services,time しか残っていませんでした。

はじめに

先日、C100 と Geeko Magazine の告知を出した際、geeko.jp のウェブサーバーが落ちてしまいました。普段は全然問題ないのですが、512 MB の VPS のため、ほんの少しアクセスが増えるとメモリーを使い果たしてしまうようです。

openSUSE の Web サーバーは 2009 年頃から使い続けていることもあって Apache で、しかも MPM (Multi-processing modules) は prefork です。複数のアクセスに対してプロセスを作成して対応するので、メモリー使用量やプロセスの生成コストが課題です。設定変更前のメモリー使用量を見ると次のような状態で、1プロセスあたり 30 MB 前後使っています。とりあえずの対策としては、プロセスの最大数を抑えればよいのですが、メモリー使用量削減のため、これを機に MPM を event にすることにしました。

# smem -U wwwrun -k
  PID User     Command                         Swap      USS      PSS      RSS 
26053 wwwrun   /usr/sbin/httpd-prefork -DS    24.2M   576.0K     1.3M     9.5M 
23952 wwwrun   /usr/sbin/httpd-prefork -DS    14.5M    20.8M    21.7M    30.4M 
26051 wwwrun   /usr/sbin/httpd-prefork -DS     5.6M    23.5M    24.4M    32.9M 
23953 wwwrun   /usr/sbin/httpd-prefork -DS     6.3M    23.7M    24.4M    31.8M 
 2023 wwwrun   /usr/sbin/httpd-prefork -DS     5.4M    24.0M    24.8M    32.7M 
 7054 wwwrun   /usr/sbin/httpd-prefork -DS     7.5M    26.0M    26.8M    35.0M 
23955 wwwrun   /usr/sbin/httpd-prefork -DS     5.0M    32.6M    33.6M    42.2M 
23956 wwwrun   /usr/sbin/httpd-prefork -DS     5.5M    34.2M    34.9M    43.1M 
23959 wwwrun   /usr/sbin/httpd-prefork -DS     5.5M    34.4M    35.3M    43.8M 
 2022 wwwrun   /usr/sbin/httpd-prefork -DS     6.0M    34.7M    35.6M    43.6M

少し前までの Apache の MPM といえば worker で、スレッドを使って並列処理をします。私の知識もここで止まっていました。event は新しい MPM で、今どきのイベント駆動で実装されています。ワーカースレッド内で受信待ちやソケット書き込み待ちをせずに、パケット到着や書き込み可能になったイベントを受けてスレッドに処理を割り当てるようです。

MPM を prefork から event にするために必要なことは、次の通りです。

  • event MPM をインストールする
  • PHP を mod_php による実行から mod_proxy_fcgi + php_fpm (FastCGI) による実行に変える
  • php_fpm で Web アプリを実行できるように AppArmor のプロファイルを設定する

結構面倒くさいですね。

openSUSE のバージョンは Leap 15.4 です。

event MPM をインストールする

これは簡単で apache2-event をインストールするだけです。apache2-prefork もインストールされいる環境では、apache2-event が優先されます。

zypper in apache2-event

mod_proxy_fcgi + php_fpm への変更

これまでは mod_php でこの Word Press などを実行してきました。mod_php の場合、PHP のスクリプトは Apache のプロセスで実行されていました。マルチスレッドに対応していない mod_php は event や worker では使用できません。php_fpm で PHP を別プロセスで起動しておき、リクエスト時にこの PHP プロセスに処理を依頼する形に変更する必要があります。

セットアップ手順は以下の通りです。php7-fpm をインストールして、パッケージに含まれるデフォルトの設定を有効化します。

zypper in php7-fpm

cd /etc/php7/fpm
mv php-fpm.conf.default php-fpm.conf
cd php-fpm.d
mv www.conf.default www.conf

systemctl enable php-fpm
systemctl start php-fpm

Apache 側の設定を変えます。openSUSE では Apache で使用するモジュールは /etc/sysconfig/apache2 で有効化します。php7 を削除し、proxy と proxy_fcgi を追加します。

APACHE_MODULES="(省略)proxy proxy_fcgi"

次に、php ファイルのハンドリングを mod_php から php_fpm に切り替えます。/etc/apache2/conf.d/ に以下のファイルを作成します。openSUSE のデフォルト設定では php7_fpm は 9000 で待ち受けていますので、php へのアクセスを 127.0.0.1:9000 に転送するようにします。

ProxyErrorOverride on は php_fpm がエラーを返した場合に、php_fpm のエラーメッセージをそのままブラウザに返すのではなく、Apache 側で設定したエラー画面を表示するための設定です。


SetHandler "proxy:fcgi://127.0.0.1:9000"


SetHandler application/x-httpd-php-source

DirectoryIndex index.php4
DirectoryIndex index.php5
DirectoryIndex index.php7
DirectoryIndex index.php
ProxyErrorOverride on

AppArmor の設定変更

openSUSE Leap 15.4 では php_fpm 用の AppArmor プロファイルが含まれており、php_fpm が行える操作に制限がかかっています。そのため、何も設定しないと、php-fpm が php ファイルにアクセスできません。/var/log/audit/ に次のようなログが出力され、403 が返ります。

type=AVC msg=audit(1661003085.840:89050): apparmor="DENIED" operation="open" profile="php-fpm" name="/srv/www/htdocs/index.php" pid=20329 comm="php-fpm" requested_mask="r" denied_mask="r" fsuid=498 ouid=498

php_fpm のプロファイルを調整するには、/etc/apparmor.d/php-fpm.d/ に次のような設定ファイルを作成し、php-fpm がアクセスできるディレクトリを設定します。

  # tmp へのアクセス
  include 
  # htdocs への読み書き
  # 読み取りだけであれば  もあり
  owner /srv/www/htdocs/** rw,

結果

設定後にメモリー使用量を見てみます。

  PID User     Command                         Swap      USS      PSS      RSS
29193 wwwrun   /usr/sbin/httpd-event -DSYS   208.0K   804.0K     1.3M     4.9M
29195 wwwrun   /usr/sbin/httpd-event -DSYS   208.0K     1.6M     2.8M    11.0M
29194 wwwrun   /usr/sbin/httpd-event -DSYS   208.0K     1.6M     2.8M    11.1M
29196 wwwrun   /usr/sbin/httpd-event -DSYS   208.0K     2.2M     3.4M    11.6M
29278 wwwrun   /usr/sbin/httpd-event -DSYS   208.0K     3.2M     4.4M    12.7M
29094 wwwrun   php-fpm: pool www             208.0K    25.3M    30.3M    47.1M
29306 wwwrun   php-fpm: pool www             208.0K    33.8M    38.4M    54.5M
29337 wwwrun   php-fpm: pool www             208.0K    35.6M    39.5M    54.0M

php-fpm のプロセスが増えましたが、Apache のプロセスのメモリー使用量はぐっと小さくなりました。Apache と php-fpm の初期プロセス数、最大プロセス数はこれから調整したいと思います。

今回は ncdu を紹介します。

ncdu は curces を使用した、ディスク使用量を表示するツールです。その名の通り、du の curces 版です。起動すると、カレントディレクトリの各サブディレクトリやファイルの大きさや使用量を表示します。

注目するディレクトリは、カーソルキーまたは jk キー(vi と同じ)で移動でき、ENTERキーで、そのディレクトリに入ることができます。また、名前順、日付順、項目の数順(おそらく、サブディレクトリ中の項目数)、mtime順に整列し直すこともできます。項目数については、c キーを入力することで表示することもできます。画面の左端には、そのディレクトリの状況(空白とか、読み取れないとか)が表示される場合があります。
起動時にディレクトリを指定することで、任意のディレクトリの状況を表示できます。また、? キーを押すとヘルプ画面が表示されます。

ヘルプにも書いてあるとおり、ncdu から直接ファイルを削除することもできます。ディレクトリを渡りながら、不要なファイルを削除するという作業が効率的に行えます。

du を使って一つずつ調べていくよりも、ncdu を使った方がはるかに効率的に作業ができるので、不要なファイルの掃除をする際には便利に使えそうです。常備しても良さそうです。

今回は ranger を紹介します。

ranger は、コンソール上で動作するファイラーです。日本語化はされていませんが、要所要所で動的にヘルプが出てくるため、それほど困ることはありません。コンソール上で動作するファイラーには mc が有名ですが、mc とは違い、標準で1つのディレクトリに注目するタイプです。
起動すると、このような画面が表示されます。

画面は、三つのペインからなり、左二つがディレクトリ、一番右が注目しているファイルの内容を表示します。テキストファイルであればほとんどのものが表示できます。UTF-8でエンコードされていれば、日本語も表示できます。また、バイナリファイルでも、一部の形式では、ファイルの情報を表示します。
真ん中のペインが今注目しているディレクトリです。ファイルやディレクトリの選択にはカーソルキーのほか、vi と同じ hjkl のキーが使えます。但し、vi のキー配置は、QWERTY 配列に特化しているので、 DVORAK 配列で使うとかなり使いにくいです。

また、複数の画面を管理出来ます。この機能は、タブ機能を使います。”g”の次に”n”を入力することで、タブが有効になり、複数のディレクトリ表示ができるようになります。TAB キーで画面を切り換えることもできますし、”~”キーで左右に表示させることもできます。たとえば、片方のディレクトリからもう片方のディレクトリにファイルをコピーする際には、スペースキーで対象のファイルやディレクトリを選択した後、vi 風のコマンド yy でコピーして、pp でペーストします。

ranger にはこのほかにも、ファイルの整列や検索、パーミッションの設定、シェルの実行など多数の機能があります。色々試してみても面白いと思います。