投げ銭

★当サイトへの投げ銭(PayPal)★

LINK


(無償、寄付歓迎) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

★当サイトへの投げ銭(PayPal)★

2022年2月12日土曜日

【Linux RaspiOS bullseye】Log2Ramを利用してログの記録先(/var/log)をRAM領域に変更した【log2ram 1.6.1】

 Raspberry pi 4 (4GB)に、Raspberry pi OS(32bit)を導入した。
OSのバージョンは、2021-10-30-raspios-bullseye-armhf-lite である。
通常通り、microSDを使用している。

次のページに記載の手順でシステムを準備した。



 このRaspberry piによるシステムの運用に際して、SDカードの書き込み寿命が気になった。
いくら耐久性の高いカードを用いたとしても、刻々とログが書き込まれることを考えると、不安である。

 そこで、「/var/log」のパーティションとしてRAM領域が使用されるようにした。
これを実現する方法として、「Log2Ram」というパッケージを用いることにした。

 1、Log2Ramは、システム起動時に自動的に動作して、SDに保存されている「/var/log」の内容を、確保したRAM領域に保存し「/var/log」にマウントしなおす。
 2、以後、システムのログシステムはRAM領域にログを刻むことになる。
 3、システムの終了時や、Log2Ramの終了時、設定で指定したタイミングで、それまでRAM領域に保存されていた内容は、SDに保存され永続化される。

 このようなライフサイクルを繰り返す。
 
 以下はこの「Log2Ram」の導入手順と動作テストについて記述してある。



■ rootユーザーに切り替えた。

root@raspberrypi:/home/pi#  su



■ Log2Ramのインストール

◯リポジトリの設定

# echo "deb [signed-by=/usr/share/keyrings/azlux-archive-keyring.gpg] http://packages.azlux.fr/debian/ bullseye main" | sudo tee /etc/apt/sources.list.d/azlux.list
deb [signed-by=/usr/share/keyrings/azlux-archive-keyring.gpg] http://packages.azlux.fr/debian/ bullseye main
wget -O /usr/share/keyrings/azlux-archive-keyring.gpg  https://azlux.fr/repo.gpg
(10.7 MB/s) - '/usr/share/keyrings/azlux-archive-keyring.gpg' saved [2255/2255]

◯パッケージのインストール

上記で設定したリポジトリからパッケージを導入する。

# apt update
Get:1 http://archive.raspberrypi.org/debian bullseye InRelease [23.5 kB]                                                                             
Get:2 http://raspbian.raspberrypi.org/raspbian bullseye InRelease [15.0 kB]                                                                          
Get:3 http://packages.azlux.fr/debian bullseye InRelease [3988 B]                         
Get:4 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf Packages [13.2 MB]
Get:5 http://archive.raspberrypi.org/debian bullseye/main armhf Packages [249 kB]
Get:6 http://packages.azlux.fr/debian bullseye/main armhf Packages [3427 B]             
Fetched 13.5 MB in 10s (1384 kB/s)                                                                                                                                      
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
1 package can be upgraded. Run 'apt list --upgradable' to see it.
# apt install log2ram
The following NEW packages will be installed:               
  log2ram
0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded.
Need to get 4204 B of archives.
After this operation, 0 B of additional disk space will be used.
Get:1 http://packages.azlux.fr/debian bullseye/main armhf log2ram all 1.6.1 [4204 B]
<略>
Unpacking log2ram (1.6.1) ...
Setting up log2ram (1.6.1) ...
Created symlink /etc/systemd/system/sysinit.target.wants/log2ram.service → /etc/systemd/system/log2ram.service.
Created symlink /etc/systemd/system/timers.target.wants/log2ram-daily.timer → /etc/systemd/system/log2ram-daily.timer.
#####         Reboot to activate log2ram         #####
##### edit /etc/log2ram.conf to configure options ####


■Log2Ramの設定

◯サービスが有効になっているか確認した。

# systemctl is-enabled log2ram
enabled

◯Log2Ramが使用するRAMの容量を設定した。

 次のduコマンドの結果から、/var/logのサイズが、109MBだとわかった。
これはほとんど、 /var/log/journal が占めている容量である。

