2021/6/26

Loading "BriskMenuFactory::BriskMenu" Failed

這個 ubuntu window manage (名子忘了),開機有時會出現 Error:
The panel encountered a problem while loading "BriskMenuFactory::BraskMenu".
有時候重開機就好,有時候會不行。

google 的結果,說暫時沒有解,在 20.10 也有一樣的問題。
遇到的時候,就 logout 再 login 一次就可以了。
-- 真神奇

2021/6/22

Try overlayfs in embeddes system.

copy initrd.img-5.4.83-v7+-overlay 出來,rename img.gz, unpack 後,
mkdir out && cd out
cpio -idv < ../initrd.img

ref: 這一篇的方法好像不需要 用到 initramfs,只需要在真正 init 起來之前做就可以。
修改 kernel boot cmd,init=/myinit
然後myinit 就啟動 /bin/sh

進入後,測試 command:
mkdir : OK
mount / /rom : OK
mount -o remount,ro /rom : fail, 說沒有 /proc/mounts

所以 myinit 要加上
mount -t proc none /proc
之後 remount OK

最後是
exec chroot /rom /linuxrc
這樣就可以了。
要測試就把上面改成
/bin/sh
就會開進 shell 測試在這時候的 command 有沒有用。

mount --move 是變更 mount 位置,這樣就不用 unmount 之後再 mount

成功! final version ( /overlay folder must be created in first):
#!/bin/sh

mount -t proc none /proc
mount -t tmpfs none /overlay

mkdir /overlay/lower
mkdir /overlay/upper
mkdir /overlay/worker
mkdir /overlay/newroot

mount / /overlay/lower
mount -o remount,ro /overlay/lower

mount -t overlay overlay -olowerdir=/overlay/lower,upperdir=/overlay/upper,workdir=/overlay/worker /overlay/newroot

exec chroot /overlay/newroot /linuxrc
測試...開機後,在 / create abc, ls to see if exist.
reboot, see abc disappear

用 mount 看:
overlay on / type overlay (rw,relatime,lowerdir=/overlay/lower,upperdir=/overlay/upper,workdir=/overlay/worker)
大概是成功了。

2021/6/16

overlay fs

用 pi 來測試功能一下,google 說 pi 的 raspi-config 就有 overlay fs 功能,給 kisok 用。

新 raspios 開啟console uart好像不用 dtoverlay disable_bt 了。
ref: uart configuration

