たかちゃん。

6月 042023
 

最近はテレワークから会社に出社するように変更したので、週に 3 回ほど会社に行くようになりました。会社に行く日は 05:30 起きです。

と、いうことで前ふりはここまで。

この間 05:30 に起きて部屋の中をうろちょろしていたらなんか臭うんですな・・。『なんだろ?この焦げ臭さ??』などと思っていたのですが、朝、近所で火事でもあったのか?と思ったけど消防車のサイレンとか特にない・・。

と、いうことで、夜中に何かしら動いていて怪しいのと思ったのは・・。まずはスマートフォンを確認。で、iPhone8 を触ってみたら熱い・・。『ふむー。夜中の充電中に熱が出たか?』と、思ったのだけど、なんか、ミョーに臭う・・。

ちなみに僕のスマートフォンの充電風景はこんな感じ。

都合 5 台のスマートフォンを充電しております。充電専用の台だったりしますが、この写真は今回の事件のあとに撮りました。iPhone の下のテーブルの黒いシミに注目。詳細はここからです;-)。

で、こちらは AC アダプタを接続するタップ。

コンセント単位にスイッチが付いているものをチョイスしています。少しでも安心・安全・電気を使わないように心がけての気持ちから。

 
で、今日は会社に行く日なので、チンタラチンタラできないません。とりあえず、充電器が接続されているタップのスイッチをオフにして出社。

出勤途中や会社で iPhone8 を使うと、やはり、ミョーに焦げ臭い・・。

と、いうことで家に帰って再度確認。

iPhone8 はケーブルではなく Qi 充電しているのですが、その充電器をひっくり返してみました・・。

あらぁ・・。(@_o)。

あぶねーっ!! 見事に焦げ付いていますっ!!

5V 2.4A の AC アダプタからケーブルを経由して Qi 充電器 (800yen くらいで購入した、どこにでも売っているツヤ) を接続し、その上に iPhone8 を載せて充電していたのですが・・。

木製のテーブルは Qi 充電器直下が炭になっております。

Qi 充電器が熱を帯びて、テーブルが焦げた雰囲気です。 (@_o)
異臭の原因は Qi 充電器が熱で熱くなり、プラスチック側が溶けだし、そのまま木製のテーブルを焦がした可能性があります。

もし、電源タップ側のスイッチをオフにせず、そのまま会社に行っていたら・・。Qi 充電器の上に iPhone がないとはいえ、Qi 充電器が通電していたとしたら、木製のテーブルが燃えだしていたかもしれません・・。『火事』ですな・・。orz

 
バッテリーが爆発するとかはよくある話ですが、 Qi 充電器も木のテーブルを焦がすほどのパワーがあるとは思いませんでした・・。

今回の教訓。

  • 触ってみて熱くなっているモノは壊れる前兆? 火が出る前兆?
  • スマートフォンを充電する場合は木製テーブルの上ではなく、鉄や石の上のほうが安全

皆様もお気をつけくだされ・・。

4月 292023
 

以前のエントリで「Dockerを利用してWordPressを動作させます。それもブリッジを用いて。」や「AlmaLinux8 の VRF。」なんてのを書いていますが、それの改訂版です。

 
なんか、色々調べてみると Linux 方面では bridge を有効にするには全部で三つの方法があるのだそうな。

  • bridge-utils を使う
  • nmcli を使う
  • ip link set dev を使う

 
以前の経験から、古いアーキテクチャである bridge-utils は既に rpm にもなっていない。かつ、IPv6 通信ができない。と、いうことでもう利用してはいけないのであります。IPv6 通信ができない。と、いうのは上記のリンクにも書いています。

nmcli を利用すると、設定情報は Almalinux8 の場合は /etc/sysconfig/network-scripts/ 配下にファイルとして保存してくれるんだけど、これが Almalinux9 になると、保存先が変わって記載方法も変わるのであまり使いたくない・・。

直感的に『あぁ。設定しているなぁ。』と感じるのは ip link set dev なコマンド達でしょうか。今回はこれをメインで bridge 設定をしていきたいと思います。

 
がっ!!

まず、 VRF の設定をしてルーティングテーブルを複数持つ環境を構築し、Docker コンテナを NAT なしで起動するための bridge 化。そしてっ!! 以前利用していた bridge-utils を捨てたのは Docker コンテナで IPv6 を利用するため。

と、いう、これはまさしく地獄絵図;-P。

 
どんな状態になっているか?と、いうと・・。

$ nmcli dev status
DEVICE           TYPE      STATE            CONNECTION      
eth0             ethernet  接続済み         eth0            
eth1             ethernet  接続済み         eth1            
eth2             ethernet  接続済み         eth2            
eth3             ethernet  接続済み         eth3            
eth4             ethernet  接続済み         eth4            
br0              bridge    接続済み (外部)  br0             
br1              bridge    接続済み (外部)  br1             
br4              bridge    接続済み (外部)  br4             
mgmt0            vrf       接続済み (外部)  mgmt0           
lb0              vrf       管理無し         --              
docker0          bridge    接続済み (外部)  docker0         
docker_gwbridge  bridge    接続済み (外部)  docker_gwbridge 
veth32347c8      ethernet  管理無し         --              
lo               loopback  管理無し         --              

 
多少並び直していますが、インターフェースはこれだけあります。結構多いほうだと思います;-)。

一応、表にしてみました。今回は絵はナシで・・。

物理 IF VRF bridge IPv4 IPv6 説明
eth0 br0 192.168.22.0/24 2001:470:fe36:face::/64 外部からのアクセス用で Docker ホストとコンテナで同一セグメント
eth1 br1 192.168.52.0/24 2001:470:fe36:cafe::/64 DB アクセスなどのバックヤード用で Docker ホストとコンテナで同一セグメント
eth2 192.168.111.0/24 2001:470:fe36:111::/64 同一ネットワーク上の NFS サーバへのアクセス用
eth3 mgmt0 192.168.1.0/24 2001:470:fe36:1::/64 外部からの ssh などのメンテナンス用
eth4 lb0 br4 192.168.202.0/24 ロードバランサ配下のためなし ロードバランサ用閉域セグメントで Docker ホストとコンテナで同一セグメント

 
セグメントはそれぞれ記載しましたが、インターフェースにつける実際のアドレスは 218 です。 IPv4/IPv6 共に 218 を設定しています。

 
Docker ホストにはインターフェースが全部で 5 個。
VRF を設定するルーティングテーブルは全部で 3 個。 eth0,eth1,eth2 が所属する default のルーティングテーブル。 eth3 はメンテナンス用なので mgmt0。 eth4 はロードバランサセグメントなので lb0。

5 個のインターフェースの内、Docker コンテナでも同一セグメントを利用するために bridge が存在していますが、それは 3 個。
Docker コンテナのネットワーク接続は色々なパータンを想定。

  • Service-Segment への接続みのウェブサーバ
  • Service-Segment と Access-Segment への接続する WordPress 用サーバ
  • LB-Segment への接続のみの負荷分散を考慮したウェブサーバ
  • LB-Segment と Access-Segment への接続するウェブアプリケーションサーバ

 
Service-Segment は外部からの直接アクセスを想定。 Access-Segmen はバックヤードで DB 接続や tomcat への接続を想定。 LB-Segment はロードバランサ配下の閉域セグメント。

ロードバランサは上位に apache を用意しましたが、上位のロードバランサからの閉域セグメントとして VRF を設定して、かつ、それを bridge して Docker コンテナに直接アクセスするように設定しました。

それにしても、フツー、ここまでするかねぇ?! みたいな;-)。

 
では、実際に設定を見てい行きましょう。

まず、 /etc/sysconfig/network-scripts/ 配下の ifcfg-eth* のファイルですが、フツーの設定で問題ありません。ルーティングテーブルが存在するインターフェースの設定ファイルのみに GATEWAY= や IPV6_DEFAULTGW= を指定してあげてください。
rule-eth* や route-eth* は今回は用意しませんでした。

 
1. VRF の設定
VRF の設定は /etc/rc.local 内に記載します。

ip link add dev mgmt0 type vrf table 10
ip link set dev mgmt0 up
ip link set dev eth3 master mgmt0
ip link set dev eth3 up
ip route add default via 192.168.1.1 table 10
ip route add ::/0 via 2001:470:fe36:1::1 table 10

ip link add dev lb0 type vrf table 4
ip link set dev lb0 up
ip link set dev eth4 master lb0
ip link set dev eth4 up
ip route add default via 192.168.202.1 table 4

route delete default
route delete default
route delete default
route add default gw 192.168.22.1

route delete -host 192.168.1.1
route delete -host 192.168.202.1

ip route del ::/0 via 2001:470:fe36:1::1
ip route del ::/0 via 2001:470:fe36:face::1
ip route del 2001:470:fe36:1::1/64
route -6 add default gw 2001:470:fe36:face::1

sysctl -w net.ipv4.tcp_l3mdev_accept=1
sysctl -w net.ipv4.udp_l3mdev_accept=1

 
こんな感じでしょうか。/etc/iproute2/rt_tables に table 4 とか 10 の名前を書いても良いですが、数値で管理する場合は不要です。

ルーティング設定を色々いじっているのは、ルーティングテーブルが美しくならないのでコマンドで正しいルーティング情報にしているためです。

こうなっているのが美しいかなぁ・・。と、思っています。

$ ip route show
default via 192.168.22.1 dev eth0 
192.168.22.0/24 dev eth0 proto kernel scope link src 192.168.22.218 metric 100 
192.168.52.0/24 dev eth1 proto kernel scope link src 192.168.52.218 metric 101 
192.168.111.0/24 dev eth2 proto kernel scope link src 192.168.111.218 metric 102

$ ip route show table 10
default via 192.168.1.1 dev eth3 
broadcast 192.168.1.0 dev eth3 proto kernel scope link src 192.168.1.218 
local 192.168.1.218 dev eth3 proto kernel scope host src 192.168.1.218 
broadcast 192.168.1.255 dev eth3 proto kernel scope link src 192.168.1.218 
 
$ ip route show table 4
default via 192.168.202.1 dev eth4
broadcast 192.168.202.0 dev eth4 proto kernel scope link src 192.168.202.218 
local 192.168.202.218 dev eth4 proto kernel scope host src 192.168.202.218 
broadcast 192.168.202.255 dev eth4 proto kernel scope link src 192.168.202.218 

$ ip -6 route show
::1 dev lo proto kernel metric 256 pref medium
2001:470:fe36:111::/64 dev eth2 proto kernel metric 102 pref medium
2001:470:fe36:cafe::/64 dev eth1 proto kernel metric 101 pref medium
2001:470:fe36:face::/64 dev eth0 proto kernel metric 100 pref medium
fe80::/64 dev eth0 proto kernel metric 1024 pref medium
fe80::/64 dev eth1 proto kernel metric 1024 pref medium
fe80::/64 dev eth2 proto kernel metric 1024 pref medium
fe80::/64 dev eth3 proto kernel metric 1024 pref medium
default via 2001:470:fe36:face::1 dev eth0 metric 1 pref medium

$ ip -6 route show table 10
anycast 2001:470:fe36:1:: dev eth3 proto kernel metric 0 pref medium
local 2001:470:fe36:1::218:1 dev eth3 proto kernel metric 0 pref medium
anycast fe80:: dev eth3 proto kernel metric 0 pref medium
local fe80::8785:99b6:f03b:cf5e dev eth3 proto kernel metric 0 pref medium
multicast ff00::/8 dev eth3 proto kernel metric 256 pref medium
default via 2001:470:fe36:1::1 dev eth3 metric 1024 pref medium