# du /var/log -h
4.0K    /var/log/runit/ssh
8.0K    /var/log/runit
152K    /var/log/apt
4.0K    /var/log/private
105M    /var/log/journal/********************************
105M    /var/log/journal
4.0K    /var/log/asterisk/cdr-csv
4.0K    /var/log/asterisk/cdr-custom
24K     /var/log/asterisk
109M    /var/log
そのため、この現状に合わせて次のように確保容量を次のように再設定した。

# nano /etc/log2ram.conf

(関係する部分のみ抜粋)
# Size for the ram folder, it defines the size the log folder will reserve into the RAM.
# If it's not enough, log2ram will not be able to use ram. Check you /var/log size folder.
# The default is 40M and is basically enough for a lot of applications.
# You will need to increase it if you have a server and a lot of log for example.
SIZE=150M

 これに関して、後でわかったことだが、/var/logよりもRamの確保容量が小さい場合、次のエラーが発生してLog2Ramは動作しなかった。
log2ram[299]: ERROR: RAM disk for "/var/hdd.log/" too small. Can't sync.


◯RamDiskからSDカードへの「定期的」な書き戻しは行わないようにした。

 これを設定すると、突然の電源遮断によりログがごっそりと消滅してしまう危険がある。
そのため、この設定は必要に応じて行うべきである。

# systemctl disable log2ram-daily.timer
Removed /etc/systemd/system/timers.target.wants/log2ram-daily.timer


 以上で基本的な設定は完了した。
 (他にも有用な設定があるので、参考サイトを参照してください。)

 後は、システムを再起動するか、log2ramをsystemctlでstartするだけで、Log2Ramは機能する。



■ Log2Ramの動作確認

◯Log2Ramの動作前後でのdfコマンドの結果の違いを確認した。

 再起動前、Log2Ramが動作する前は次のような状態だった。

# df -h

(Log2Ramが動作する前の状態)
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  1.5G   27G   6% /
devtmpfs        1.8G     0  1.8G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           768M  1.1M  767M   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1  253M   49M  204M  20% /boot
tmpfs           384M     0  384M   0% /run/user/1000

・システムの再起動

# reboot

 再起動後、Log2Ramは動作することになる。

 そして先程と同様に、dfコマンドの結果を確認した。

# df -h

(Log2Ramの動作後の状態)
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  1.5G   27G   6% /
devtmpfs        1.8G     0  1.8G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           768M  1.1M  767M   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1  253M   49M  204M  20% /boot
log2ram         150M   22M  129M  15% /var/log
tmpfs           384M     0  384M   0% /run/user/1000
 log2ramの領域として、指定したとおり150MBが確保され、/var/logにマウントされていた。
そのうち、22MBが使用されていることがわかった。

(ところで、初めに、/var/logは109MB専有していたのに、log2ramが動作後は、22MBに急減したのか。これについては後で考察した。)


 Log2Ramが動作していることは次のコマンドの結果からも確認できた。

# mount
一部のみ抜粋
log2ram on /var/log type tmpfs (rw,nosuid,nodev,noexec,noatime,size=153600k,mode=755)
tmpfsが使用されていることがわかった。



■ journaldの動作について

 少し上のところで疑問が生じたように、Log2Ramの動作前後で、/var/logの使用容量が109MBから22MBに急減したのか。

 /var/logが占めている容量について、Log2Ramの動作前後で確認したものを再掲する。

# du /var/log -h

(Log2Ramの動作前)
4.0K    /var/log/runit/ssh
8.0K    /var/log/runit
152K    /var/log/apt
4.0K    /var/log/private
105M    /var/log/journal/********************************
105M    /var/log/journal
4.0K    /var/log/asterisk/cdr-csv
4.0K    /var/log/asterisk/cdr-custom
24K     /var/log/asterisk
109M    /var/log

# du /var/log -h

(Log2Ramの動作後)
0 /var/log/runit/ssh
0 /var/log/runit
0 /var/log/private
16M /var/log/journal/********************************
16M /var/log/journal
0 /var/log/asterisk/cdr-custom
0 /var/log/asterisk/cdr-csv
16K /var/log/asterisk
144K /var/log/apt
22M /var/log
 このように、/var/log/journal の占める領域が、105MBだったのが16MBばかりに減ったことがわかる。

 /var/log/journalは、journaldが全てのログを刻々とバイナリ保存している場所である。
journaldは、保存先ディレクトリのディスク空き容量の一部のみを使用するように制御されている。
 別のディストリビューションのArchLinuxの場合は、/var/log/journalのあるパーティションの10%だけが使用されるらしい。


◯そこで、次のように実験してみた。

 今、次のように、/var/log/journal/ が占める容量は約26MBである。

root@raspberrypi:/home/pi# du /var/log -h
4.0K /var/log/runit/ssh
8.0K /var/log/runit
152K /var/log/apt
4.0K /var/log/private
26M /var/log/journal/********************************
26M /var/log/journal
4.0K /var/log/asterisk/cdr-csv
4.0K /var/log/asterisk/cdr-custom
68K /var/log/asterisk
36M /var/log

これは、次のコマンドを使ってもわかる。

root@raspberrypi:/home/pi# journalctl --disk-usage
Archived and active journals take up 25.5M in the file system.

 次に、Log2Ramが確保するRAM容量を、50MBに減らした。
これによって、journaldが使用できる容量は制限される。

root@raspberrypi:/home/pi# nano /etc/log2ram.conf

(関係する部分のみ表示)
SIZE=50M

 ここで、システムを再起動し、Log2Ram、journaldを再起動した。

root@raspberrypi:/home/pi# reboot


 再起動後、次のように、Log2Ramが確保した50MB領域が/var/logにマウントされていることを確認した。

root@raspberrypi:/home/pi# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  1.5G   27G   6% /
devtmpfs        1.8G     0  1.8G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           768M  1.1M  767M   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1  253M   49M  204M  20% /boot
log2ram          50M   24M   27M  48% /var/log
tmpfs           384M     0  384M   0% /run/user/1000

 そして、journaldによるログサイズを確認した。
25MBだったものが、13.6MBにまで減っていた。

root@raspberrypi:/home/pi# journalctl --disk-usage
Archived and active journals take up 13.6M in the file system.

 これは、duコマンドの内容と一致した。

root@raspberrypi:/home/pi# du /var/log -h
0 /var/log/runit/ssh
0 /var/log/runit
0 /var/log/private
14M /var/log/journal/********************************
14M /var/log/journal
0 /var/log/asterisk/cdr-custom
0 /var/log/asterisk/cdr-csv
56K /var/log/asterisk
144K /var/log/apt
24M /var/log

 このように、/var/logの空き容量によって、journaldが使用できる容量が変化することがわかかった。

 Log2Ramを導入する前は、/var/logはルートディレクトリと同じパーティションにあったため、より多くの領域を使用することができた。
そのため、最初に示したとおり、/var/log/journalは、105MBもの容量を専有できていた。
 しかし、Log2Ramを導入した後は、RAM領域の150MBのみが/var/log/にマウントされたため、journaldが使用できるディスク容量は急減し、/var/log/journalが占める容量は105MBから16MBまで小さくされたと考えられる。journaldがこれら削減の作業を行ったと考えられる。



<参考>

◆「Log2Ramについて」

・azlux/log2ram
< https://github.com/azlux/log2ram >  2022年2月11日

・How To Write Log Files In RAM Using Log2ram In Linux
< https://ostechnix.com/how-to-write-log-files-in-ram-using-log2ram-in-linux/ > 2022年2月10日

・Using Log2RAM on the Raspberry Pi
< https://pimylifeup.com/raspberry-pi-log2ram/ > 2022年2月10日

・How log2ram works.
< https://linuxfun.org/en/2021/01/01/what-log2ram-does-en/ > 2022年2月10日

・Log2Ram: Extending SD Card Lifetime for Raspberry Pi LoRaWAN Gateway
< https://mcuoneclipse.com/2019/04/01/log2ram-extending-sd-card-lifetime-for-raspberry-pi-lorawan-gateway/ > 2022年2月10日


・Improve system performance by moving your log files to RAM Using Ramlog
< http://www.ubuntugeek.com/improve-system-performance-by-moving-your-log-files-to-ram-using-ramlog.html > 2022年2月10日


◆「 systemd journalについて」

・A Guide to systemd journal Maintenance [With Examples]
< https://www.debugpoint.com/2021/01/systemd-journald-clean/ > 2022年2月12日

・Arch Linux - journalctl ログの最大サイズを設定
< https://b.fugenjikko.com/archlinux/archlinux-journal-maxsize > 2022年2月12日

・CentOS 7のログ管理「journald」
< https://thinkit.co.jp/story/2014/12/18/5389?page=0%2C1 > 2022年2月12日


◆「tmpfsについて」

・Linux豆知識 111 / tmpfs
< https://linuc.org/study/knowledge/441/ > 2022年2月12日

2022年2月9日水曜日

【Linux RaspiOS bullseye】Network Managerとdhclientを有効にした環境で静的IPv4とルーティング情報を登録する

 Raspberry pi OS (2021-10-30-raspios-bullseye-armhf-lite)に、Network Managerとdhclientとを導入した環境において、nmcliを用いて静的IPv4アドレスと静的ルーティング情報を設定する。
 ここでは同じネットワークインターフェイスにおいて、DHCPで取得したIPv4アドレスと、静的に設定したIPv4アドレスとを併用する。


<前提条件について>

次のページの手順で、Raspberry pi OSに、Network Managerとdhclientを導入した。


上記手順でeth0は、すでにNetwork Managerと連携したdhclientというDHCPクライアントソフトウェアによって、IPv4アドレスが割り当てられている
このためRaspberry pi OS(2021-10-30-raspios-bullseye-armhf-lite)でデフォルトのdhcpcdは無効にしている

dhcpcdは無効にしているため、Network Managerの管理ツールnmcliを用いて、
IPv4アドレスの手動設定、ルーティングの手動設定を行っていることに注意する。

(参考)dhcpcdを用いた設定方法について(この方法は今回の環境では使わない。)
http://akira-arets.blogspot.com/2018/04/raspbianstretch-register-routinginfo.html



 ログに書き込まれる内容によって、SDカードの寿命が気になれば、
次のページに記載の方法で、「/var/log」をRAM領域に移すこともできる。



IPv4アドレスの自動取得と静的IPv4アドレスの併用のための設定

 以下では、既存の接続設定を削除する操作を含んでいる。
そのため、SSHリモート接続でなく、モニターを接続、USBキーボードによる操作を行う必要がある。

 rootユーザーに切り替えて操作した。


◯既存の接続名を削除した。

・既存の接続設定の確認

root@raspberrypi:/home/pi# nmcli con show
NAME                UUID                                  TYPE      DEVICE 
Wired connection 1  ********-****-****-****-************  ethernet  eth0   
インターフェイスeth0に関しては、"Wired connection 1"という名称でデフォルト接続設定が既にされていることがわかった。

複数の接続設定が存在していると、DHCPによるアドレス取得失敗時に、Network Managerがそれらを切り替えて接続試行しようとするので、既存の接続設定は削除することにした。


・既存の接続設定の削除を行った。

root@raspberrypi:/home/pi# nmcli connection delete "Wired connection 1"


◯新しく接続設定を作成した。

・eth0インターフェイスに対する設定を作成した。
(接続名称はここでは"Eth0"にした。)

root@raspberrypi:/home/pi# nmcli con add type ethernet con-name "Eth0" ifname eth0
詳細については次のページを参考にしてください。


・自動的にコネクションを開始するように設定した。

root@raspberrypi:/home/pi# nmcli con mod  connection.autoconnect yes



◯DHCPによるIPv4アドレス取得のための設定を行った。

root@raspberrypi:/home/pi# nmcli con mod "Eth0" ipv4.method auto


◯静的IPv4アドレスも設定した。

・静的IPv4アドレスの登録

root@raspberrypi:/home/pi# nmcli con mod "Eth0" ipv4.addresses '192.168.MMM.100/24'

(削除する場合は、-ipv4.addresses のようにマイナス記号を付ける。)


重要アドレス自動取得時のDHCPのアドレス取得の試行回数は無制限にする。

root@raspberrypi:/home/pi# nmcli connection mod "Eth0" connection.autoconnect-retries 0

 ここでのポイントは、DHCPクライアントによるアドレス自動取得にも対応させながら、同じLANインターフェースで静的IPv4アドレスも同時に利用しようとしていることである。
 「connection.autoconnect-retries 0」を設定しない場合、DHCPによるアドレス取得ができない環境では、Network Manager始動直後は静的IPv4アドレスによる通信ができたが、数分で通信不能に陥ってしまった。
これは、DHCPによるアドレス自動取得に失敗しギブアップするとき、同じインターフェイスに設定している静的IPv4アドレスによる通信も不能にされてしまうからではないかと考えた。
 そこで、この「connection.autoconnect-retries 0」という設定を行ったところ、DHCPによるアドレス自動取得に失敗する環境でも、静的IPv4アドレスではうまく通信ができるようになった。
 この「connection.autoconnect-retries 0」という設定は、DHCPのアドレス取得の試行回数を無制限にする。試行をギブアップしないので、ここで設定しようとしている静的IPv4アドレスも有効になっていると考えられる。


・作成した設定情報を有効にした。

root@raspberrypi:/home/pi# nmcli con up "Eth0"

(DHCPによるアドレス取得が有効な環境の場合の結果)
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)

(DHCPによるアドレス取得ができない環境の場合)
Error: Connection activation failed: IP configuration could not be reserved (no available address, timeout, etc.)
Hint: use 'journalctl -xe NM_CONNECTION=********-****-****-****-************ + NM_DEVICE=eth0' to get more details.
DHCPによるアドレス取得ができない環境では、このようなエラーが表示されるものの、上記の方法で静的IPアドレスを設定しているため、静的IPアドレスを用いてうまく通信できた。



・IPv4アドレスがeth0に設定されたか確認した。

 DHCPによるアドレス取得が可能な環境において、DHCPクライアントが取得したIPv4アドレスなどのネットワーク情報と、手動で設定したIPv4の両方が存在していることが確認できた。
 システムを再起動しても、手動設定したIPv4アドレスは有効だった。

root@raspberrypi:/home/pi# ip a

(DHCPによるアドレス取得が有効な環境の場合)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether dc:a6:32:**:**:** brd ff:ff:ff:ff:ff:ff
    inet 192.168.MMM.100/24 brd 192.168.MMM.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.XXX.12/24 brd 192.168.XXX.255 scope global dynamic noprefixroute eth0
       valid_lft 259197sec preferred_lft 259197sec
    inet6 fe80::****:****:****:****/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether ae:**:**:**:**:** brd ff:ff:ff:ff:ff:ff permaddr dc:a6:32:**:**:**

 DHCPによるIPアドレスの取得ができない環境では、「nmcli d」の結果をみると、「connecting (getting IP configuration)」という表示になっていたが、静的IPアドレスを上記の方法で設定しているため通信可能であった。