改用 enable_uart=1
就會顯示了。(2021-1-11 的 image)
console 開到一半(通常是 usb hub init 後,就會變成亂碼...最後查到是 micro-usb power 線材的問題。
換上沒有 core 的線材就 OK 了。

用 raspi-config 開啟 overlay 功能,然後 read-only root 回答 Yes。
重開機後, / 就是 overlay 了:
mount:
overlay on / type overlay (rw,noatime,lowerdir=/lower,upperdir=/upper/data,workdir=/upper/work)
boot cmd:
$ cat /proc/cmdline 
coherent_pool=1M 8250.nr_uarts=1 snd_bcm2835.enable_compat_alsa=0 snd_bcm2835.enable_hdmi=1 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2708_fb.fbswap=1 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000  boot=overlay console=ttyS0,115200 console=tty1 root=PARTUUID=3661545e-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwai
大概是:boot=overlay, root=UARTUUID...,rootfstype=ext4 之類。

raspberry pi 使用 overlayfs 作為 rootfs 可以參考overlayroot,有一堆都是寫 init script,取代 init,開機後重新 mount root。
raspberry pi 的 script 好像是 /etc/initramfs-tools/scripts/overlay

以前 raspi-config 還沒有 overlayfs 選項時,大概是用這一篇:overlay filesystem raspi 來做。
這一篇:easy change on a read only reaspberry pi 也有說明手動更改跟使用 raspi-config 修改的兩種方法。
這一篇 setting up overlay fs on raspberry pi還提供在 power off 時,把 upper layer 寫回 lower layer 的 方法,聲稱這樣可以大大個減少 sd card write 的次數 (增加壽命)

有關 overlayfs 的使用,可以參考play with overlay filesystem
任何兩個 目錄都可以疊成一個 overlay filesystem (目錄)。
以上面 ref 的例子來看。
有 upper, lower 兩個目錄:
charles-chang@beaver:~/test$ tree upper/
upper/
├── dir
│   └── g
├── e
└── f

1 directory, 3 files
charles-chang@beaver:~/test$ tree lower/
lower/
├── a
├── b
├── dir
│   ├── c
│   └── d
└── test
用 mount command 把 upper 疊在 lower 之上,最後成為 'merged' 目錄:
sudo mount -t overlay overlay -olowerdir=./lower,upperdir=./upper,workdir=./work merged
看看 merged 目錄:
tree merged/
merged/
├── a
├── b
├── dir
│   ├── c
│   ├── d
│   └── g
├── e
├── f
└── test
可以看到 upper 跟 lower合併在一起了。
因為 overlayfs 的 lower 是不能更動的,只能藉由 upper 來更動。
所以可以修改 merged 下的 file ,然後去 upper, lower 看看變化。
有一點要注意: lower 的內容在 mount 之後,就不要更動了,否則會有不可預知的問題。


在busybox 1.32.1
enable build static
make && sudo make install

2021/6/15

buildroot -- build system for qemu

buildroot 竟然變得這麼方便,幫你把 kernel 都弄好了。
clone 下來, 選 qemu 的 defconfig 後就 make,然後 kernel, dtb ,rootfs 都build 好,
接下來用 qemu 來 run 就可以。
以 qemu 來 run..

make qemu_arm_vexpress_defconfig
make

qemu-system-arm -M vexpress-a9 -smp 4 -m 1024M -kernel output/images/zImage -append "root=/dev/mmcblk0 console=ttyAMA0 loglevel=8" -dtb output/images/vexpress-v2p-ca9.dtb -sd output/images/rootfs.ext2 -nographic
就可以用 root 登入。


ref:编译运行Linux内核,制作initramfs,并通过qemu+gdb调试
用 qemu 跟 gdb 來 debug kernel:

build kernel and root (initrd):
download kernel source.
make menuconfig (不用改,只是要產生 .config)
make

build tools and shell:
download busybox
make menuconfig ( Build Option -- build static library)
make
sudo make install

create root structure:
.. 先跳過..

ref:深入理解 Linux 2.6 的 initramfs 機制 (上)
kernel 用上面的沒關係,記得 menuconfig 要改好。
做好 hello-initramfs 目錄。
build 好 kernel 的 bzImage
用下面command run..
qemu-system-x86_64 -s -kernel linux-4.9.263/arch/x86_64/boot/bzImage --append "console=ttyS0" -nographic

2021/6/10

好白痴: could not determine kind of name for C.X509_V_ERR_CA_KEY TOO_SMALL

在make go project時出現這個 error:
could not determine kind of name for C.X509_V_ERR_CA_KEY TOO_SMALL 
...
還有一堆 ssl 的 C.X509.
去看source 果然沒有宣告的地方。
但是在另一個 arm64 的機器上make 是 OK 的。
一直以為是 go version 問題(因為這個 project 曾經發生改版後,go version 過舊問題,也是搞很久)
然後 google 這格 error 竟然完全沒有!!
--- 其實這就代表 project 本身沒問題。是你自己的問題。

後來看到重點: C.

所以是 go 參考 C 的部份...
結果是這個 host 沒有安裝 libssl-dev
apt install libssl-dev 後就OK 了。

搞了兩小時....果然是白痴....

2021/6/9

bookmark: build arm natively from x86

買一片 pi4 還是用 vm ?
有 apt 的 distribution build 起來還是比較方便,不用處理 library 問題。
所以...


感覺起來還是在 pi4 上 build 比較快...(NT2000)

2021/6/8

HMW and FCW

Headway Monitor Warning , Forward Collision Warning

兩個很像,都是針對前方車輛的距離,速度做出的告警。
  • Headway Monitor Warning 是判斷安全車距,安全車距和自己的車速有關,自己的車速越快,安全車距就要越大。
  • Forward Collision Warning 是判斷撞上前車的時間,除了車距外,還跟相對速度有關。
兩個都用到和前車的距離,但是一個用自己的車速,一個用相對的車速。
車距用影像可以得到,自己的車速就要用GPS 或是車速線
相對車速就可以用影像得到。

所以兩者需要的 資料還是有一點不一樣。

但是只要做得出 HMW,就能做出 FCW,不做白不做....

2021/6/7

bookmark: bash with restricted command , rbash

project: 是在 build 的時後指定 user 和可以 run 的 command
./makefile.sh -v --init --force --test dummy date ls ssh
                                           |     |
                                           |     List of allowed commands
                                           |
                                        User's login name
m
然後就可以放在 /etc/passwd 中,讓那個 user login 後用那個 為他 build 的 shell

實際上上面的 script 會create user,並且設定 /etc/paswd,然後build 好只能run 限定 command 的 shell,然後 copy 到正確位置。

所以要有 root 權限 (useradd)

--- 要放到 embedded system 可能.....

build and run a small linux system to test busybox command

follow: linux-kernel busybox homemade linux system
大概就是...
  • download kernel source code,enable RAM initrd, 加大 ramdisk size, build bzImage.
  • download busybox, build static, make installl (create _install),然後修改一個 rootfs 的 directory structure. 然後用這個 _install folder 做出 rootfs 的 image
因為都是 native (x86_64),所以沒什麼問題。之後就可以用 qemu 開機了 (assign kernel and initrd file, and append bootcmd)
then..把 bzImage 和 rootfs.img.gz copy 出來.
qemu-system-x86_64 -kernel ./bzImage -initrd ./rootfs.img.gz -nographic -append "console=ttyS0 root=/dev/ram init=/linuxrc"
qemu default 會用 SDL,開啟 graphic console(雖然也是 console),所以要用 -nographic,然後加上 console=ttyS0,讓 console 從 ttyS0 到 command line console.
mount -o rw,remount /dev/root /
touch /etc/passwd
touch /etc/group
adduser charles
這樣,就可以su - charles,測試 root 和 charles (general user) 對 busybox command 的權限。

測試:

以 poweroff 為例,在 /sbin/poweroff,一樣 link 到 /bin/busybox
charles 執行的化,第一個,會找不到 poweroff,因為 path 中沒有 sbin
如果用 /sbin/poweroff:
poweroff: (null): Operation no permitted
但是,用 ip 來測試,一樣在 /sbin/ip。一樣說 not found,但是用 /sbin/ip 來執行,就可以正常執行了。
所以 poweroff 的 permission ,應該是設在 device 端的。
filesystem level 是沒有辦法限制 一般使用者透過 /sbin/ 來執行系統command

所以發現 busybox 這種 link 的方式,沒辦法限制一般 user 執行某些 root 才能執行的 command

mediapipe

安裝就是 git clone,但是 build 要用 bazel,說明是說有三個 option
  1. 使用 distribution 的 package manager 來安裝
  2. 使用 project 內的 setup_opencv.sh 來自動 download and install
  3. 自己參考 opencv 的文件來安裝

看一下 setup_opencv.sh:
會 /tmp/build_opencv download and build opencv 3.4,
OpenCV has been built. You can find the header files and libraries in /usr/local/include/opencv2/ and /usr/local/lib"
然後會 modify project 的相關build script/Makefile,把原來使用 package install path 的位置改道script 安裝的位置。

18.04 的話就是 package manager 安裝就可以。
然後source code 中的 build configuration 都是以 ubuntu 18.04 為準,所以要是其他 (20.04,或是option 2.3),就要修改一堆 .BUILD file 中 opencv, ffmpeg library 單裝 path

上面的,直接用 apt 安裝就可以。

example build tool 是 bazel,安裝用 bazelisk, bazelist 要用 npm 安裝,npm 要 nodejs...
也可以直接 download executable binary bazelisk,baselisk 可以直接當作 bazel 來用 (就名子不一樣)。

其他 package 依照 build hello world 的說明,用 apt 安裝就可以,
另外沒說,build hello world 還要 python, python3 跟 numpy

? install, build hello 後之後,選 python 然後說用 pip 安裝就可以?!
但是我的 python 是 3.7,所以找不到適合的 版本。
-- 只好用 conda create 一個 python=3.8 的環境,然後,conda 就可以安裝了!

用 python run example 很簡單,有些example 放在網頁的 code 是有點 bug,不過很明顯。大家都會改吧。

for python 說明頁面的最後有:building python framework. (這個可以用來 build gpu-support 的版本)

try python,installation 說明的是用 venv:
python3 -m venv mp_env && source mp_env/bin/activate
mediapipe 用 pip 安裝就可以 ...
(mp_env)$ pip install mediapipe
然後要用 python3

就可以用 python example 試試看...
face_detection:
在 venv 環境,run example 的 python code,就可以用 nb 的 webcam show 出結果。

2021/6/4

linux : tcp socket timeout

ref: 就是
 /proc/sys/net/ipv4/tcp_keepalive_time
default 是 7200 (2hrs)。

要自動的話,可以改 /etc/sysctl.conf
新的已經是 /etc/sysctl.d/
下面新增一個你的 mynet.conf
net.ipv4.tcp_keepalive_time=1800
* 注意內容表示和 /proc path 的關係,就是 /proc/sys 之後的 path,用 '.' 來代替。

2021/6/2

mender.io : mender-store 存放 update artifact 的資料

cli/command.go
commonInit( )

其中的 store 好像是放在 link 到 /usr/lib/mender (external) 的 mender-store

store (database) 相關,寫在 store/dbstore.go
裡面可以看到用 github.com/bmatsuo/lmdb-go/lmdb

所以更新紀錄會倍放到這個 db file。
因為這個folder (/usr/lib/mender) 要放到 persistant storage,然後 link 回來。
所以 system update 後,這個 folder 內容不會被變更。

這個 mender-store 用來存很多 data。例如 update 的 artifact version.
一旦有這個資訊,mender -show-artifact 就會用database 存的值,部會用 /etc/mender/artifact_info

更新 mender-store 中,artifact-info 的時機:
download, update 完,reboot 後,mender 會跟mender.io 回報,mender.io 顯示 100% 之後,mender 才會把 artifact-info (new version) 更新到 mender-store
所以update 完 reboot 的話,剛看 artifact 還會是舊的,一直到 mender report 完,才會顯示新的版本。

2021/6/1

mender.io : device 註冊到 正式版 (非 demo server)

機器上的 /etc/mender/mender.conf 中,有 TenantToken=""
把 mender.io 的 Setting -- Orgnizationand Billing 中 "Organization token" copy 貼上。

這樣就會改 register 到 自己的 mender.io 帳號。