$ ip -d link show type vrf
7: mgmt0:  mtu 65575 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 56:64:d2:f2:ee:55 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 1280 maxmtu 65575 
    vrf table 10 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 
8: lb0:  mtu 65575 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 2e:68:9e:22:5f:0e brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 1280 maxmtu 65575 
    vrf table 4 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 

 
VRF しているインターフェースのルーティング情報が乗っていると削除して、正しいルーティング情報に直すので roure del したり route add しています。上記になっているのが、僕は一番美しいルーティングテーブルだと思っているのであります。
この辺り、nmcli だとちゃんとやってくれるのかなぁ?

 
VRF は eth0,eth1,eth2 の default テーブルと、eth3 の mgmt0 なテーブル、そして、eth4 のロードバランサ用テーブルと、合計三つのデーブルを作成しました。外部からアクセスすると、おのおののインターフェースから入って、入ってきたところから出ていきます。

 
さてと。 VRF で複数のルーティングテーブルがあると、例えば自分のサーバから外部のサーバに ssh したい場合、default のルーティングテーブルから出ていってしまいます。

本来、メンテナンス用の eth3 のインターフェースがあるのですが、VRF しているのでフツーに ssh するとへんなことになります。そんなときはインターフェース指定でコマンドを実行するのが良いですね。 そんなときに利用するのが if vrf exec コマンドです。

$ traceroute -n 192.168.1.217
traceroute to 192.168.1.217 (192.168.1.217), 30 hops max, 60 byte packets
 1  192.168.22.1  0.416 ms  0.460 ms  0.456 ms
 2  192.168.1.217  0.659 ms  0.654 ms *
$ ip vrf exec mgmt0 traceroute -n 192.168.1.217
traceroute to 192.168.1.217 (192.168.1.217), 30 hops max, 60 byte packets
 1  192.168.1.1  0.405 ms  0.323 ms  0.324 ms
 2  192.168.1.217  0.665 ms  0.668 ms  0.687 ms
$ ip vrf exec mgmt0 ssh 192.168.1.217
>

 
上のは default のルーティングテーブルの gateway である 192.168.22.1 経由で出ていきますが、 ip vrf exec “VRF インターフェース名” を付加してコマンドを打つと eth3 の VRF mgmt0 の gateway を経由して通信できます。 FreeBSD 的には setfib コマンドがありますが、それと同等機能ですね。

VRF の設定はこれにて完了。これは以前書いたものとほぼ一緒かな。

 
2. bridge の設定
次に Docker ホストと Docker コンテナの間で同一のセグメントを利用できるようにする bridge の設定をします。一番上に書きましたが「Dockerを利用してWordPressを動作させます。それもブリッジを用いて。」のエントリの改訂版になります。

bridge-utils はもう捨てて ip link set dev コマンドを利用して設定します。

まず、bridge インターフェースを生成するための docker network create コマンドの実行から。

# docker network create Service-Segment \
     -o "com.docker.network.bridge.name"="br0" \
     --driver=bridge \
     --subnet 192.168.22.0/24 \
     --gateway 192.168.22.218 \
     --ipv6 \
     --subnet 2001:470:fe36:face::/64 \
     --gateway 2001:470:fe36:face::218:1

# ifconfig br0 inet6 del fe80::1/64

 
もう bridge-utils を捨てたので docker network create で生成するネットワークは IPv4/IPv6 のデアルスタクに対応にします。コンテナも IPv4/IPv6 のデアルスタク対応です;-)。

docker network create で –ipv6 を指定するとリンクローカルアドレスに fe80::1 が自動的に付加されます。fe80::1 はコンテナが IPv6 を利用したときの gateway になるんだそうな。強引に付加されます。

bridge なネットワークなので複数の Docker ホストがあった場合、全ての Docker ホストがリンクローカルアドレスに fe80::1 を利用すると IPv6 duplicate address fe80::1 てな感じになり、同一セグメント上のサーバ間の通信ができなくなります。なので、ifconfig br0 inet6 del して削除します。そもそも既に由緒正しいリンクローカルアドレスが付加されているので fe80::1 はまるっきり不要です。

次に br0 と物理インターフェース eth0 を bridge します。

# ip link set dev br0 up
# ip link set dev eth0 promisc on
# ip link set dev eth0 up
# ip link set dev eth0 master br0
# ifconfig eth0 0.0.0.0 up
# ifconfig eth0 inet6 del 2001:470:fe36:face::218:1/64 up

# route add default gw 192.168.22.1 dev br0
# ip route del ::/0 via 2001:470:fe36:face::1
# route -6 add default gw 2001:470:fe36:face::1 dev br0

 
上から順に説明すると、

  • docker network create で生成した br0 を UP します
  • eth0 のプロミスキャス・モードを有効化します
  • eth0 を UP します
  • eth0 と br0 をブリッジ化します
  • br0 に IPv4/IPv6 アドレスが付加されるので eth0 側から削除します
  • 最後にルーティング情報を設定します

こんな感じでしょうか。

ロードバランサセグメント用の設定も書いておきます。

# docker network create LB-Segment \
    -o "com.docker.network.bridge.name"="br4" \
    --driver=bridge \
    --subnet 192.168.202.0/24 \
    --gateway 192.168.202.218

# ip link set dev br4 up
# ip link set dev eth4 promisc on
# ip link set dev eth4 up
# ip link set dev eth4 master br4
# ifconfig eth4 0.0.0.0 up

# ip link set dev lb0 up
# ip link set dev br4 master lb0
# ip link set dev br4 up
# ip route add default via 192.168.202.1 table 4

 
こちらは閉域ネットワークです。でもって IPv6 がないのでシンプルです。外部からロードバランサ経由でアクセスがあったものは default gateway に戻っていきます。
ちなみに eth4, br4 の brige インターフェースは lb0 という VRF でもあるわけですが、bridge 生成時に VRF を意識する必要は全くありません。すげ;-)。

ちなみに eth1, br1 の組み合わせも bridge して docker network で Access-Segment として create しますが、今回は割愛します。

 
bridge を終了するコマンドも記載しておきます。

# ip link set eth0 promisc off
# ip link set eth0 down
# ip link set dev eth0 nomaster
# ip link delete br0 type bridge

# docker network rm Service-Segment

# ifconfig eth0 192.168.22.218/24
# ifconfig eth0 inet6 add 2001:470:fe36:face::218:1/64

# route add default gw 192.168.22.1 dev eth0
# ip route del ::/0 via 2001:470:fe36:face::1
# route -6 add default gw 2001:470:fe36:face::1 dev eth0

# ping -q -c 3 192.168.22.1 > /dev/null 2>&1

 
こちらも一応、説明しておきます。

  • eth0 のプロミスキャス・モードをオフにします
  • eth0 を DOWN してから eth0 と br0 の bridge を削除します
  • br0 を削除するので docker network rm を実行します
  • eth0 に IPv4/IPv6 アドレスを付加します
  • ルーティング情報を更新します
  • 最後に ping を打つのは上位のルータが保持している古い MAC アドレスを書き換えるため

こんな感じでしょうか。

これで VRF でルーティングテーブルが個別なネットワークを bridge して Docker コンテナが利用できる環境が整いました。

 
3. IPv4/IPv6 デアルスタク対応コンテナの起動
最後に Docker コンテナの使い方について書いておきます。何回も書いている通り bridge-utils を捨てて ip link set dev コマンドに移行したので Docker コンテナは IPv4/IPv6 のデアルスタクで動作させられます。

起動はこんな感じで。もっと複雑な起動方法については「Dockerを利用してWordPressを動作させます。それもブリッジを用いて。」を参照してください。

$ docker run -d \
 --net=Service-Segment --ip=192.168.22.246 --ip6=2001:470:fe36:face::218:246 \
 -v /opt/docker/contents/web-service01/html:/var/www/html \
 -v /opt/docker/contents/web-service01/conf.d:/etc/httpd/conf.d \
 -v /opt/docker/contents/web-service01/logs:/var/log/httpd \
 --log-driver=syslog --log-opt syslog-facility=local3 --log-opt tag=docker/{{.Name}}/{{.ID}} \
 --name web-service01 \
 web-service01:1 /usr/sbin/httpd -DFOREGROUND
$
$ docker exec -it web-service01 /bin/bash
[root@3383ac655b6b /]# ifconfig eth0
eth0: flags=4163  mtu 1500
        inet 192.168.22.246  netmask 255.255.255.0  broadcast 192.168.22.255
        inet6 2001:470:fe36:face::217:246  prefixlen 64  scopeid 0x0
        inet6 fe80::42:c0ff:fea8:16f6  prefixlen 64  scopeid 0x20
        ether 02:42:c0:a8:16:f6  txqueuelen 0  (Ethernet)
        RX packets 43  bytes 4322 (4.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9  bytes 806 (806.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@3383ac655b6b /]# exit
$

 
Docker ホストと Docker コンテナの間に NAT が入ってない (それはつまりは docker0 インターフェースを利用していない) 純粋な IPv4/IPv6 アドレスを利用したコンテナへのアクセスができるようになりました。 docker0 インターフェースを利用してないので /etc/docker/daemon.json への ipv6 true や fixed-cidr-v6 の設定も不要です。

思う存分 IPv4/IPv6 デアルスタクな Docker コンテナを楽しめる環境が整いました;-)。

IPv4 は NAT だけど IPv6 は腐るほど持っているので、Docker コンテナでも IPv6 が利用できるほうが良いですよねぇ;-)。

ちなみにですが、拾ってきた Docker イメージのうち portainer, registry, docker-registry-frontend などは、根こそぎ IPv6 でのアクセスが可能です;-)。

 
さてと。今回のお題目。

ポリシールーティングではなく VRF してルーティングテーブルをわけてから bridge して Docker ホストと Docker コンテナで同一ネットワークを利用し、更に IPv4/IPv6 のデアルスタクで Docker コンテナを運用する。

と、いうのができました。僕としてはもう、ほぼほぼこれで満足です。最終目的かもしれないです。ふぅ。

まぁ、実装するのは簡単で、これを実運用に持っていくには対障害対応とか色々必要となってくるのですが、色々と設定が必要そうです。

あと、Swarm を利用を利用して、当該 の Docker ホストがダウンしたときはコンテナは移動し、ダウンした Docker ホストのネットワーク環境などを整え終わったら再度サービスに復活させるとかの対応も必要かも。

 
ひとまずこれでヨシとしよう。

ふぅ。楽しかった;-)。

3月 282023
 

三ヶ月に一回 Let’s Encrypt の証明書の更新があるわけだけど、今回はハマった・・。なのでちょっと書いておきます。

Let’s Encrypt の SSL 証明書更新後はちゃんと openssl コマンドを利用して確認するんだけど・・。

 
・https の確認

$ openssl s_client -connect running-dog.net:443 | openssl x509 -enddate | grep notAfter

 
・sendmail の確認

$ openssl s_client -connect mail.running-dog.net:587 -starttls smtp | openssl x509 -noout -dates

 
・imaps の確認

