ソフトウェアを追加したくなった場合に、いちいちイメージを作成し、入れ替えて初期設定を繰り返すのは面倒くさいので、パッケージ管理機能によって、ソフトウェアを追加出来る環境を準備します。
ソフトウェアを追加する
追加するソフトウェア
ログを収集するために、rsyslogを今までに作成した環境(conf/local.conf)に追加します。
環境準備
-
conf/local.confに追加
「rsyslog」をイメージに追加
IMAGE_INSTALL_append = " rsyslog"
-
ビルド
core-image-baseを作成
$ bitbake core-image-base
リポジトリを構成してパッケージ管理
最初の段階でパッケージマネージャDNFを組み込んでいるので、これに対応したリポジトリの構築を行います。
構築自体については以下を参考にさせていただきました。
Qiita Yoctoでdnfを使う方法
これもDockerイメージで準備し、NAS上で行える様にします。
docker-image作成
-
Dockerfile
「nginx」と「createrepo」が必要なので、これを取り込む。
dockerfileFROM ubuntu:18.04 ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && apt-get dist-upgrade -y && apt-get autoremove --purge -y \ && apt-get install -y nginx createrepo \ && rm -rf /var/lib/apt/lists/* # forward request and error logs to docker log collector RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log ADD ./default /etc/nginx/sites-enabled/ EXPOSE 80 STOPSIGNAL SIGTERM CMD ["nginx", "-g", "daemon off;"]
なお、コマンドなどはDockerHUBのNginx Docker Official Imagesを参考に記載。
ADDで追加するファイルを準備する。defaultserver { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; autoindex on; # ディレクトリを見せる autoindex_exact_size off; # ファイルサイズを見せる autoindex_localtime on; # タイムスタンプを見せる location / { try_files $uri $uri/ =404; } }
ファイル自体はubuntuのnginxにデフォルトで搭載されているファイルからコメントを削除したものがベース。
autoindex関連のオプションを追加。 -
docker image 作成
$ docker build -t repo-nginx:001 .
-
docker image 起動確認
$ docker run --rm --name yocto-repo-nginx -d -p 9080:80 repo-nginx:001
--rmオプションはイメージ終了時に終了したコンテナを自動で削除されます。
http://<ホストのIP>:9080/
にブラウザでアクセスし、nginxのWelcomeページが表示される事を確認。 -
docker image 再度起動
$ docker stop yocto-repo-nginx $ docker run --name yocto-repo-nginx -d --restart=always -p 9080:80 -v [tmp/deploy/rpm]:/var/www/html repo-nginx:001
--restart=alwaysは何らかの原因でdockerが終了した場合に自動で再起動する設定。
-vオプションで、作成したrpmファイルを公開場所にマウント。
リポジトリ作成
-
docker image 内でリポジトリの構成
以下コマンドで起動中のdockerイメージに入る。
$ docker exec -it yocto-repo-nginx /bin/bash
docker内で以下コマンドにてリポジトリを作成。
# cd /var/www/html # createrepo . Spawning worker 0 with 3601 pkgs Spawning worker 1 with 3600 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete
http://<ホストのIP>:9080/
にブラウザでアクセスし、ファイルが存在する事を確認。
リポジトリ使用(クライアント)
-
クライアント(raspberry pi)の設定
dnf設定ファイルを作成する。
$ sudo mkdir /etc/yum.repos.d $ sudo vi /etc/yum.repos.d/yocto.repo [yocto] baseurl=http://<ホストのIP>:9080/ gpgcheck=0
ローカルネットワーク内で構成しているので、リポジトリの検証用のgpgkeyを無効にしている。
「yum」とはいっているが、dnfはyumの後継ソフトなので問題ない。 -
ソフトウェア(rsyslog)のインストール
以下のコマンドを実行
$ sudo dnf makecache Repository 'yocto' is missing name in configuration, using id. yocto 483 kB/s | 1.9 MB 00:03 Last metadata expiration check: 0:00:07 ago on Fri Apr 3 00:51:42 2020. Metadata cache created. $ sudo dnf update Repository 'yocto' is missing name in configuration, using id. Last metadata expiration check: 0:00:23 ago on Fri Apr 3 00:51:42 2020. Dependencies resolved. Nothing to do. Complete!
rsyslogはbusybox-syslogと競合するので、busybox-syslogをアンインストールする。
$ sudo dnf remove busybox-syslog ・・・ Freed space: 1.5 k Is this ok [y/N]: y ・・・
インストールを実施、依存するパッケージもインストールされる。
$ sudo dnf install rsyslog ・・・ ================================================================================ Package Architecture Version Repository Size ================================================================================ Installing: rsyslog aarch64 8.1910.0-r0 yocto 363 k Installing dependencies: libestr0 aarch64 0.1.11-r0 yocto 11 k libfastjson4 aarch64 0.99.8-r0 yocto 23 k librelp0 aarch64 1.4.0-r0 yocto 40 k logrotate aarch64 3.15.1-r0 yocto 37 k Transaction Summary ================================================================================ Install 5 Packages Total download size: 474 k Installed size: 1.4 M Is this ok [y/N]: y ・・・
自動でsystemdのデーモンとして設定、起動される。
転送設定を行う。
boot.log以外の/var/log/*への記録をすべて無効化し、syslogサーバーにUDP転送する設定を行う。$ sudo vi /etc/rsyslog.conf #auth,authpriv.* /var/log/auth.log #*.*;auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log ・・・ # Save boot messages also to boot.log local7.* /var/log/boot.log ・・・ *.* @remote-host:514 #*.* @@remote-host:514 #TCPの場合
rsyslogを再起動する。
$ sudo systemctl daemon-reload $ sudo systemctl restart rsyslog
サーバー側にログが届いている事を確認する。