■静的ルーティング設定

以上の設定に加えて、ルーティング情報も設定した。

静的ルーティング設定前には、次のようにルーティングテーブルが存在していた。

pi@raspberrypi:~ $ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.XXX.254 0.0.0.0         UG    100    0        0 eth0
192.168.XXX.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.MMM.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0

◯192.168.0.0/16宛のパケットを192.168.MMM.1へルーティングする設定を行った。

 次の図のように、Raspberry Piは、192.168.MMM.0/24 と192.168.XXX.0/24の2つのネットワークに属しているものとする。
 192.168.XXX.0/24のIPv4アドレスなどの情報はDHCPで受け取り、192.168.MMM.0/24のIPv4などの情報は静的に設定している。

[Raspberry Pi](192.168.MMM.100)-----192.168.MMM.0/24 And 192.168.XXX.0/24-----(192.168.MMM.1)[Router]-----192.168.0.0/16-----

 そして、Raspberry Piから、さらに192.168.0.0/16ネットワークへ接続するために、このRaspberry Piに次のようにルーティング情報を設定した。そのゲートウェイはRouterの192.168.MMM.1アドレスである。


・ルーティング設定の追加

次のコマンドでは永続的なルーティング情報を設定する。

root@raspberrypi:/home/pi# nmcli connection mod "Eth0" ipv4.routes "192.168.0.0/16 192.168.MMM.1"