$ openssl s_client -connect mail.running-dog.net:993 | openssl x509 -noout -dates

 
まぁ、これらのコマンドを打って確認できるのは証明書の日付くらいか・・。サービスが実際に正常動作しているかは、やはり、ログを見ないと解らないか・・。

 
今回の Let’s Encryp の SSL 証明書更新後のハマりポイント。

 
1. Apple のメールアプリが imaps サーバに接続できなくなった
macOS や iOS などのメールアプリが根こそぎ imaps サーバに接続できなくなった。 macOS に Thunderbird をインストールしてそこから imaps サーバにアクセスすると特に問題なくアクセスできる・・。

macOS のメールアプリからアクセスすると、ログには以下のように残っていました。
あぁ・・。 moacOS 側のアプリのキャプチャ無くてすみません・・。

imapd-ssl[39496]: ip=[<略>], couriertls: connect: error:1417A0C1:SSL routines:tls_post_process_client_hello:no shared cipher

 
なんか、おかしい・・。macOS 上の SSL 証明書を「キーチェーンアクセス」から削除してもダメ・・。

まぁ、ログを見ると cipher が足りない風な感じはしているのよねぇ・・。

と、いうことで Apple 製品の SSL 系 cipher についての記載を調べてみると以下の URL が見つかりました。

https://support.apple.com/ja-jp/guide/security/sec100a75d12/web

上記を読むと『 ECDHE_ECDSA_AES および ECDHE_RSA_AES』が必要なようです。僕は imap サーバに courier-imap を利用している(この記事の執筆時点にインストールされているバージョンは courier-imap-5.2.2 です)のだけど、この二つの cipher を /usr/local/etc/courier-imap/imapd-ssl の設定に追加しました。

こんな感じになりました。

TLS_CIPHER_LIST="ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES128-SHA:DES-CBC3-SHA:ECDHE_ECDSA_AES:ECDHE_RSA_AES"

 
随分と長くなりました。で Apple 製品のメールクライアントからアクセスすると無事に接続できるようになったのでありました。ふぅ・・。

 
2. sendmail が他のメールサーバから Relay を受け付けなくなった
imapd に接続できないのはまぁ、良いんだけど、こっちはダメージでかいですね。届くはずのメールが届かないのでおかしいなぁ・・。と、思っていたら sakura インターネットからのメールがエラーになっていて・・。

ログを確認すると、こんな感じ。

sm-mta[76876]: STARTTLS=server, error: accept failed=-1, reason=no shared cipher, SSL_error=1, errno=0, retry=-1, relay=<略>.sakura.ne.jp [<略>]

 
なんか、こちらも cipher が足りない感じ。orz

しょうがないので /etc/mail/sendmail.cf の O CipherList をちょっと変更。

#O CipherList=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:
O CipherList=ALL
#O CipherList=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:ECDHE-ECDSA-AES256-GCM-SHA384:

 
当初設定したていたのはコメントアウトしてある一番上の行。どの cipher が足りないのか解らないので真ん中の O CipherList=ALL 行を有効にして全ての cipher で対応できるようにして、ログを確認。そーすると、ちらほらメールを受信し始めました。ふぅ。
で、更にログを眺めいてたら以下のログを発見。

sm-mta[33084]: STARTTLS=server, relay=<略>.sakura.ne.jp [<略>], version=TLSv1.2, verify=NO, cipher=ECDHE-ECDSA-AES256-GCM-SHA384, bits=256/256

 
なるほど。新たに ECDHE-ECDSA-AES256-GCM-SHA384 を追加する必要があるのね。と、いうことで O CipherList の設定は一番下の行にして、sendmail を再起動したら無事に復活したのでありました。

 
ふぅ。それにしても Let’s Encrypt の SSL 証明書を更新しただけで、メールの送受信ができなくなるとは恐ろしいことだぁ・・。

https は全然問題なかったのだが・・。

それにしも証明書の更新後の確認は日付だけでなく、ログの確認であるとか、実際にポートに接続して確認する必要があるかなぁ・・。今後の課題ですな。

 
と、いいつつ Let’s Encrypt だけでなく google や Apple は SSL 証明書の期限をさんが月にしよう。キャンペーンをしているけど・・。大変になる頻度が増えるかな。

3月 062023
 

最近、スマートフォンは以下を利用しております。

画面が一番大きいのは moto g52j 5G ですが、やはりもっと大画面が欲しい。と、なったのであります。
僕は Y!mobile ユーザで PayPay も利用しているので「ヤフープレミアム会員」です。そうすると、雑誌読み放題な特典が付いてきて、スマートフォンで色々な雑誌を見ることが可能です。
例えば競馬新聞である『馬サブロー』なんかも閲覧可能なので、競馬の予想もできます。と、いうことは・・。やはっぱりタブレットが欲しい。大画面が魅力的に感じるのであります。

と、いうことで今回は ALLDOCUBE iPlay50 という Android タブレットを購入してみました。これを購入した決め手は画面サイズですね。解像度が 2000×1200 の 2K ディスプレー、俗に WUXGA とでも言うのでしょうか。
価格的には 17,000yen 弱でした。こいつにケースを追加で購入。これで僕もすっかりとタブレット人生を歩むことになりそうです。

写真はこんな感じです。
壁紙はあんまり気にしないでくださいf(^^;;。

で、購入後 10 日ほど利用してみたので ALLDOCUBE iPlay50 の気がついた点をダラダラと書いてみます。

 
1.Android12
Android のバージョンは 12 でした。今僕が利用している moto g52j 5G や Xperia 10 II XQ-AU52 (こいつは SIM ナシで Wi-Fi で一応、利用中) なんかも Android12 です。 Android12 の機能は多分一通り利用できると思われます。画面分割とか一応利用可能です。

 
OS が一緒なのでスマートホンと機能的には本当に変わらないですね。ただ単に画面が大きくなった感じでしょうか。 iOS と iPadOS は大きな違いがあるのかな?

 
ロック画面の解除は指紋・顔認証どちらも非搭載です。なので、数値を入力することでロックを解除する必要があります。まぁ、これは値段相応なのかな・・。
顔認証は OS の標準機能ではないのかな?他にオプション的な機能が何か必要なのかな?

 
2.ステルス Wi-Fi に接続できない。
おかしいのよねぇ・・。 Android12 ならステルスな Wi-Fi に接続できると思うんだけど、このタブレットはステルス機能を有効にした Wi-Fi AP をみつけることができません。かぁなり驚きっ!!

 
3.LTE 接続できます
一つのスロットに SIM カードと MicroSD を乗せることができます。もしくは SIM カード二枚乗せることができます。

なので、LTE 通信が可能です。対応バンドは以下のようです。

LTE: 1 / 2 / 3 / 5 / 7 / 8 / 20 / 28 / 34 / 38 / 39 / 40 / 41

SoftBank のバンドにしっかりとマッチしているので、利用するなら SoftBank SIM を入れることですね。

 
と、いうことで実際に入れてみました。

Y!mobile には「シェアプラン」というのがあります。「シンプルプラン M」の場合は 15GB の “ギガ” がありますが、全部使い切れない場合、繰り越されます。そして、更に余って消えてしまうのももったいないですね。と、いうことで SIM カードを何枚か調達できて、スマートホンとかタブレットで “ギガ” を分け合えることができます。

例えば、僕が「シンプルプラン S」を契約した親回線。奥さんが「シンプルプラン M」を契約した子回線。奥さんの契約に家族割が適用され、奥さんの「シンプルプラン M」は通常価格 3,278yen から 2,090yen になります。
奥さんの「シンプルプラン M」で「シェアプラン」を契約すると月々 539yen ほどの料金が発生しますが、既に家族割が効いているので、それでも基本料金より安くなります。

そして「シェアプラン」は 539yen で最大 3 枚の SIM カードがもらえます。でもって SIM カード発行手数料は 0yen っ!! 「シンプルプラン M」で “ギガ” が余っている人は「シェアプラン」を利用するのも一つの手かもしれません。

ちなみに「シェアプラン」の SIM カード、通話はできません。MMS は Softbank から届くだけ。という SIM カードです。

 
前置きが長くなりました。「シェアプラン」の SIM カードを ALLDOCUBE iPlay50 に入れてみます。が、素直に LTE の電波を拾ってくれません。最初の段階では LTE での通信できません。
それはそーですね。 ALLDOCUBE iPlay50 には Y!mobile の APN が入っていません。手動で設定する必要があります。


https://www.ymobile.jp/yservice/howto/simfree_android/apn/

こちらに記載されていますね。

名前:       Y!mobile APN (任意の文字列)
APN:        plus.acs.jp
ユーザー名: ym
パスワード: ym
認証タイプ: CHAP

 
まぁ、あとのは省略可です。とりあえず上記を指定します。

そして、しばらく待っていると 4G で接続できるようになります。

 
4.Androidマルチユーザ環境で利用
タブレットを購入したのは僕ですが、奥さんは LTE 回線を提供してくれました。と、いうことで、Android で初めてマルチユーザ環境を整えてみました。

「設定」->「システム」->「複数ユーザ」で有効化できます。

サブのアカウントを作成して、ロック画面からアクセスするときにユーザをチョイスしてパスワードを利用。

 
ユーザ単位で google アカウントが必要です。二つのアカウントは「Google ファミリー リンク」しても良いかと思います。

二つのアカウントで同じアプリを利用する場合、個別にダウンロードしてインストールする必用があります。ストレージが圧迫されるかな?と、いう気がします。
あと、パックグラウンドで色々動作していると CPU が食われるような気がします。なので、両方のアカウントでこまめにバックグラウンドアプリを停止するとか、メモリ開放するとかしないと、突如として遅くなる場合があったりします。

ALLDOCUBE iPlay50 の CPU は UNISOC T618 なので MediaTek のよりは処理速度が高いので、まぁ、なんとかマルチユーザ環境にも耐えられるかもです。

 
5.画面が大きいことは良いことだ
画面が大きいので色々できます。
ConnectBot をインストールして ssh 接続してメンテナンスとか行える。
Remote Desktop もあっても良いかもですねぇ。

 
Bluetooth キーボードを接続して上記アプリを利用すれば もうフツーの PC 感覚。あ。キーボード配列が日本語配列だとちと大変。そんなときは 物理キーボード配列変更 (+親指Ctrl) [日本語配列] をインストールすると日本語刻印の通りに文字入力できます。 Ctrl と CAPS キーのスワップ設定も入っているのでチョーご機嫌。 ssh で入った先で emacs とかフツーに利用できます。

 
そして、タブレット購入とタイミングがバッチリの非常に良い記事を発見。

https://pc.watch.impress.co.jp/docs/column/yajiuma-mini-review/1481098.html
https://www.spacedesk.net/

spacedesk というのを利用すると PC のサブディスプレイとしてタブレットを利用できます。 Windows PC にディスプレードライバインストールしてタブレット側に探査・転送アプリをインストールすると、確かにディスプレーとして機能します。すげー。

けど、今は無料で利用できるみたいですが、そのうちに有料化されるかな?と、いう雰囲気か。

 
とまぁ、今回はダラダラと書いてみました。やっぱり画面は大きいほうが良いっ!! と思うのは、もうスッカリとローガンになってきているから。なのでしょうかねぇ。

今回、初めて『タブレット』というモノを購入してみましたが、僕の人生の中でタブレット端末は効果的に機能してくれるのか、今後の動向を検証してみたいと思います;-)。

2月 042023
 

