2021/1/28

mender.io build and install client from sources


source code 的 Makefile, install :
  • build from source assign prefix=~/mymender
  • make install
  • copy all mymender to /
  • start service
go 版本要 1.13 以上。
如果 dist 的版本太舊。可以用官網的 tar 安裝。

make 前先..
export DESTDIR=/home/pi/inst
make 完,make install
go build -ldflags "-X github.com/mendersoftware/mender/conf.Version=7cb96ca"  
install -m 755 -d /home/pi/inst/usr/bin
install -m 755 mender /home/pi/inst/usr/bin/
install -m 755 -d /home/pi/inst/etc/mender
echo "artifact_name=unknown" > /home/pi/inst/etc/mender/artifact_info
install -m 755 -d /home/pi/inst/usr/share/mender
install -m 755 -d /home/pi/inst/usr/share/dbus-1/system.d
install -m 644 support/dbus/io.mender.AuthenticationManager.conf /home/pi/inst/usr/share/dbus-1/system.d/
install -m 755 -d /home/pi/inst/usr/share/doc/mender-client/examples
install -m 0644 support/demo.crt /home/pi/inst/usr/share/doc/mender-client/examples/
install -m 755 -d /home/pi/inst/usr/share/mender/identity
install -m 755 support/mender-device-identity /home/pi/inst/usr/share/mender/identity/
install -m 755 -d /home/pi/inst/usr/share/mender/inventory
install -m 755 support/mender-inventory-bootloader-integration support/mender-inventory-hostinfo support/mender-inventory-network support/mender-inventory-os support/mender-inventory-provides support/mender-inventory-rootfs-type support/mender-inventory-update-modules /home/pi/inst/usr/share/mender/inventory/
install -m 755 -d /home/pi/inst/usr/share/mender/inventory
install -m 755 support/mender-inventory-geo /home/pi/inst/usr/share/mender/inventory/
install -m 755 -d /home/pi/inst/usr/share/mender/modules/v3
install -m 755 support/modules/deb support/modules/docker support/modules/directory support/modules/single-file support/modules/rpm support/modules/script /home/pi/inst/usr/share/mender/modules/v3/
install -m 755 -d /home/pi/inst/lib/systemd/system
install -m 0644 support/mender-client.service /home/pi/inst/lib/systemd/system/
看一下 inst..
├── etc
│   └── mender
│       └── artifact_info
├── lib
│   └── systemd
│       └── system
│           └── mender-client.service
└── usr
    ├── bin
    │   └── mender
    └── share
        ├── dbus-1
        │   └── system.d
        │       └── io.mender.AuthenticationManager.conf
        ├── doc
        │   └── mender-client
        │       └── examples
        │           └── demo.crt
        └── mender
            ├── identity
            │   └── mender-device-identity
            ├── inventory
            │   ├── mender-inventory-bootloader-integration
            │   ├── mender-inventory-geo
            │   ├── mender-inventory-hostinfo
            │   ├── mender-inventory-network
            │   ├── mender-inventory-os
            │   ├── mender-inventory-provides
            │   ├── mender-inventory-rootfs-type
            │   └── mender-inventory-update-modules
            └── modules
                └── v3
                    ├── deb
                    ├── directory
                    ├── docker
                    ├── rpm
                    ├── script
                    └── single-file

18 directories, 20 files
然後舊可以把 inst 下對應的 folder copy 到系統的 ../
debian 的 /lib 是 link 到 /usr/lib,所以要 copy 到 /usr