(削除する場合は、-ipv4.routes のようにマイナス記号を付ける。)
(ip route add 192.168.0.0/16 via 192.168.127.1 dev eth0 というipコマンドでは、Network Managerにより設定が解消されてしまうようである。)


・この設定を有効にした。

(DHCPによるアドレス取得が有効な環境の場合)
root@raspberrypi:/home/pi# nmcli con up "Eth0"
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)

(DHCPによるアドレス取得ができない環境の場合)
root@raspberrypi:/home/pi# nmcli con up "Eth0"
Error: Connection activation failed: IP configuration could not be reserved (no available address, timeout, etc.)
Hint: use 'journalctl -xe NM_CONNECTION=********-****-****-****-************ + NM_DEVICE=eth0' to get more details.
このようなエラーが表示されるものの、上記の方法で静的IPアドレスを設定しているため、
静的IPアドレスを用いてうまく通信できた。


・ルーティングテーブルを確認した。

(DHCPによるアドレス取得が有効な環境の場合)
root@raspberrypi:/home/pi# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.XXX.254 0.0.0.0         UG    100    0        0 eth0
192.168.0.0     192.168.MMM.1   255.255.0.0     UG    100    0        0 eth0
192.168.XXX.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.MMM.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0

(DHCPによるアドレス取得ができない環境の場合)
root@raspberrypi:/home/pi# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     192.168.MMM.1   255.255.0.0     UG    100    0        0 eth0
192.168.MMM.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0
DHCPによるIPアドレスの取得ができない環境では、「nmcli d」の結果をみると、「connecting (getting IP configuration)」という表示になっていたが、
静的IPアドレスを上記の方法で設定しているため通信可能であった。

