Alpine Linux Porting (一点四?)

今天这篇进度比较差,但是也就只能这样继续努力debug。

首先先简介一下原本的进度,是要将initramfs => true rootfs这条路打通,正常来说,Alpine的initramfs希望作的事情是:
(1) 将 apkovl 的overlay透过overlayfs盖上userspace
(2) 然後使用apk-static将基础套件装到rw layer
(3) 紧接着如果有permanant stage的rootdev,才在最後盖上来。

但是对我们的usecase来说,这太复杂了。而且按照Alpine Init的逻辑,他的root会跟kernel parameter冲突,其实这也代表它的预期流程是被kernel直接包套吃走的;为了避免每次都要重包kernel、且反正initramfs我们可以改,不如这样办吧:
直接hack掉permanent rootdev的detection,并且塞一个loopback file进去initramfs当作我们的real rootdev。

可是这样改时,会非常尴尬地遇上一个问题:
那就是Alpine Init是用swtich_root在作iniramfs => rootfs的交棒,而switch_root期待新旧皆为ramfs/tmpfs。

出於无奈,我们再次进行改动 — —
将原本的

exec /bin/busybox pivot_root $sysroot $chart_init "$KOPT_init" $KOPT_init_args

更改为

cd /sysroot
pivot_root . .
exec chroot . /sbin/openrc

然而此时,我们撞到了bus error:

[  165.477801] openrc[82]: unhandled signal 7 code 0x2 at 0x95ad11ac in ld-musl-riscv32-sf.so.1[95ad4000+c7000]
[  165.478835] CPU: 0 PID: 82 Comm: openrc Not tainted 5.10.7 #2
[  165.479261] epc: 95b473dc ra : 95b556e0 sp : 9da494f0
[  165.479607]  gp : 95ad4000 tp : 95b9df28 t0 : 00000002
[  165.479960]  t1 : 0000d1d3 t2 : 00000007 s0 : 9da499a8
[  165.480307]  s1 : 0000d000 a0 : 95ad11ac a1 : 00000000
[  165.480654]  a2 : 00000e54 a3 : 00000fff a4 : fffff000
[  165.481006]  a5 : 00000000 a6 : 00000000 a7 : 000000de
[  165.481355]  s2 : 95ac5000 s3 : 00000000 s4 : 95ac5000
[  165.481695]  s5 : 000000a0 s6 : 00000000 s7 : 00000003
[  165.482210]  s8 : 00000004 s9 : 95b9ca6c s10: 0000d000
[  165.482496]  s11: 9da4955c t3 : 95b9c288 t4 : 00000000
[  165.482757]  t5 : 00000000 t6 : 00000020
[  165.482968] status: 00004020 badaddr: 95ad11ac cause: 0000000f
Bus error

若单纯照字面解读, cause 0xf 代表着(AMO) store error,所以kernel判定是bus error。
但是此时我们还在QEMU上做事,这比较有可能发生的情形是、出於某些原因PC飞到了data segment去,而非真正的bus error。
而initramfs半残的状态下,我们还是先回shell来找找有没有比较小的测试可以看。
在乱try乱看的路上,我们发现了一组有趣的对照:
apk-static可以正常运作,但是apk不行,这个警讯整个让人警铃大响 — — dynamically linked 出bug了。

然而此时遇到了一个我还在想办法workaround掉的debug难点:seperated debug symbol。
在现代化的distro、为了方便distribute套件,会采用「先开启debug build、再objcopy出 debug symbol的elf stub、尔後strip target program」的手法,一般人安装时都是strip过的、尔後需要debug时去安装*-dbg的套件。

想做实验的话,可以这样玩:

riscv32-linux-gcc -g3 -static ./hello_world.c -o hello_world
riscv32-linux-objcopy --only-keep-debug ./hello_world ./hello_world.debug
riscv32-linux-strip --strip-debug --strip-unneeded  ./hello_world
qemu-riscv32 -g 1234 ./hello_world &
riscv32-linux-gdb -ex 'target remote localhost:1234' -ex 'symbol-file ./hello_world.debug'

But,就是这个but,目前我从我bootstrap的musl-dbg套件中捞出来的seperated debug file,是坏的Orz
下篇会来继续debug这个惨况QQ


<<:  Day 0xF - Web ATM 内容?,测试模拟交易回传资讯

>>:  渗透测试进阶篇

The Twelve-Factor App

三十天很快要到了尾声了,今天要来介绍 The Twelve-Factor App(下称 12 Fac...

Day1 学习目标与动机

这学期我加入了学校的实验室,而学长给我们的第一个作业呢,就是要我们去了解到基本网页架构是怎麽形成的,...

.NET Core第4天_middleware是舍麽?

中介软件为组成应用程序管线的软件,用以处理要求与回应, .net core中定义的中介则可以说是用来...

Day2-React Hook 篇-认识 useState

今天我们来认识一个相当常使用的 hook: useState。 语法 const [currentV...

给自己学习30天重新认识css

哈罗大家好,我是黄奇昌 我就读岭东科技大学视觉传达设计系 今年是第一次参加13th铁人赛,想跟大家好...