ちょっと前のエントリで「今年はキーボード色々。」というのを書きました。このエントリでは新たに「上海問屋 日本語 73 キー配列コンパクトメカニカルキーボード (TTC静音赤軸Ver.) DN-916082」を購入した。と、書いています。

で、このキーボード、カナ刻印ナシなんですよ。しかし、実際に利用してみると、僕ってすごいなっ!!カナ刻印なしでも日本語カナ入力で利用する文字が、ブラインドタッチで打ててしまっている自分がここにいる。と、いうことに気づかされました。

ヲレってすげーっ!! みたいな;-)。

が、しかし、時々つまずくこともあるですな。普段はあまり利用しないと思われる『ま』であったり、『や』『ゆ』『よ』などもちょっと悩む。これらのキーは右 Shift キーと同時押しの場合もある(つまり、ちっちゃい『や』『ゆ』『よ』を打ち込む場合ですな)。

やっぱりカナ刻印はあったほうが良いかもー。と、いうので、実はもう一個、ちっこいキーボードを購入購入してしまいました。

今度は赤軸ではなく、 NotePC みたいに薄い感じのキーボードです。俗にパンタグラフキーボード。などと呼ばれていたりするでしょうか。

とりあえず写真を。

上の写真は、もう 10 年くらい前に購入した Apple の USB の有線のキーボードです。で、下のが今回購入したキーボード。

「Arteck 2.4Gワイヤレスキーボード 無線」と、いうヤツで Amazon で 1,699yen で購入しました。雰囲気的には似てますな。打刻感もまぁ、NotePC に打ち込んでいるような雰囲気です。しかし、値段は上下の差が約 8 倍くらいか。でもって、1,699yen で購入したキーボードは USB の無線接続。 2.4GHz 帯を利用するので OS を選ばずに利用できます。

軽いので NotePC と一緒に持ち歩いても良いかもですね。まぁ、値段が値段だったので、そんな感じで購入しました。

 
が、やはり、慣れてしまうと赤軸なキーボードは捨てがたいですなぁ・・。と、いうことで、上海問屋の DN-916082 なキーボードにカナ刻印を・・。まずは手持ちのキーボードのキーを交換してみようと思いましたが、キーの裏の十字部分が合わずにあえなく玉砕。

 
そんなこんなで、『どうにかかならないもんか?ひらがな。』とか思い情報を集めたところ、なんとっ!! 100yen 均一なお店に、子供の勉強用にひらがなのシールが売っている。と、いう情報を見つけましたっ!!

シール的にはこんな感じっ!! これは行ける?!

で、実際にそのシールを貼ったキーボードがこちら。

おーー。すっかりとカナ刻印付きのキーボードになっているではないですかーっ!!

このワザ利用すると、どんなカナ刻印のないキーボードでも全然問題ないですっ!! すげーっ!!

HHKB がカナ刻印ナシの製品を出すようになって、色々なメーカがカナ刻印ナシキーボードを出すようになって、カナ入力な人は随分と肩身狭い思い、はたまた、選択枝が限られてきた世の中になりつつあったのに、これで一件落着ーっ!! って、感じです;-)。

 
今回はピンクのシールで丸ゴシックちっくなフォントのシールを貼りましたが、色々な 100yen ショップを回ると色々なフォントのひらがなシールが売っているので、自分のセンスやキーボードに合うのをチョイスするのが良いかと思われます;-)。

今の時代、ゲーミングキーボードとか鮮やかに光ったりするので、ピンクの丸ゴシックなフォントを利用しているシールを貼っても全然違和感のないモノに仕上がっている。と、自分自身思っている。それはつまりはただ単に『自己満足の世界』と、いう感じですけども。

 
カナ入力の人で、カナ刻印のないキーボードを使いたいっ!! HHKB でカナ入力したいっ!! という人は是一度試してみることをお勧めします;-)。

1月 292023
 

タイトルが大げさですなぁ;-)。

前回のエントリで構築した VRF が動作する AlmaLinux 8.7 ですが、その AlmaLinux8 は実は Docker ホストとしても動作しています。

 
これも、以前のエントリで「Docker Registry を作る。」というのを書いていますが、このホストと同一となります。

 
今回はこの Docker ホストに Docker コンテナを複数起動して、外部からアクセスできる環境を構築します。
Docker コンテナに対して外部からアクセスするためのポート番号は 80 番 (別に 443 でも良いのだけど、証明書関係が面倒だったので、Port:80 で許してちょんまげ;-) とします。しかし、複数の Docker コンテナが全て Port:80 番で待ち受けるためには NAT 環境では無理です。

今回は Docker ホストとコンテナ間をブリッジで接続して、Docker ホストで利用している外部接続ネットワークをコンテナでもそのまま利用するようにします。

 
図はこんな感じ。

 
VMware ESXi に二つの仮想マシンが動作しています。一個は Docker ホストで、もう一個は FreeBSD が動作して MySQL のサービスを他の仮想マシンに提供しています。

 
で、せっかくなので Docker コンテナがただ HTML なコンテンツを垂れ流す環境を構築してもつまらいないので WordPress が動作する環境を構築したいと思います。
ネタが二つ分の量だけど、大丈夫かなぁ・・。

と、いうことで、まずは Docker ホストの準備から。

とはいいつつ、以前、Docker Registry を作った環境をそのまま利用しています。ただ、 dnf update しているので多少バージョンが上がっているかも;-)。

$ cat /etc/os-release 
NAME="AlmaLinux"
VERSION="8.7 (Stone Smilodon)"
ID="almalinux"
ID_LIKE="rhel centos fedora"
VERSION_ID="8.7"
PLATFORM_ID="platform:el8"
PRETTY_NAME="AlmaLinux 8.7 (Stone Smilodon)"
ANSI_COLOR="0;34"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:almalinux:almalinux:8::baseos"
HOME_URL="https://almalinux.org/"
DOCUMENTATION_URL="https://wiki.almalinux.org/"
BUG_REPORT_URL="https://bugs.almalinux.org/"

ALMALINUX_MANTISBT_PROJECT="AlmaLinux-8"
ALMALINUX_MANTISBT_PROJECT_VERSION="8.7"
REDHAT_SUPPORT_PRODUCT="AlmaLinux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.7"

$ rpm -qa | grep docker
docker-ce-20.10.22-3.el8.x86_64
docker-ce-rootless-extras-20.10.22-3.el8.x86_64
docker-scan-plugin-0.23.0-3.el8.x86_64
docker-ce-cli-20.10.22-3.el8.x86_64

 
いろいろ端折って、既に dockerd が起動しているものとして話を進めていきます。Docker のインストールと起動については他のサイトを参考にしてください。

 
1. Docker イメージの作成

$ docker search almaLinux
NAME                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
almalinux                  The official build of AlmaLinux OS.             102       [OK]       
<以下略>

$ docker pull almaLinux
Using default tag: latest
latest: Pulling from library/almalinux
<略>

$ docker image ls
REPOSITORY	TAG       IMAGE ID       CREATED        SIZE
almalinux       latest    acaca326f3b3   6 weeks ago    190MB

$ docker tag almalinux:latest almalinux8:1
$ docker image rm almalinux:latest

$ docker image ls
REPOSITORY	TAG       IMAGE ID       CREATED        SIZE
almalinux8      1         acaca326f3b3   6 weeks ago    190MB

$ docker run -it --name almalinux8 almalinux:1 /bin/bash
[root@b2db6f534790 /]# 

 
docker search で AlmaLinux を探して、オフィシャルサイトから pull して、 almalinux8:1 としてタグ付けしました。
このあと、docker run してコンテナの中に入って dnf update して、必要な rpm をインストールして httpd や php もインストールして、もとの Docker イメージを大幅に更新して tag 付けして Docker イメージを完成させます。

この辺り割愛しますが、各自で頑張って Docker イメージを作成してください;-)。

$ docker stop almalinux8
$ docker container commit almalinux8 almalinux8_wordpress:1
$ docker rm almalinux8

 
apache や php をインストールした新しい almalinux8_wordpress:1 という Docker イメージができました。このイメージをベースに色々やっていきましょう。

 
2. Docker コンテナで利用するネットワークの準備
次にネットワークの設定を行います。今回は複数の Docker コンテナに Dokcer ホストと同じセグメントを割り当てます。
僕の環境の AlmaLinux 8.7 は VMware ESXi 上で動作しています。そして、ネットワーク構成は前回の「AlmaLinux8 の VRF。」に記載してある以下の構成をそのまま利用します。

 
つまり、Service-segment 側はウェブアクセスのために利用し Access-Segment は MySQL アクセスで利用します。あ。MySQL サーバは 192.168.52.204 の FreeBSD 上で動作しています。

箇条書きにするとこんな感じ。

  • WordPress が動作する予定の Docker コンテナは外部からのアクセスは Port:80 で eth0 側に到達するように構築します。
  • その Docker コンテナは外部の MySQL サーバにアクセスするために eth1 のインターフェースを利用します。
  • Docker コンテナは二つのインターフェースを持ち、それぞれが Docker ホストからのブリッジで動作します。
  • 上記の図では、Server1 が Docker ホストで、Server3 が FreeBSD で MySQL サーバが動作しています。

 
と、いうような状況ですな。

その VMware ESXi が Docker ホストに接続するポートグループは「セキュリティ」において「無差別モード」「MACアドレレス変換」「偽装転送」の全てを『承諾』に設定します。eth0 と eth1 の二つのポートグループはブリッジインターフェースを利用するので無差別モード(俗に『プロミスキャスモード』と、言いますな)を有効にする必要があります。
VMware ESXi のネットワークの設定もちゃんとしましょう。

 
3. Docker network でネットワークの作成
と、いうことで Docker コンテナが利用する二つのネットワークを docker network コマンドで作成します。

$ docker network create Service-Segment \
     -o "com.docker.network.bridge.name"="br0" \
     --driver=bridge \
     --subnet 192.168.22.0/24 \
     --gateway 192.168.22.217

# brctl addif br0 eth0
# ifconfig eth0 0.0.0.0 up
# ip link set up dev br0
# route add default gw 192.168.22.1

$ docker network create Access-Segment \
     -o "com.docker.network.bridge.name"="br1" \
     --driver=bridge \
     --subnet 192.168.52.0/24 \
     --gateway 192.168.52.217

# brctl addif br1 eth1
# ifconfig eth1 0.0.0.0 up
# ip link set up dev br1

 
Docker ホストの eth0 の IP アドレスは 192.168.22.217 で、eth1 側は 192.168.52.217 です。

こちらも説明は箇条書きで。

  • eth0 の Service-Segment と eth1 の Access-Segment の Docker ネットワークを作成します。
  • このとき Docker ホストには docker0 というインターフェースが存在していますが、利用しないのでそのまま存在しつつ、無視して問題はありません。
  • NetworkManager でブリッジインターフェースの設定はしません。 /etc/sysconfig/network-scripts/ 配下に ifcfg-br0 などのファイルを置いてもなんの意味もありません。 docker network create コマンドを実行したときに付加するオプションである -o “com.docker.network.bridge.name”=”br0” があるので、既に br0 が存在しているとエラーになります。
  • –gateway オプションに指定する IP アドレスは Docker ホストの IP アドレスになります。
  • AlmaLinux 8.7 に bridge-utils の rpm はないようなのでソースからコンパイルしてインストールします。
  • brctl addif コマンドの実行や eth0 からアドレスを消して br0 にアドレスを付加するなどは全てコマンドで行います。
$ docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
039e8158c77b   Access-Segment    bridge    local
622593f73c12   Service-Segment   bridge    local
9eb6f5610d75   bridge            bridge    local
d30c681a9f92   host              host      local
afbbadaba67f   none              null      local

 
無事に作成できるとこんな感じでしょうか。
ifconfig -a したときには br0 と br1 に IP アドレスが付いていて、eth0 と eth1 には IP アドレスはついていない状態が正解です。

これで Docker ホストとコンテナで同一セグメントを利用する環境が整いました。次にコンテナを run してみましょうかねぇ;-)。

 
4. Docker コンテナの起動
まず、いきなり WordPress を動かすコンテナを起動するのではなく Docker ネットワークに接続するために docker run してみましょう。

$ docker run -d --restart always \
 --net Service-Segment --ip 192.168.22.222 \
 -v /var/www/html/wordpress:/var/www/html \
 -v /etc/httpd/wordpress/conf.d:/etc/httpd/conf.d \
 -v /var/logs/httpd/wordpress/logs:/var/log/httpd \
 --log-driver=syslog --log-opt syslog-facility=local3 --log-opt tag=docker/{{.Name}}/{{.ID}} \
 --name almalinux8_wordpress \
 -d almalinux8:2 /usr/sbin/httpd -DFOREGROUND

 
今回は箇条書きではなく、ベタガキで・・f(^^;;。
-p 0.0.0.0:80:80 というオプションは指定しません。これ付けると一個の Docker コンテナが Docker ホストの Port:80 を掴んでしまいます。
–net で接続する Docker ネットワークと –ip でDocker コンテナが使用する IP アドレスを指定します。今回は固定 IP アドレスで 192.168.22.222 を利用します。docker network のオプションではレンジとか CIDR を指定することができて DHCP みたいな利用形態もできますが、ここでは割愛します。自分で調べてください。
-v で Docker ホスト側のディレクトリをコンテナ側にマウントしています。 Docker イメージを色々なサービスで使い回すならこれらは外出しした方が良いかなぁ。と、僕は思ったので Docker イメージには組み込んでいません。自分・環境のお好みで設定してみてください;-)。
–log-driver=syslog は syslog 出力するための設定です。 /etc/rsyslog.conf には以下を記載してください。

local3.*      /var/log/docker/container.log

 
書いたあと rsyslogd を再起動して、ついでに mkdir /var/log/docker してください。

 
と、いうことで、ここまでは Docker コンテナをブリッジインターフェース経由で外部公開するための起動方法になります。
ただ、これだと MySQL サーバにアクセスできないので、起動した almalinux8_wordpress コンテナに eth1 を生やしてあげるコマンドを投入します。

$ docker network connect Access-Segment --ip 192.168.52.222 almalinux8_wordpress