DHCPによってルーティングやDNSが取得できない場合、
次の例を参考に必要に応じてデフォルトルートやDNSも設定しておく。


◯デフォルトルートを手動設定する。

・デフォルトルートの追加

次のコマンドでは永続的なルーティング情報を設定する。

root@raspberrypi:/home/pi# nmcli connection mod "Eth0" ipv4.gateway '192.168.MMM.1'

削除する場合は、ipv4.gatewayの引数として、シングルクォート2つを置く。(「ipv4.gateway ''」)

# nmcli connection mod "Eth0" ipv4.gateway ''


・DNSサーバーのアドレスを登録する

root@raspberrypi:/home/pi# nmcli con mod eth0 ipv4.dns '192.168.XXX.1''

・この設定を有効にした。

root@raspberrypi:/home/pi# nmcli con up "Eth0"
Error: Connection activation failed: IP configuration could not be reserved (no available address, timeout, etc.)
Hint: use 'journalctl -xe NM_CONNECTION=********-****-****-****-************ + NM_DEVICE=eth0' to get more details.
DHCPによるアドレス取得ができない環境では、このようなエラーが表示されるものの、上記の方法で静的IPアドレスを設定しているため、静的IPアドレスを用いてうまく通信できた。


<参考>
・GNOME DEVELOPER / General Connection Profile Settings
< https://developer-old.gnome.org/NetworkManager/stable/settings-connection.html > 2022年2月8日

・【Linux CentOS 7】nmcliだけでIPv6とIPv4ネットワークに接続するための設定を行う方法(静的IPアドレスの利用)
< http://akira-arets.blogspot.com/2018/04/linux-centos7-networksetting-nmcli.html > 2022年2月8日

・4.2. CONFIGURING STATIC ROUTES USING NMCLI
< https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_static_routes_using_nmcli > 2022年2月8日

【Linux RaspiOS bullseye】Raspberry pi OSにNetwork Managerとdhclientを導入する

 Raspberry pi 4 (4GB)に、Raspberry pi OS(32bit)を導入した。
OSのバージョンは、2021-10-30-raspios-bullseye-armhf-lite である。

このOSには、Network Managerが導入されていなかった。
また、デフォルトでdhcpcdというDHCPクライアントが導入されていた。

 以下では、Raspberry pi OS(2021-10-30-raspios-bullseye-armhf-lite)の導入と基本設定、Network Managerの導入およびDHCPクライアントであるdhclientの導入までを行った手順を記載している。


 また、以下で構築した環境に、静的IPv4アドレス、ルーティング情報を追加するには、次のページを参照してください。



 ログに書き込まれる内容によって、SDカードの寿命が気になれば、
次のページに記載の方法で、「/var/log」をRAM領域に移すこともできる。



■Raspberry pi 4 (4GB)にOSイメージを書き込こみ

これは作業用の別のLinuxマシンで行った。

◯次のファイルをダウンロードした。
(これは古いバージョンである。現時点でより新しいOSが発表されている。)

https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-11-08/2021-10-30-raspios-bullseye-armhf-lite.zip


◯展開したimgファイルの内容をddを用いてmicroSDに書き込んだ。