然後參考 demo server 的 script,手動:
$ sudo mender setup --device-type "raspberrypi3" --quiet --demo --server-ip 192.168.144.179
生成的 /etc/mender/mender.conf
{
    "ClientProtocol": "https",
    "ArtifactVerifyKey": "",
    "HttpsClient": {
        "Certificate": "",
        "Key": "",
        "SSLEngine": ""
    },
    "Security": {
        "AuthPrivateKey": "",
        "SSLEngine": ""
    },
    "RootfsPartA": "",
    "RootfsPartB": "",
    "DeviceTypeFile": "/var/lib/mender/device_type",
    "DBus": {
        "Enabled": true
    },
    "UpdatePollIntervalSeconds": 5,
    "InventoryPollIntervalSeconds": 5,
    "SkipVerify": false,
    "RetryPollIntervalSeconds": 30,
    "StateScriptTimeoutSeconds": 0,
    "StateScriptRetryTimeoutSeconds": 0,
    "StateScriptRetryIntervalSeconds": 0,
    "ModuleTimeoutSeconds": 0,
    "ServerCertificate": "/usr/share/doc/mender-client/examples/demo.crt",
    "ServerURL": "",
    "UpdateLogPath": "",
    "TenantToken": "",
    "Servers": [
        {
            "ServerURL": "https://docker.mender.io"
        }
    ]
}
然後 /etc/hosts 多了一行:
192.168.144.179 docker.mender.io s3.docker.mender.io
重新開機後...
~ $ sudo systemctl status mender-client
● mender-client.service - Mender OTA update service
   Loaded: loaded (/lib/systemd/system/mender-client.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
所以手動啟動...systemctl start mender-client
之後,在 local 的 mender server 上就可以看到 pending device 了..

同樣的 方法在 ubuntu 上做,結果 fail.. journalctl -r
Jan 29 10:05:16 ubuntu mender[2068]: time="2021-01-29T10:05:16Z" level=error msg="Authorize failed: transient error: authorization request failed: transient error: authorization request failed: Unknown url.Error type: dial tcp 192.168.144.79:443: connect: connection refused"
Jan 29 10:05:16 ubuntu mender[2068]: time="2021-01-29T10:05:16Z" level=error msg="Failure occurred while executing authorization request: Method: Post, URL: https://docker.mender.io/api/devices/v1/authentication/auth_requests"

在 debian 上出現 self-sign error,所以修改一下
~ $ curl -k -X POST https://docker.mender.io/api/devices/v1/authentication/auth_requests
{"error":"failed to decode auth request: unexpected end of JSON input","request_id":"f315ea65-8df2-4f8f-8d8a-67bca6947014"}
所以跟 distribution 有關?

用 nmap 檢查...
pi@raspberrypi:~ $ nmap docker.mender.io
Starting Nmap 7.70 ( https://nmap.org ) at 2021-01-29 10:32 GMT
Nmap scan report for docker.mender.io (192.168.144.179)
Host is up (0.0014s latency).
Not shown: 992 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
111/tcp  open  rpcbind
139/tcp  open  netbios-ssn
443/tcp  open  https
445/tcp  open  microsoft-ds
2049/tcp open  nfs
8084/tcp open  unknown
9000/tcp open  cslistener

Nmap done: 1 IP address (1 host up) scanned in 0.36 seconds

星期一 gateway pc 重開機後,手動build, install 的 rpi3 ubuntu arm64 可以正確註冊到 demo server 上了 (不是 gateway 上的)。
demo server 的 nmap 正確list port 443

所以上面的build, install 程序應該 OK

恢復到 不 enable dbus lzma
make TAGS=nolzma nodbus

實際在 evb 上安裝,發現只需要..
* mender : 執行檔
* demo.crt : cert file
* mender-device-identity : script to get board mac address, name and system property
* artifact_info : info file
* mender-client.service : systemd service config file
安裝完 run mender setup .. 就會產生 mender.conf. 和 修改 /etc/hosts...

mender 會 call 其他 sys tool,所以systemd 的 service conf 要能 access 到 system tool (/bin ?)
所以大概是..
[Unit]
Description=Mender OTA update service
After=network.target

[Service]
Type=idle
User=root
Group=root
#ExecStart=/usr/bin/mender daemon
ExecStart=/bin/bash -c "PATH=/bin: exec /usr/bin/mender daemon"

[Install]
WantedBy=multi-user.target
安裝在 /usr/lib/system/system/ 下的 mender-client.serivce,手動 systemctl start 成功後。就可以用 systemctl enable mender-client 把他設定為系統開機就啟動。
-- 會 create link 到 /etc/systemd/system/multi-usr.targt

沒有留言:

張貼留言