$ docker exec -it almalinux8_wordpress /bin/bash
[root@64583900cb33 /]# ifconfig -a
eth0: flags=4163  mtu 1500
        inet 192.168.22.222  netmask 255.255.255.0  broadcast 192.168.22.255
        ether 02:42:c0:a8:16:de  txqueuelen 0  (Ethernet)
        RX packets 27884  bytes 2705253 (2.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 257  bytes 754283 (736.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163  mtu 1500
        inet 192.168.52.222  netmask 255.255.255.0  broadcast 192.168.52.255
        ether 02:42:c0:a8:34:de  txqueuelen 0  (Ethernet)
        RX packets 36681  bytes 4887852 (4.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 586  bytes 113982 (111.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
<以下略>
[root@64583900cb33 /]# exit

 
と、いう感じで docker network connect コマンドを実行したので Docker コンテナには二つのインターフェースができました。

eth0 側は Dockerホスト外部から httpd に対してアクセスができていると思います。コンテナ起動時に指定した -v /var/www/html/wordpress:/var/www/html のオプションがありますが、 Docker ホスト側の /var/www/html/wordpress/ ディレクトリ配下に WordPress のコンテンツ一式が既にインストールされていると想定しています。

裏を返すと /var/www/html/wordpress/ 配下のコンテンツを何個かの Docker コンテナに -v でマウントさせると Docker コンテナのみで冗長構成を組むことができるのですな。 eth0 側のインターフェースは docker run 時に –ip で指定する IP アドレスを変えつつ起動したあと DNS ラウンドロビンでも良いし、ロードバランサ配下のネットワークに置いても良い。今まで複数の物理や仮想マシンが担当していた部分を Docker コンテナでマカナエル。と、いうことですな。

あ。ちなみに、僕の場合は WordPress の初期環境一式は FreeBSD の ports からインストールして、 FreeBSD 上の /usr/local/www/wordpress/ ディレクトリごと tar でかためて持ってきました;-)。簡単に初期の環境が整うです。で、 IP アドレスにアクセスすると「さぁ。わーどぷれすをいんすとーるしましょうっ!!」みたいな画面がいきなりでます;-)。
あ。実はエラーになってそう簡単には出ないか・・f(^^;;。

 
そーそー。注意点が一個。 NetworkManager を利用しないでブリッジインターフェースの設定をしているので、サーバに再起動が入ると設定が全て飛んでしまいます。 Docker ネットワークの設定は Docker が覚えていてくれるんだけど、ブリッジを設定するためのコマンド brctl addif の設定は再起動で消えてしまうので /etc/rc.local などでリカバリーする必要があるです。

 
5. Docker コンテナ の WordPress 対応
僕は普段 FreeBSD 上で WordPress を動作させているので Linux 上で動作させるには随分難儀なことでして・・。

まずは Docker イメージを作成するとこでイメージに対して httpd とか php をインストールします。そのあと、AlmaLinux8 の rpm の httpd は mod_mpm_event.so で動作しているようで、これをひとまず mod_mpm_prefork.so に変更します。
Docker イメージ内の /etc/httpd/conf.modules.d/00-mpm.conf の設定ファイルの中で LoadModule mpm_event_module modules/mod_mpm_event.so の行をコメントアウトし LoadModule mpm_prefork_module modules/mod_mpm_prefork.so の行を有効化します。
これの変更で一回 docker container commit する必要がありますな。

次に Linux で WordPress を動作させるためには php-fpm というのを起動する必要があるのだそうな。と、いうことで、これも Docker イメージ内でちょっと細工をします。

mkdir /run/php-fpm と chown 48:48 /run/php-fpm ですね。一応、この二つのコマンドを Docker コンテナ内で実行し、docker container commit して環境を整えます。

ふぅ。これで準備整ったかな?と、いうことで、 WordPress が動作する Docker コンテナを起動するスクリプトのまとめとしましょう。

#!/bin/sh

docker run -d --restart always \
 --net Service-Segment --ip 192.168.22.222 \
 -v /var/www/html/wordpress:/var/www/html \
 -v /etc/httpd/conf.d/wordpress:/etc/httpd/conf.d \
 -v /var/logs/httpd/wordpress/logs:/var/log/httpd \
 --log-driver=syslog --log-opt syslog-facility=local3 --log-opt tag=docker/{{.Name}}/{{.ID}} \
 --name almalinux8_wordpress \
 -d almalinux8:2 /usr/sbin/httpd -DFOREGROUND

docker network connect Access-Segment --ip 192.168.52.222 almalinux8_wordpress

export CONTAINER_ID=`docker ps -a | grep " almalinux8_wordpress" | awk '{print $1}'`
export DOCKER_PID=`docker inspect --format '{{.State.Pid}}' $CONTAINER_ID`

sudo nsenter -t $DOCKER_PID -n route delete default
sudo nsenter -t $DOCKER_PID -n route add default gw 192.168.22.217 eth0
sudo nsenter -t $DOCKER_PID -n ping -c 3 192.168.22.217

sudo nsenter -t $DOCKER_PID -m -u -i -n -p -- /usr/sbin/php-fpm --nodaemonize &

 
こんな感じでしょうか。

ちょっと説明を。

  • docker run で Service-Segment の Docker ネットワークに接続し、固定 IP アドレスを利用します。
  • -v で Docker ホスト側に用意したコンテンツや設定ファイルを参照するようにします。
  • コンテナの syslog を Docker ホスト側に出力します。 docker run の説明はここまで。
  • 次に、起動した almalinux8_wordpress に対して、もう一個の Docker ネットワークを接続します。
  • その次は nsenter コマンド連発です;-)。 nsenter コマンドは docker exec しなくとも Docker ホスト側から Docker コンテナに対してコマンドを投入できるコマンドです。そのためには当該の Docker コンテナのプロセス番号が必要になるのでそれを取得します。
  • コンテナ内に eth0 と eth1 が存在するので default gateway を設定してあげます。一旦削除してから再度設定。みたいな感じです。
  • コンテナ内から Docker ホストに対して ping を打つのは、コンテナ起動ごとに MAC アドレスが書き換わるので、上位のルータに対して MAC アドレスの更新をする必要があるためです。ルータ側の MAC アドレス書き換えタイムアウトまで待っても良いですねぇ。根が短気な性分なものでして・・f(^^;;。
  • そして、最後の nsenter コマンドは Linux で WordPress を動かすための php のおまじない。 /usr/sbin/php-fpm を nsenter コマンドで起動してあげます。Docker コンテナ内に入って ps -ax すると httpd と php-fpm の二種類のプロセスが一個のコンテナ内で起動する状態となります。つまり、 php-fpm 専用コンテナは不要である。と、いうことです。
    例えば、(本来、動かす必要はないのだけど) zabbix_agent なども nsenter で動かすことができます。コンテナ自体が固定 IP を利用しているので Zabbix Agent のポートにもアクセスできるようになります。

 
これで Service-Segment 側に指定した IP アドレスにウェブブラウザからアクセスすると、WordPress の初期設定画面が表示できると思います。

データベースは MySQL ですが 192.168.52.204 で動作している MySQL サーバへのアクセスは eth1 側を抜けていくので WordPress の初期設定画面で IP アドレス・ユーザ名・パスワードを設定するとアクセスできると思います。
あ。当然、 MySQL 側ではデータベースとアクセス用のアカウントを作成しておいてください。ここでは割愛しています。

 
さてと。ここまで来てファイアーウォールの設定が一回も登場していません。Docker にはファイアーウォールは必須なので、Docker ホスト側で systemctl start firewalld は必須です。僕の場合は /etc/firewalld/direct.xml で設定していますが、 -i で指定するインターフェース名は eth0 と br0 、 eth1 と br1 の両方を記述する必要があるので、その点は注意してください。

 
あとは・・。

これで多分大丈夫だと思います。

起動する Docker コンテナは、コンテンツと設定ファイル、そして、ログ出力を -v で Docker ホスト側の情報をマウントしているので docker run 時に違うディレクトリを指定し、他にネットワーク、IP アドレスの設定を変えるだけで一個の Docker イメージで複数の、用途の違う Docker コンテナを起動して同じ仕事をしてくれるようにすることも可能です。んー。 Docker らしい使い方ぁ;-)。

 
Docker って、基本 NAT が当たり前で、ブリッジインターフェースを利用した環境で『コンテナに対して直接アクセス』。っての、google で検索してもネタ的に今のところはあまり多くないかな。
しかし、実際にコンテナ使い込むとコンテナごとにポート番号変えるのって、なんか納得いかなくて、その先に『こんなんじゃ実際のサービスに提供できないじゃん。』と、いうところからブリッジインターフェースでコンテナに直接アクセス、ロードバランサから見ると仮想マシンもコンテナも同一の扱いのほうが楽じゃん。と、いう発想があります。そのためにはやっぱりブリッジだよねぇ。みたいな。

 
それにしても、実際に調べてみると Linux の bridge-utils ツール群はヘボいですな。今回、実は IPv6 のことについて全く書いてないんですよ。 bridge-utils は IPv6 側の作りが甘いっ!!
Docker ホストの br0 から出ていく TCP パケットには eth0 の MAC アドレスとか Link Local アドレスが記載されていて、受け取った PC のほうは戻りパケットを送信側 (Docker ホストのこと) の eth0 の MAC アドレスとか Link Local アドレスに投げようとするので、Dockerホスト側の br0 の情報がないために宛先がなくて、実質的に通信できない。と、いう非常にお粗末な状態です。
Docker 自体は IPv6 が使えるかもしれないけど、Linux でブリッジを利用する場合には IPv6 は利用しないほうが良いですな。パケットキャプチャしないと原因が特定できない。ハマる前に IPv6 の利用は諦めたほうが良いかと。

 
と、いうことで、今回、 Docker コンテナをブリッジインターフェースで、Docker ホストと同一のネットワークで動作させる。と、いうことにチャレンジしてました。 VMware ESXi 上で複数の仮想マシンを起動するがごとく、Docker ホスト上で Docker コンテナをドドドと立ち上げることが可能になったので、サーバ資源がますますギューギュー使える状態になったでしょうかねぇ;-)。

 
このあと、docker swarm がまだ待っております。が、オーバーレイネットワークがちゃんと動いてくれてないのよ。とほほ・・。orz

1月 142023
 

このブログでは何回か VRF について書きました。 FreeBSD の VRFubuntu の VRF など。 FreeBSD のポリシールーティングのネタも書いたこともありました。

そのとき CentOS7 はカーネルがまだ VRF に対応していなくて、CentOS8 まで VRF は実質利用できない状態だったのだけど、今の時代、AlmaLinux8 を利用すればカーネル的に VRF が利用できるので、試してみました。

ubuntu のネットワーク設定より Red Hat Linux 系のネットワーク設定のほうが楽と、いうか、個人的にも直感的に設定できるような状態ですしね(^^;;。今回は由緒正しく /etc/sysconfig/network-scripts/ 配下のファイルを用意して VRF の設定をしてみたいと思います。

 
と、いうことでまずは構成図などを。



 
基本的に FreeBSD の VRF も同じ構成で組んでいます。セグメントは全部で 3 個。

  • Service-Segment: 外部からのアクセス用
  • Access-Segment: MySQL とか SNMP とかバックヤード系
  • mgmt: ssh でサーバにログインする用

 
今回のルーティングテーブルは合計二つ。Service-Segment と Access-Segment で一個のルーティングテーブル。 mgmt が VRF で設定するもう一個のルーティングテーブルになります。

FreeBSD で VRF するときに痛感したのですが、自分から出すパケットは default のルーティングテーブルからしか出ていきません。VRF で追加したルーティングテーブルの mgmt セグメントの 192.168.1.0/24 に ssh しようとしても default のルーティングテーブルから出ていきます。

例えば 192.168.52.201 で動作している MySQL にアクセスしようとした場合、default のルーティングテーブルから出ていくのですが Access-Segment で利用しているセグメントがローカルネットワークになっているのでそこから出ていきます。
MySQL サーバが 172.16.52.201 にあった場合、 default gateway の設定のある Service-Segment から出ていきますが、 MySQL のアクセスは Access-Segment から出ていきたいので route add -net 172.17.52.0/24 gw 192.168.52.1 とか Access-Segment にルーティング設定をしてあげる必要があります。

 
と、いうことで VRF を設定して本当に幸せになるのかよくわかりませんが、とりあえず設定して行ってみましょう。

上記の構成図に合わせて /etc/sysconfig/network-scripts/ にファイルを用意していきます。

ifcfg-eth0
ifcfg-eth1
ifcfg-eth2
ifcfg-vrf.eth2
route-vrf.eth2
route6-vrf.eth2

実際に中を見てみましょう。

Service-Segment: ifcfg-eth0

TYPE=Ethernet
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6ADDR=2001:470:fe36:face::217:1
IPV6_DEFAULTGW=2001:470:fe36:face::1
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPV6_PRIVACY=no
MACADDR=permanent
IPADDR=192.168.22.217
PREFIX=24
GATEWAY=192.168.22.1

 
Service-Segmet に接続する eth0 には default gateway を設定しています。

 
Access-Segment: ifcfg-eth1

TYPE=Ethernet
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6ADDR=2001:470:fe36:cafe::217:1
#IPV6_DEFAULTGW=2001:470:fe36:cafe::1
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPV6_PRIVACY=no
MACADDR=permanent
IPADDR=192.168.52.217
PREFIX=24
#GATEWAY=192.168.52.1

 
こちらは内部のアクセス用ネットワークなので、default gateway は設定していません。実際には route add -net でネットワークごとにルーティング情報を追加するんだろうなぁ。と、いう気配です。

 
mgmt: ifcfg-eth2

TYPE=Ethernet
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6ADDR=2405:6580:aa40::217:1
IPV6_DEFAULTGW=2405:6580:aa40::1
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth2
DEVICE=eth2
ONBOOT=yes
IPV6_PRIVACY=no
MACADDR=permanent
IPADDR=192.168.1.217
PREFIX=24
GATEWAY=192.168.1.1

 
マネージメント用ネットワークで外部から ssh でログインするときに利用します。これが VRF を利用するインターフェースなので default gateway が設定してあります。でもって次のファイルも必要です。

 
mgmt-VRF: ifcfg-vrf.eth2

TYPE=Ethernet
DEFROUTE=yes
BOOTPROTO=none
IPADDR=192.168.1.217
PREFIX=24
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=no
IPV6ADDR=2405:6580:aa40::217:1
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=vrf.eth2
DEVICE=eth2
ONBOOT=yes
VRF=mgmt0

 
NAME= と VRF= で VRF で動作の設定です。ifconfig -a したときに mgmt0 というインターフェースが生えてきます。

 
mgmt-route-IPv4: route-vrf.eth2

ADDRESS=0.0.0.0
NETMASK=0.0.0.0
GATEWAY0=192.168.1.1

 
VRF 側の IPv4 のルーティングテーブルの設定です。

mgmt-route-IPv6: route6-vrf.eth2

::/0 via 2405:6580:aa40::1

 
こちらが VRF 側の IPv6 のルーティングの設定。

 
で、これで準備ができたので一応再起動してみます。がっ!!

これがまた正しく動作しないのですよなぁ・・。 orz。

 
と、いうことで、追加で /etc/rc.local に設定を記載して、ちゃんど動作するようにコマンドを羅列します。 orz

ip link add dev mgmt0 type vrf table 10
ip link set dev mgmt0 up
ip link set dev eth2 master mgmt0
ip addr add dev eth2 192.168.1.217/24
ip link set dev eth2 up
ip route add default via 192.168.1.1 table 10
ip route add ::/0 via 2405:6580:aa40::1 table 10

route delete default
route delete default
route add default gw 192.168.22.1

ip route del ::/0 via 2405:6580:aa40::1
ip route del ::/0 via 2001:470:fe36:face::1
route -6 add default gw 2001:470:fe36:face::1

sysctl -w net.ipv4.tcp_l3mdev_accept=1
sysctl -w net.ipv4.udp_l3mdev_accept=1

 
最後の sysctl コマンドは /etc/sysctl.conf に記載しても良いですね。
問題はその上です。

上から順に、

  • インターフェース mgmt0 を vrf として作成し table 10 とします
  • インターフェース eth2 と mgmt0 をくっつけます
  • table 10 (VRF 側) に default route を設定します
  • default のルーティングテーブルが壊れているようなので default gateway を二回削除してからつけ直します (ほんとうにこれしないとダメだった・・orz)

 
ルーティングの情報は IPv4 と IPv6 両方で実施します。これで大丈夫みたい。

確認方法は以下です。

# ip route show
default via 192.168.22.1 dev eth0 
192.168.1.1 dev eth2 proto static scope link metric 102 
192.168.22.0/24 dev eth0 proto kernel scope link src 192.168.22.217 
192.168.52.0/24 dev eth1 proto kernel scope link src 192.168.52.217 

# ip -6 route show
::1 dev lo proto kernel metric 256 pref medium
2405:6580:aa40::/64 dev eth2 proto kernel metric 102 pref medium
2001:470:fe36:face::/64 dev eth0 proto kernel metric 100 pref medium
2001:470:fe36:cafe::/64 dev eth1 proto kernel metric 101 pref medium

# ip route show table 10
default via 192.168.1.1 dev eth2 
broadcast 192.168.1.0 dev eth2 proto kernel scope link src 192.168.1.217 
local 192.168.1.217 dev eth2 proto kernel scope host src 192.168.1.217 
broadcast 192.168.1.255 dev eth2 proto kernel scope link src 192.168.1.217 

# ip -6 route show table 10
local 2405:6580:aa40::217:1 dev eth2 proto kernel metric 0 pref medium
local fe80::751c:3cc8:a2c0:2fcb dev eth2 proto kernel metric 0 pref medium
multicast ff00::/8 dev eth2 proto kernel metric 256 pref medium
default via 2405:6580:aa40::1 dev eth2 metric 1024 pref medium

# ip -d link show type vrf
6: mgmt0:  mtu 65575 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 12:c4:f9:dc:1f:bf brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 1280 maxmtu 65575 
    vrf table 10 addrgenmode none numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 

 
なんか良さげな感じがしています。

192.168.22.1 から eth2 のアドレスに対してアクセスした場合、戻りパケットはちゃんと eth2 から出ていきます。 19.268.1.50 から eth0 のアドレスに対してアクセスした場合、ちゃんと eth0 から戻っていきます。ある意味 VRF が機能している。と、いう感じです。やりたかったことはこれですね。

 
ただ、自分から出ていくパケットについてが問題です。default のルーティングテーブルから出ていくのが基本で、別のルーティングテーブルを利用したい場合は ping -I eth2 192.168.1.40 みたいにインターフェースを指定する必要があります。明示的にコマンドを打つなら良いですが、例えば php から MySQL にアクセスするために VRF 側のルーティングテーブルを利用して外に出ていきたい。などというのはほぼ不可能です。

使い方が非常に限られる VRF ですが、機能的には一応、動作する。と、いうことですなぁ。

 
さてと。今回構築したこの AlmaLinux release 8.7 の環境ですが、もうしばらく利用したいと思います。次のエントリは今回作成した環境を利用します。が、直接的・動作的には全く関係ないですが、好ご期待;-)。

12月 312022
 

多分今年最後のエントリーです。今年一年ありがとうございました。

そもそも、ちょっと前のエントリで「キーボード色々購入。」と、いうのを書いていますな。それに追加で、キーボードを更に購入してしまっている自分がいるので、以前のエントリの『その後』を書いてみたいと思います。

と、いうことでまずはこんな感じ。

ふむー。ここにあるのは全部赤軸。以前は HHKB の USB モデルを使っていたのだけど、もう発売が停止になった新製品はカナ刻印なしなモノになったので、どうしようか悩んでいた。

macOS で Wiondows キーボードを。」のエントリで書いたエレコムのキーボードも良かったのだけど、赤軸使い始めたらどうももなじまない。困ったのぉ・・。みたいな感じ。

写真は上から順に、(安いものばかりなんだけど・・)一応赤軸のやつ。

で、今回は真ん中のやつを購入。これはドスパラの “問屋系” のキーボードで、製品名は「上海問屋 日本語 73 キー配列コンパクトメカニカルキーボード (TTC静音赤軸Ver.) DN-916082」ですな。静音なちょっとランクが高いのを購入してみました。確かに良い感じ。

矢印キー付いていて、GAMDIAS の HERMES S1R よりもちょっと小型で、机の上は広々利用可能です。けど、これ、カナ刻印ないんですな。その点が不安だったのですが、えいやっ!!と、購入してみました。

一番下のは以前のエントリで書いた 60% キーボードの「WENRUI メカニカルキーボード 日本語配列 キーボード」ですな。ここに、今回は新たに USB 無線接続のテンキーを追加してみました。
要は『矢印キーさえなんとかできれば使えるんじゃね?』と、いうことで格安で売っていたテンキーを矢印キーとして使えるようにしてみました。

 
以前のエントリで書いた通り、FreeBSD では ~/.xmodmaprc で、 macOS の場合は Karabiner-Elements で矢印キーを設定できたのですが、WindowsOS の場合は Microsoft PowerToys では他の OS と同様の設定が出来なかったので、一番下の組み合わせはお蔵入りになったのであります。 orz

それにしても、赤軸で無線でキー入力を飛ばせるキーボードってあんまり多くなくて、結構、継続的に使ってみたいキーボードだったのだけど、矢印キーが使えないのが本当にザンネンです・・。

 
と、いうことで、今は問屋のキーボードをメインで利用しております。カナ刻印なしなので、どうなるのか非常に心配だったのだけど・・。

ふむー。そもそも日本語かな入力はもう 30 年近く(超え? あ。間違い。越え?)て、打ち続けているので、これがまぁ・・。俗に言う『ブラインドダッチ』というのでしょうな。カナ刻印のないキーボードでも日本語がスラスラス打てているのが、自分でもチョー驚きというか、ある意味 “当然っ!!” というか。そんな感じなのでありました。

「キーボードは刻印にとらわれる必用はない。」と思えるようになると対象となる製品はドドドと開けてきますなぁ。ふっふっふっ。

 
と、いうことで、今年最後のエントリーは自画自賛で終わりを迎えるような気がしないでもないですが、今年は記事が前年より多く書けたような気がします。

最近は本当にもう、モチベーションが下がっている状態ですが、読んで頂きありがとうございました。来年もまたひとつ宜しくお願いします。

11月 102022
 

僕が持っている色々な PC は WindowsOS と FreeBSD でマルチブートしています。デスクトップ PC の場合は M2.SSD の他に SATA 2.5 インチ SSD と、更に USB HDD を接続して、全てのストレージは NTFS と UFS (ZFS ではない;-) に分割して、どちらの OS でも高速アクセスと、ビッグデータ蓄積領域を確保している状態です。

普段は FreeBSD を利用しているのだけど、たまに Windows11 を起動してアプリを利用したり、蓄積していたデータをファイルサーバにアップして、再度 FreeBSD を起動してファイルサーバから取ってくる。とかしていましたが、今後はそーいう動作は必要なくなります。

FreeBSD 13.1-RELEASE (正確には 13.0-R 辺りからかな?) では NTFS 領域がマウントできて、かつ FreeBSD から rw アクセスが可能となりました。 sysctl で vfs.usermount=1 などとすると、一般ユーザ権限でマウントして、かつ、設定によっては自動的にマウントできたりします。

そして KDE5 などを使っていると dolphin (KDE5 のファイルマネージャ) から簡単にアクセスできるようになります。

設定方法について、順番に見ていきましょう。

 
1. ports からインストール
まずは ports から sysutils/fusefs-ntfs をインストールします。そして /boot/loader.conf に以下の行を書きます。

fusefs_load=”YES”

 
これで完了です。

 
2. 実際にマウント
僕のデスクトップ PC の場合、 FreeBSD の起動時に以下の SSD と HDD が認識されています。

$ dmesg | grep nvd
nvd0:  NVMe namespace
nvd0: 488386MB (1000215216 512 byte sectors)
Trying to mount root from ufs:/dev/nvd0p5 [rw]...
$
$ dmesg | grep da0
ada0 at ahcich1 bus 0 scbus1 target 0 lun 0
ada0:  ACS-4 ATA SATA 3.x device
ada0: Serial Number S5RRNF1R566155H
ada0: 600.000MB/s transfers (SATA 3.x, UDMA6, PIO 512bytes)
ada0: Command Queueing enabled
ada0: 953869MB (1953525168 512 byte sectors)
da0 at umass-sim0 bus 0 scbus6 target 0 lun 0
da0:  Fixed Direct Access SPC-3 SCSI device
da0: Serial Number DCC77FFFFFFF
da0: 40.000MB/s transfers
da0: 3815447MB (7814037168 512 byte sectors)
da0: quirks=0x2
$
$ gpart show /dev/nvd0
=>        34  1000215149  nvd0  GPT  (477G)
          34        2014        - free -  (1.0M)
        2048      532480     1  efi  (260M)
      534528       32768     2  ms-reserved  (16M)
      567296   629467136     3  ms-basic-data  (300G)
   630034432    20971520     5  freebsd-ufs  (10G)
   651005952   167772160     6  freebsd-ufs  (80G)
   818778112   125829120     7  freebsd-ufs  (60G)
   944607232    41943040     8  freebsd-ufs  (20G)
   986550272    12124160     9  freebsd-swap  (5.8G)
   998674432     1529856     4  ms-recovery  (747M)
  1000204288       10895        - free -  (5.3M)
$
$ gpart show /dev/ada0
=>        34  1953525101  ada0  GPT  (932G)
          34       32734     1  ms-reserved  (16M)
       32768   819200000     2  ms-basic-data  (391G)
   819232768  1134292367     3  freebsd-ufs  (541G)
$
$ gpart show /dev/da0
=>        34  7814037101  da0  GPT  (3.6T)
          34       32734    1  ms-reserved  (16M)
       32768  4096000000    2  ms-basic-data  (1.9T)
  4096032768  3718004360    3  freebsd-ufs  (1.7T)
  7814037128           7       - free -  (3.5K)

 
nvd0 が M2.SSD で / パーティション他がある、メインの SSD です。
ada0 は SATA SSD で da0 は USB HDD です。全て WindowsOS と FreeBSD で半分ずつ (NTFS と UFS で半分ずつ) 利用しています。

 

実際に NTFS をマウントしてみるには以下のコマンドを利用します。

# ntfs-3g -o rw /dev/ada0p2 /mnt/
#  ls -l /mnt/
total 0
drwxrwxrwx  1 root  wheel  0 Nov 18  2021 $RECYCLE.BIN/
drwxrwxrwx  1 root  wheel  0 Nov 24  2021 Hyper-V/
drwxrwxrwx  1 root  wheel  0 Apr  3  2022 Data/
drwxrwxrwx  1 root  wheel  0 Nov 23  2021 Recovery/
drwxrwxrwx  1 root  wheel  0 Nov 18  2021 System Volume Information/
#
# umount /mnt

 
ports から sysutils/fusefs-ntfs をインストールすると ntfs-3g というコマンドがインストールされ、そのオプションに -o rw を指定しているので FreeBSD から書き込みもできるようになります。

これで NTFS の中のデータを取り出すために WindowsOS を起動することがなくなりました;-)。

 
3. automount しちゃうよ
KDE5 を利用している場合、 sddm からログインすると、ログインした段階で色々なファイルシステムを一般ユーザ権限でマウントしてくれる機能があります。