$ sudo dd if='/Path/To/2021-10-30-raspios-bullseye-armhf-lite.img' of=/dev/sdX bs=3M

詳細は次のページを参照する。


■Raspberry pi 4の起動

Raspberry pi 4本体での操作である。

Raspberry pi 4に次のものを取り付けた。
・OSを書き込んだmicroSD(上記手順)
・USBキーボード
・HDMI接続モニター
・LANケーブル(プライベートIPv4アドレスがDHCPで自動割当され、インターネットにも接続可能な安全なネットワーク)

そして、Raspberry pi 4を安定で十分な容量の電源に繋ぎシステムを起動させた。



■Raspberry pi 4にSSHリモート接続

◯次のページを参照して、Raspberry pi 4にSSH接続を行った。




■Raspberry pi 4の基本設定

◯次のページを参照して、Raspberry pi 4に基本設定を行った。

・rootユーザーに切り替え
・仮想端末tmuxの導入
・システムの更新



◯時刻が日本時刻ではなかったのでタイムゾーンを東京に設定した。

pi@raspberrypi:~ $ sudo raspi-config

次のように順に項目を選択していく。
5 Localisation Options Configure language and regional settings
 →L2 Timezone     Configure time zone
  →Asia
   →Tokyo
完了したら<Finish>を選択する。
設定が終わると、次のように表示された。
Current default time zone: 'Asia/Tokyo'


■NetworkManagerとdhclientの導入

 ネットワークが不通になる場合に備えて、モニターとUSBキーボードを準備しておく。
操作はrootユーザーに切り替えて行った。


◯デフォルトの dhcpcdを停止し無効にした。

停止しなければNetwork Managerのdhcpシステムと競合の恐れがある。

# systemctl stop dhcpcd.service
# systemctl disable dhcpcd.service
# systemctl is-enabled dhcpcd.service
disabled

◯NetworkManagerのインストールを行った。

# apt update
# apt install network-manager


◯NetworkManagerが有効になっているか確認した。

# systemctl is-enabled NetworkManager
enabled
(もし無効のときは、systemctl enabled NetworkManager を実行する。)


◯nmcliコマンド(Network ManagerのCLI)の動作確認

$ nmcli d
DEVICE         TYPE      STATE         CONNECTION         
eth0           ethernet  connected     Wired connection 1 
wlan0          wifi      disconnected  --                 
p2p-dev-wlan0  wifi-p2p  disconnected  --                 
lo             loopback  unmanaged     -- 

◯DHCPクライアントとしてdhclientを利用する

 デフォルトのDHCPクライアントは次のように内蔵のものが使用されていた。

# journalctl -b | egrep "internal"
Feb 09 01:35:36 raspberrypi NetworkManager[6075]: <info>  [1644338136.7170] dhcp-init: Using DHCP client 'internal'
Feb 09 01:35:36 raspberrypi NetworkManager[6075]: <info>  [1644338136.7178] settings: Loaded settings plugin: keyfile (internal)
Feb 09 01:35:37 raspberrypi NetworkManager[6075]: <info>  [1644338137.0383] device (wlan0): supplicant interface state: internal-starting -> disconnected
一方で、次の結果は返ってこなかった。
# journalctl -b | egrep "dhclient"


 次のように設定して、dhclientが用いられるようにした。

# nano /etc/NetworkManager/NetworkManager.conf
[main]
plugins=ifupdown,keyfile
dhcp=dhclient

[ifupdown]
managed=false
そしてシステムを再起動した。
(IPアドレスの変化に備えて、予めモニターに接続しておいた。)

# reboot

 再起動後、IPアドレスが変化したので注意する。


 DHCPクライアントとしてdhclientが使用されているか確認した。

# journalctl -b | egrep "dhclient"
Feb 09 01:40:46 raspberrypi NetworkManager[377]: <info>  [1644338446.1600] dhcp-init: Using DHCP client 'dhclient'
Feb 09 01:40:48 raspberrypi NetworkManager[377]: <info>  [1644338448.3818] dhcp4 (eth0): dhclient started with pid 565
Feb 09 01:40:48 raspberrypi dhclient[565]: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 8
Feb 09 01:40:48 raspberrypi dhclient[565]: DHCPOFFER of 192.168.XXX.12 from 192.168.XXX.254
Feb 09 01:40:48 raspberrypi dhclient[565]: DHCPREQUEST for 192.168.XXX.12 on eth0 to 255.255.255.255 port 67
Feb 09 01:40:48 raspberrypi dhclient[565]: DHCPACK of 192.168.XXX.12 from 192.168.XXX.254
Feb 09 01:40:48 raspberrypi dhclient[565]: bound to 192.168.XXX.12 -- renewal in 125304 seconds.
Network Managerに連携してdhclientが動作していることがわかった。


 DHCPクライアントのdhclientが取得したネットワーク情報は次のファイルに保存されていた。
(*で示した部分は環境固有の値だと考えられる。)

