YoctoLinuxで64bit RaspberryPi環境を構築し、k3sを使用する(3)

ソフトウェアを追加したくなった場合に、いちいちイメージを作成し、入れ替えて初期設定を繰り返すのは面倒くさいので、パッケージ管理機能によって、ソフトウェアを追加出来る環境を準備します。

# ソフトウェアを追加する

## 追加するソフトウェア

ログを収集するために、rsyslogを今までに作成した環境(conf/local.conf)に追加します。

### 環境準備

1. conf/local.confに追加

    「rsyslog」をイメージに追加

    ```conf
    IMAGE_INSTALL_append = " rsyslog"
    ```

1. ビルド

    core-image-baseを作成  

    ```bash
    $ bitbake core-image-base
    ```

## リポジトリを構成してパッケージ管理

最初の段階でパッケージマネージャDNFを組み込んでいるので、これに対応したリポジトリの構築を行います。  
構築自体については以下を参考にさせていただきました。  
[Qiita Yoctoでdnfを使う方法](https://qiita.com/watatuki/items/4c3447a96309e19e7d5c)  
これもDockerイメージで準備し、NAS上で行える様にします。  

### docker-image作成

1. Dockerfile

    「nginx」と「createrepo」が必要なので、これを取り込む。

    ```docker:dockerfile
    FROM 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](https://hub.docker.com/_/nginx)を参考に記載。  
    ADDで追加するファイルを準備する。

    ```conf:default
    server {
        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関連のオプションを追加。  

1. docker image 作成

    ```bash
    $ docker build -t repo-nginx:001 .
    ```

1. docker image 起動確認

    ```bash
    $ docker run --rm --name yocto-repo-nginx -d -p 9080:80 repo-nginx:001
    ```

    --rmオプションはイメージ終了時に終了したコンテナを自動で削除されます。
    `http://<ホストのIP>:9080/`にブラウザでアクセスし、nginxのWelcomeページが表示される事を確認。

1. docker image 再度起動

    ```bash
    $ 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ファイルを公開場所にマウント。

## リポジトリ作成

1. docker image 内でリポジトリの構成

    以下コマンドで起動中のdockerイメージに入る。

    ```bash
    $ docker exec -it yocto-repo-nginx /bin/bash
    ```

    docker内で以下コマンドにてリポジトリを作成。  

    ```bash
    # 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/`にブラウザでアクセスし、ファイルが存在する事を確認。

## リポジトリ使用(クライアント)

1. クライアント(raspberry pi)の設定

    dnf設定ファイルを作成する。

    ```bash
    $ 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の後継ソフトなので問題ない。

1. ソフトウェア(rsyslog)のインストール

    以下のコマンドを実行

    ```bash
    $ 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をアンインストールする。

    ```bash
    $ sudo dnf remove busybox-syslog
    ・・・
    Freed space: 1.5 k
    Is this ok [y/N]: y
    ・・・
    ```

    インストールを実施、依存するパッケージもインストールされる。

    ```bash
    $ 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転送する設定を行う。

    ```bash
    $ 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を再起動する。

    ```bash
    $ sudo systemctl daemon-reload
    $ sudo systemctl restart rsyslog
    ```

    サーバー側にログが届いている事を確認する。