一般ユーザのアカウント takachan でログインすると、自動マウントさせたい場合には上にも書いた通り /etc/sysctl.conf に以下の設定をします。

vfs.usermount=1

 
この他に「KDE システム設定」でちょっと設定します。

「KDE システム設定」を起動して「起動と終了」→「Background Services」をチョイスすると、その中に [Removable Device Automounter] という項目があるのでこれにチェックを入れて更に再生ボタンを押してステータスを『実行中』にします。

次に同じく「KDE システム設定」の「リムーバブルストレージ」→「Removable Devices」をチョイスして、一番下にある [Automatically mount removable media that have never been mounted before] にチェックを入れて [適用]ボタンを押します。

これで、一旦ログアウトして再度ログインするか、service sddm restart してからログインしてみます。

と、いうか、sddm を再起動したあと、リモートから ssh でログインして df -k とかたたいて確認して、そのあとで sddm から一般ユーザでログインするとログイン後に様々なファイルシステムがマウントできることが確認できます。

僕のデスクトップ PC の場合はこんな感じになります。

$ df -k
Filesystem    1024-blocks      Used      Avail Capacity  Mounted on
*** 一部略 ***
/dev/ada0p3     549341012 187462520  317931212    37%    /opt
*** 一部略 ***
/dev/fuse       409599996  44718652  364881344    11%    /media/Samsung_SSD_870_QVO_1TB_S5RRNF1R566155H_p2
/dev/fuse      2047999996 534627440 1513372556    26%    /media/WDC_WD40_EZRZ-00GXCB0_DCC77FFFFFFF_p2
/dev/da0p3     1800630836 892226780  764353592    54%    /media/WDC_WD40_EZRZ-00GXCB0_DCC77FFFFFFF_p3
/dev/fuse       314733564  69794920  244938644    22%    /media/WDC_PC_SN730_SDBPNTY-512G-1006_213240808600_p3
/dev/fuse          764924    604264     160660    79%    /media/WDC_PC_SN730_SDBPNTY-512G-1006_213240808600_p4

 
/media/ ディレクトリのは以下にデバイス名付きで自動的に、一般ユーザ権限でマウントされます。デバイス名の後ろは p2,p3 とありますがパーティション名ですね。
Windows11 の C:\ や リカバリ領域なども自動マウントします。あと、UFS なファイルシステムも自動マウントしてしまいます。

Filesystem が /dev/fuse の場合は NTFS か FAT で /dev/da0p3 と表示されている場合は UFS ですね。 /media/Samsung_SSD_870_QVO_1TB_S5RRNF1R566155H_p3 は UFS ですが、これは /dev/ada0p3 で既に /opt にマウントしているので自動マウントされません。

 
KDE5 を利用した場合は opendesktop.org 由来の UDisks2 が利用されます。 FreeBSD 的かつ ports 的には sysutils/bsdisks が動作して plasmashell から dbus を経由して自動マウントしてくれるようです。
NTFS ファイルシステムを自動マウントしたくない場合は kldload fusefs.ko をやめれば良いです(あとで別件で説明します)。 UFS はもう完全に自動マウントしてしまうので止められない。自動マウント自体を停止したい場合は「KDE システム設定」の [Removable Device Automounter] を停止するしか手はないです。

 
KDE5 を利用している場合には KDE5 側で自動マウントしてくれますが、KDE5 を利用していな場合、 sysutils/dsbmd をイントールして /etc/rc.conf に dsbmd_enable=YES を書く必要があるかもしれません。

詳細については以下の URL を参照してください。

https://github.com/mrclksr/DSBMD