# less /var/lib/NetworkManager/dhclient-********-****-****-****-************-eth0.lease
lease {
  interface "eth0";
  fixed-address 192.168.XXX.12;
  option subnet-mask 255.255.255.0;
  option dhcp-lease-time 259200;
  option routers 192.168.XXX.254;
  option dhcp-message-type 5;
  option dhcp-server-identifier 192.168.XXX.254;
  option domain-name-servers 192.168.YYY.ZZZ;
  option dhcp-renewal-time 129600;
  option dhcp-rebinding-time 226800;
  renew 4 2022/02/10 03:29:12;
  rebind 5 2022/02/11 07:40:48;
  expire 5 2022/02/11 16:40:48;
}

◯ eth0の状態を表示させた。

 dhcpクライアント(dhclient)が動作して、ネットワーク情報を正しく取得できている。

# nmcli dev show eth0
GENERAL.DEVICE:                         eth0
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         DC:A6:32:**:**:**
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     Wired connection 1
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/1
WIRED-PROPERTIES.CARRIER:               on
IP4.ADDRESS[1]:                         192.168.XXX.12/24
IP4.GATEWAY:                            192.168.XXX.254
IP4.ROUTE[1]:                           dst = 0.0.0.0/0, nh = 192.168.XXX.254, mt = 100
IP4.ROUTE[2]:                           dst = 192.168.XXX.0/24, nh = 0.0.0.0, mt = 100
IP4.DNS[1]:                             192.168.YYY.ZZZ
IP6.ADDRESS[1]:                         fe80::****:****:****:****/64
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = fe80::/64, nh = ::, mt = 100
IP6.ROUTE[2]:                           dst = ff00::/8, nh = ::, mt = 256, table=255


■iptablesについて

◯Network Managerを導入した後、iptablesが既に導入されていた。

root@raspberrypi:/home/pi# apt install iptables
iptables is already the newest version (1.8.7-1).
iptables set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.

◯IPフィルタの状態を調べた。

 以下のように、フィルタが全く存在していない。
必要に応じて適切なフィルタリング設定を行う必要がある。

(IPv4について)
root@raspberrypi:/home/pi# iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
(IPv6について)
root@raspberrypi:/home/pi# ip6tables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

◯iptablesフィルタルールの永続化

 iptablesコマンドでフィルタを設定した場合、永続化しなければ再起動でルールが消えてしまう。
 そのため、簡単に永続化できるように、次のパケージを導入した。

root@raspberrypi:/home/pi# apt install iptables-persistent

導入処理の際、次のように尋ねられる。
現在のiptablesのフィルタリングルールを永続化するかどうか尋ねられる。
保存を選択すると、「/etc/iptables/rules.v4」にフィルタルールが保存される。
Configuring iptables-persistent 

Current iptables rules can be saved to the configuration file /etc/iptables/rules.v4. These rules will then be loaded automatically during system startup.

Rules are only saved automatically during package installation. 
See the manual page of iptables-save(8) for instructions on keeping the rules file up-to-date. 

Save current IPv4 rules? 
引きつづき、IPv6についても同様の質問がされる。

詳細は次のページを参考にしてください。



■dhclientの設定ファイルについて

「/var/lib/NetworkManager/dhclient-eth0.conf」の内容は、Network Managerが管理しており、
「/etc/dhcp/dhclient.conf」で設定された内容を自動的に統合している。

このように「 /var/lib/NetworkManager/dhclient-eth0.conf」はNetwork Managerによって自動的に生成されており、たとえ直接変更しても元の状態に戻された。

以下は、オリジナルの「/etc/dhcp/dhclient.conf」に対して、
「 /var/lib/NetworkManager/dhclient-eth0.conf」がどのように生成されているか対照したものである。


◯デフォルトの「/etc/dhcp/dhclient.conf」の内容

root@raspberrypi:/home/pi# cat /etc/dhcp/dhclient.conf
# Configuration file for /sbin/dhclient.
#
# This is a sample configuration file for dhclient. See dhclient.conf's
# man page for more information about the syntax of this file
# and a more comprehensive list of the parameters understood by
# dhclient.
#
# Normally, if the DHCP server provides reasonable information and does
# not leave anything out (like the domain name, for example), then
# few changes must be made to this file, if any.
#

option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;

send host-name = gethostname();
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, domain-search, host-name,
dhcp6.name-servers, dhcp6.domain-search, dhcp6.fqdn, dhcp6.sntp-servers,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers;

#send dhcp-client-identifier 1:0:a0:24:ab:fb:9c;
#send dhcp-lease-time 3600;
#supersede domain-name "fugue.com home.vix.com";
#prepend domain-name-servers 127.0.0.1;
#require subnet-mask, domain-name-servers;
#timeout 60;
#retry 60;
#reboot 10;
#select-timeout 5;
#initial-interval 2;
#script "/sbin/dhclient-script";
#media "-link0 -link1 -link2", "link0 link1";
#reject 192.33.137.209;

#alias {
#  interface "eth0";
#  fixed-address 192.5.5.213;
#  option subnet-mask 255.255.255.255;
#}

#lease {
#  interface "eth0";
#  fixed-address 192.33.137.200;
#  medium "link0 link1";
#  option host-name "andare.swiftmedia.com";
#  option subnet-mask 255.255.255.0;
#  option broadcast-address 192.33.137.255;
#  option routers 192.33.137.250;
#  option domain-name-servers 127.0.0.1;
#  renew 2 2000/1/12 00:00:01;
#  rebind 2 2000/1/12 00:00:01;
#  expire 2 2000/1/12 00:00:01;
#}

◯ そのときの「/var/lib/NetworkManager/dhclient-eth0.conf」の内容

root@raspberrypi:/home/pi# cat /var/lib/NetworkManager/dhclient-eth0.conf
# Created by NetworkManager
# Merged from /etc/dhcp/dhclient.conf

# Configuration file for /sbin/dhclient.
#
# This is a sample configuration file for dhclient. See dhclient.conf's
# man page for more information about the syntax of this file
# and a more comprehensive list of the parameters understood by
# dhclient.
#
# Normally, if the DHCP server provides reasonable information and does
# not leave anything out (like the domain name, for example), then
# few changes must be made to this file, if any.
#
option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;
#send dhcp-client-identifier 1:0:a0:24:ab:fb:9c;
#send dhcp-lease-time 3600;
#supersede domain-name "fugue.com home.vix.com";
#prepend domain-name-servers 127.0.0.1;
#require subnet-mask, domain-name-servers;
#timeout 60;
#retry 60;
#reboot 10;
#select-timeout 5;
#initial-interval 2;
#script "/sbin/dhclient-script";
#media "-link0 -link1 -link2", "link0 link1";
#reject 192.33.137.209;
#alias {
#  interface "eth0";
#  fixed-address 192.5.5.213;
#  option subnet-mask 255.255.255.255;
#}
#lease {
#  interface "eth0";
#  fixed-address 192.33.137.200;
#  medium "link0 link1";
#  option host-name "andare.swiftmedia.com";
#  option subnet-mask 255.255.255.0;
#  option broadcast-address 192.33.137.255;
#  option routers 192.33.137.250;
#  option domain-name-servers 127.0.0.1;
#  renew 2 2000/1/12 00:00:01;
#  rebind 2 2000/1/12 00:00:01;
#  expire 2 2000/1/12 00:00:01;
#}
send host-name "raspberrypi"; # added by NetworkManager

option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;
option ms-classless-static-routes code 249 = array of unsigned integer 8;
option wpad code 252 = string;

request; # override dhclient defaults
also request subnet-mask;
also request broadcast-address;
also request time-offset;
also request routers;
also request domain-name;
also request domain-name-servers;
also request domain-search;
also request host-name;
also request dhcp6.name-servers;
also request dhcp6.domain-search;
also request dhcp6.fqdn;
also request dhcp6.sntp-servers;
also request netbios-name-servers;
also request netbios-scope;
also request interface-mtu;
also request rfc3442-classless-static-routes;
also request ntp-servers;
also request ms-classless-static-routes;
also request static-routes;
also request wpad;
also request root-path;


◯両者の違いについてdiffコマンドの結果

root@raspberrypi:/home/pi# diff /var/lib/NetworkManager/dhclient-eth0.conf /etc/dhcp/dhclient.conf
1,3d0
< # Created by NetworkManager
< # Merged from /etc/dhcp/dhclient.conf
14a12
15a14,21
> send host-name = gethostname();
> request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, domain-search, host-name,
dhcp6.name-servers, dhcp6.domain-search, dhcp6.fqdn, dhcp6.sntp-servers,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers;
28a35
33a41
47,75d54
< send host-name "raspberrypi"; # added by NetworkManager
< option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;
< option ms-classless-static-routes code 249 = array of unsigned integer 8;
< option wpad code 252 = string;
< request; # override dhclient defaults
< also request subnet-mask;
< also request broadcast-address;
< also request time-offset;
< also request routers;
< also request domain-name;
< also request domain-name-servers;
< also request domain-search;
< also request host-name;
< also request dhcp6.name-servers;
< also request dhcp6.domain-search;
< also request dhcp6.fqdn;
< also request dhcp6.sntp-servers;
< also request netbios-name-servers;
< also request netbios-scope;
< also request interface-mtu;
< also request rfc3442-classless-static-routes;
< also request ntp-servers;
< also request ms-classless-static-routes;
< also request static-routes;
< also request wpad;
< also request root-path;
<


<参考>

・NetworkManager.conf
< https://developer-old.gnome.org/NetworkManager/stable/NetworkManager.conf.html > 2022年2月7日

・NetworkManager
< https://wiki.archlinux.jp/index.php/NetworkManager > 2022年2月7日

・LinuxでDHCPについて勉強してみた
< https://qiita.com/toshihirock/items/fbb9c74e63eab3a6c9a1 > 2022年2月7日

・Adding a static IP to a DHCP-enabled NetworkManager connection
< https://www.szakmeister.net/blog/2017/jun/1/static-ip-nmcli/ >2022年2月6日



「Network Managerなしでdhclientを動作させる場合」

・Raspberry Pi(Debian)でdhclientを使う
< https://qiita.com/kmorimoto/items/e76047be70dd64c08a1e > 2022年2月7日

・corvax19/dhclient.service
< https://gist.github.com/corvax19/6230283 > 2022年2月7日

投げ銭

★当サイトへの投げ銭(PayPal)★

Ad

Ad