上記の dsbmd は ports のコンパイル時の make onfig で様々なファイルシステムを検知、自動マウントしてくれるようです。裏を返すとそれだけ色々な fusefs をインストールする。と、いうことになると思いますが。 ext4 とか HFS+ とかすげーな。みたいな・・。

一般ユーザ権限で色々なファイルシステムを自動マウント。遊んでみてください;-)。

 
4. 注意制限事項
注意点は二つ。

  • Bitlocker で保護されている NTFS はマウントできない
  • USB HDD の場合、スピンドルが止まっている場合がある

 
順番に見ていきましょうか。

Lenovo の ThunkPad X13 は Windows11 と FreeBSD のマルチブートですが、 Windows11 の NTFS は Bitlocker で保護されているので ntfs-3g ではマウントできません。以下のようになります。

# ntfs-3g -o rw /dev/nvd0p3 /mnt/
NTFS signature is missing.
Failed to mount '/dev/nvd0p3': 無効な引数です
The device '/dev/nvd0p3' doesn't seem to have a valid NTFS.
Maybe the wrong device is used? Or the whole disk instead of a
partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?

 
上記のようなエラーが出た場合は WindowsOS 側で「コンピュータの管理」→「ディスクの管理」を開いて当該パーティションが『Bitlocker で保護されてます。』と、いう表示があるか確認してみましょう。
この場合 kldload fusefs.ko していても意味ないです。リカバリ領域が見えても意味ないし・・。

 
次の USB HDD の場合ですが、SSD と違い外付け USB HDD の場合、ケースの機能によっては HDD の回転を停止するものがあります。自動マウントしている状態で HDD のスピンドルが停止していた場合、 cd /media/USB-HDD/ とか ls /media/USB-HDD/ すると、そこから HDD のスピンドルが回り始めます。この場合、ほぼほぼ CAM status: SCSI Status Error が出ます。そして、マウントしている状態だけど ls しても表示してくれない・・。 orz

外付け HDD の場合は cd とか ls でアクセスする前に以下のコマンドを打つ必要があります。

$ sudo camcontrol start /dev/da0

 
上記コマンドを打った段階で停止していた HDD (/dev/da0) のスピンドルが回り始めます。そのあとで cd とか ls でアクセスするようにしましょう。

 
以上、FreeBSD で NTFS に対するアクセスと、ファイルシステムの一般ユーザ権限での自動マウントについて書いてみました。

マルチブートしている PC の場合、もう一方の OS の中へアクセスしたい。と、いうことは多々あるのですが、今回は FreeBSD 側から WindowsOS の NTFS に対して簡単にアクセスする方法を書いてみました。

皆さんの環境でも是非、導入してみてください;-)。自動マウントはらくちんですよ。

10月 242022
 

その昔購入した Lenovo V525 は Windows10 から Windows11 にアップデートして、 2022/10 の Windows Update を実行したら、画面がデスプレィに表示してくれなくなった・・。

回復 USB から青いメンテナンス画面を出して以前のバージョンに戻したり、適用した Windows Update を消したりして、なんとか復活したけど、この PC 、一番安いの購入したので CPU が AMD A6-9500 で、メモリ 4GB を 8GB にパワーアップして利用していたけど、最近は遅すぎてお話にならない。まぁ、最近は Ryzen7 の 8Core / 16 スレッドな PC を利用しているので、遅さにうんざり。って、感じでしょうか。

 
新しい PC を探していたのだけど、手頃で小型な PC が良い。と、いうことで、そーなると、AMD の Ryzen 搭載 PC はちと高め・・。
Intel の第11世代プロセッサである Intel Celeron N5095 を搭載している PC であれば、アーキテクチャが ATOM とはいえ、そこそこ速いであろうということで、Beelink MINI S を購入してみました。

メモリは 8GB 、 SSD は 128GB です。ただ、 M2.SSD ではなく SATA に接続されたモノなので、NVNE よりは遅いのと、買い換えるとしたらちょっと高価になるかな・・。と、いう状態。

amazon で購入しましたが 24,800yen のところクーポン 3,000yen 分がついていたので 21,800yen という、非常に格安な部類の PC が手に入りました;-)。

 
ただ、以前 Beelink SER4 を購入したとき、OS が怪しすぎたので返品しました。今回は継続して利用してみようかと・・。

ただ、やっぱり、不要なドライバがインストールされていたりするので、 Microsoft から Windows11 の ISO イメージダウンロードして、プレインストールの OS はサクっと、削除しました。

 
プレインストールされた OS は一応回復 USB を作成し、 c:\ 直下にあるドライバ類をバックアップしました。

Windows11 クリーンインストール後は Intel Serial IO I2C Host Controller が 7 個くらいあり、これらは認識しなかったので、バックアップしたドライバが入っていたディレクトリからインストールしました。
必要なドライバは全て入っているので、デバイスマネージャーで確認すると ! マークは一個もない状態になりました。

最近は AMD の PC ばかりが手元にあるので Intel プラットームの PC の状況はいまいち把握できていません。この Serial IO は FreeBSD でも根こそぎ認識していません。 pciconf -lv はほぼほぼ none です。

 
今回の PC 購入時に Windows のライセンスについてちょっと調べたのですが、「MAK ライセンス」というのがあるらしいですね。「マルチプルアクティベーションキー」の略だとか。これをメーカが利用すると、出荷する PC はドドドとライセンスを提供できるかな?

 
と、いうことで届いた MINI S はこんな感じ。 iPhone8 との比較ですが、随分と小さいです。これだと、カバンに入れて持ち運べそうです。例えばデータセンタに行けばディスプレーとキーボード・マウスがあるので NotePC を持ち運ぶ必要はないかもですね。

中身はこんな感じです。

実は U95 の写真をウェブで見ていて、メモリスロットが 2 つあると思い、別途 8GB のメモリを購入してしまいました。が、実際に開けてみるとメモリスロットは一個しかあふりません。 Beelink MINI S はメモリスロットは一個です。なので、メモリを増やす場合は 16GB の SO-DIMM を一枚購入する必要があります。 メモリの形式は SO-DIMM DDR4 2400MHz 1.2V です。

SSD は上にもかいた通り M2.SATA SSD です。増設は 2.5 インチ SATA SSD が増設できます。僕は FreeBSD をインストールするために SATA SSD 480GB (余り物) を増設しました。

上の写真だとアップですね。下のほうに M2.SATA SSD 上が、メモリモジュールを外したメモリスロット。一個しか無いです。

無線 /Bt チップは Intel Dual Band Wireless-AC 3165 を利用しているようですが、中を開けてみると M2.SATA SSD の右側にハンダでオンボードに固定のようです。ずいぶんとちっこいチップが写真の右側に見えると思います。

しかし、Dual Band Wireless-AC 3165 は速度出ないですね。 802.11ac で接続して通信確認しましたが 100Mbps 程度しか出ません。 筐体が小さい中に張り巡らせたアンテナの影響もあるのかな?

 
これでほぼ準備完了。 OS も新規に再インストールしたし、気分もドライバもすっきりっ!! ;-)。

実際に使ってみると ATOM の割には速いです。 Intel Celeron N5095 は比較的新しいアーキテクチャだからでしょうかね。まぁ、今まで v525 で利用していた AMD A6-9500 は 2Core でもありますしね。そこそこ頑張ってくれる PC が手に入ってラッキーでした;-)。

今回購入した Beelink MINI S は Windows11 で利用するための PC です。テレビに接続して、色々楽しみたいと思います。

 
と、いいつつ、当然 FreeBSD/amd64 13.1-RELEASE もインストールしました。

本当はこんなことやる必要ないのかもしれないのですが、 EFI 領域がどうなるのか解らなかったので、ちょっとトリッキーにインストールしました。
M2.SATA の Windows11 領域を 20GB ほど小さくして、そこに FreeBSD 用の / パーティションを準備して、/home /usr /var SWAP などは 2.5インチ SATA SSD 側にインストールしました。

サクっと起動して、 X11 まで起動して KDE5 が動作して suspend/resume します。 Dual Band Wireless-AC 3165 は iwm0 で認識します。 802.11a で通信できます。

まぁ、 一応デアルブートにしましたが Windows11 をメインで利用するので、これくらいで。最後に pciconf -lv をつけておきます。

hostb0@pci0:0:0:0:      class=0x060000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x4e24 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = bridge
    subclass   = HOST-PCI
vgapci0@pci0:0:2:0:     class=0x030000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4e55 subvendor=0x8086 subdevice=0x2212
    vendor     = 'Intel Corporation'
    device     = 'JasperLake [UHD Graphics]'
    class      = display
    subclass   = VGA
none0@pci0:0:4:0:       class=0x118000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x4e03 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Dynamic Tuning service'
    class      = dasp
xhci0@pci0:0:20:0:      class=0x0c0330 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4ded subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
    subclass   = USB
none1@pci0:0:20:2:      class=0x050000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4def subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = memory
    subclass   = RAM
none2@pci0:0:21:0:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4de8 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Serial IO I2C Host Controller'
    class      = serial bus
none3@pci0:0:21:1:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4de9 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Serial IO I2C Host Controller'
    class      = serial bus
none4@pci0:0:21:2:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dea subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
none5@pci0:0:21:3:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4deb subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
none6@pci0:0:22:0:      class=0x078000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4de0 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Management Engine Interface'
    class      = simple comms
ahci0@pci0:0:23:0:      class=0x010601 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dd3 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = mass storage
    subclass   = SATA
none7@pci0:0:25:0:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dc5 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
none8@pci0:0:25:1:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dc6 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
pcib1@pci0:0:28:0:      class=0x060400 rev=0x01 hdr=0x01 vendor=0x8086 device=0x4dbc subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = bridge
    subclass   = PCI-PCI
pcib2@pci0:0:28:5:      class=0x060400 rev=0x01 hdr=0x01 vendor=0x8086 device=0x4dbd subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = bridge
    subclass   = PCI-PCI
none9@pci0:0:30:0:      class=0x078000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4da8 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = simple comms
none10@pci0:0:30:3:     class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dab subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
isab0@pci0:0:31:0:      class=0x060100 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4d87 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = bridge
    subclass   = PCI-ISA
hdac0@pci0:0:31:3:      class=0x040300 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dc8 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Jasper Lake HD Audio'
    class      = multimedia
    subclass   = HDA
none11@pci0:0:31:4:     class=0x0c0500 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4da3 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Jasper Lake SMBus'
    class      = serial bus
    subclass   = SMBus
none12@pci0:0:31:5:     class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4da4 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Jasper Lake SPI Controller'
    class      = serial bus
iwm0@pci0:1:0:0:        class=0x028000 rev=0x81 hdr=0x00 vendor=0x8086 device=0x3165 subvendor=0x8086 subdevice=0x8010
    vendor     = 'Intel Corporation'
    device     = 'Wireless 3165'
    class      = network
re0@pci0:2:0:0: class=0x020000 rev=0x15 hdr=0x00 vendor=0x10ec device=0x8168 subvendor=0x10ec subdevice=0x0123
    vendor     = 'Realtek Semiconductor Co., Ltd.'
    device     = 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller'
    class      = network
    subclass   = ethernet

 
NotePC のかわりにモバイルで持ち出すのもアリな雰囲気です。ちっこくて、ほどほど速い (ベンチ取らずに体感でのコメントで申し訳ない(^^;) し値段も手頃なので、まぁ『あり』なのかなぁ;-)。