ILD

Raspberry busybox 根文件系统
作者:Herbert Yuan 邮箱:yuanjp@hust.edu.cn
发布时间:2018-6-9 站点:Inside Linux Development

1 只有busybox的rootfs

内核为64位内核,使用64位toolchain编译busybox,将busybox安装到rootfs,并添加/etc/inittab, /etc/init.d/rcS, /etc/fstab 3个文件。


/etc/inittab文件:

1
2
::sysinit:/etc/init.d/rcS
ttyS0::askfirst:-/bin/sh


/etc/init.d/rcS

1
2
3
4
5
6
7
#!/bin/sh
 
mkdir /dev/pts
mount -a
 
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s

mount -a将挂载fstab中指定的文件系统,需要先创建/dev/pts。


/etc/fstab

1
2
3
4
5
none   /tmp       tmpfs      defaults,noatime,nosuid,nodev,mode=1777,size=128M 0 0
none   /run       tmpfs      defaults,noatime,nosuid,nodev,mode=1777,size=16M 0 0
none   /proc      proc       defaults 0 0
none   /dev/pts   devpts         defaults 0 0
none   /sys       sysfs      defaults 0 0

第一列是设备名如/dev/sda1,对于伪文件系统,可以为任意字符串,/dev已经由内核挂载,所以不需要添加下面这行:

1
none   /dev       devtmpfs   defaults 0 0


2 init启动失败分析

1 没有指定init,通过cmdline添加init选项:

1
init=/linuxrc


2 init运行错误,error=-2,猜测是共享库的路径不对,首先使用readelf -l查看Program Headers中INTERP头定义的解释器路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ aarch64-rpi3-linux-gnueabi-readelf -l bin/busybox 
 
Elf file type is EXEC (Executable file)
Entry point 0x407dd0
There are 8 program headers, starting at offset 64
 
Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
                 0x00000000000001c0 0x00000000000001c0  R E    0x8
  INTERP         0x0000000000000200 0x0000000000400200 0x0000000000400200
                 0x000000000000001b 0x000000000000001b  R      0x1
      [Requesting program interpreter: /lib/ld-linux-aarch64.so.1]
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x00000000000e7310 0x00000000000e7310  R E    0x10000
  LOAD           0x00000000000e7de0 0x00000000004f7de0 0x00000000004f7de0
                 0x000000000000105c 0x00000000000017e0  RW     0x10000
  DYNAMIC        0x00000000000e7df8 0x00000000004f7df8 0x00000000004f7df8
                 0x00000000000001e0 0x00000000000001e0  RW     0x8
  NOTE           0x000000000000021c 0x000000000040021c 0x000000000040021c
                 0x0000000000000020 0x0000000000000020  R      0x4
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     0x10
  GNU_RELRO      0x00000000000e7de0 0x00000000004f7de0 0x00000000004f7de0
                 0x0000000000000220 0x0000000000000220  R      0x1
 
 Section to Segment mapping:
  Segment Sections...
   00     
   01     .interp 
   02     .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame 
   03     .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 
   04     .dynamic 
   05     .note.ABI-tag 
   06     
   07     .init_array .fini_array .jcr .dynamic .got

发现路径是/lib/ld-linux-aarch64.so.1,而之前拷贝成/lib64/ld-linux-aarch64.so.1


3 libm.so无此文件,使用readelf -d查看dynamic section中依赖的共享库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ aarch64-rpi3-linux-gnueabi-readelf -d bin/busybox 
 
Dynamic section at offset 0xe7df8 contains 25 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x4065f0
 0x000000000000000d (FINI)               0x4c08cc
 0x0000000000000019 (INIT_ARRAY)         0x4f7de0
 0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x4f7de8
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x0000000000000004 (HASH)               0x400240
 0x0000000000000005 (STRTAB)             0x403160
 0x0000000000000006 (SYMTAB)             0x400c88
 0x000000000000000a (STRSZ)              3291 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x4f7fe8
 0x0000000000000002 (PLTRELSZ)           9072 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x404280
 0x0000000000000007 (RELA)               0x404190
 0x0000000000000008 (RELASZ)             240 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x404150
 0x000000006fffffff (VERNEEDNUM)         2
 0x000000006ffffff0 (VERSYM)             0x403e3c
 0x0000000000000000 (NULL)               0x0

发现依赖libm.so和libc.so,而这两个已经放到了/lib下面,查看toolchain中sysroot相关文件:

1
2
3
4
5
6
7
8
$ ls -l /work/toolchain/aarch64-rpi3-linux-gnueabi/aarch64-rpi3-linux-gnueabi/sysroot/
total 20
dr-xr-xr-x 2 herbert herbert 4096 Mar 29 20:59 etc
dr-xr-xr-x 2 herbert herbert 4096 Mar 29 21:04 lib
lrwxrwxrwx 1 herbert herbert    3 Mar 29 20:52 lib64 -> lib
dr-xr-xr-x 2 herbert herbert 4096 Mar 29 20:59 sbin
dr-xr-xr-x 8 herbert herbert 4096 Mar 29 20:59 usr
dr-xr-xr-x 3 herbert herbert 4096 Mar 29 20:59 var

发现lib64指向lib,怀疑ld只会搜索lib64路径,因此在rootfs中也创建一个lib64指向lib,成功解决问题,init可正常工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[    4.571414] VFS: Mounted root (nfs filesystem) readonly on device 0:15.
[    4.579065] devtmpfs: mounted
[    4.587375] Freeing unused kernel memory: 2688K
 
Please press Enter to activate this console. 
/ # ls -l
total 20
drwxrwxr-x    2 1000     1000          4096 Jun  9  2018 bin
drwxr-xr-x    5 0        0             2600 Jan  1 00:00 dev
drwxrwxr-x    3 1000     1000          4096 Jun  9  2018 etc
drwxrwxr-x    3 1000     1000          4096 Jun  9  2018 lib
lrwxrwxrwx    1 1000     1000             3 Jun  9  2018 lib64 -> lib
lrwxrwxrwx    1 1000     1000            11 Jun  9  2018 linuxrc -> bin/busybox
dr-xr-xr-x   48 0        0                0 Jan  1 00:00 proc
drwxrwxrwt    2 0        0               40 Jan  1 00:00 run
drwxrwxr-x    2 1000     1000          4096 Jun  9  2018 sbin
dr-xr-xr-x   12 0        0                0 Jan  1 00:00 sys
drwxrwxrwt    2 0        0               40 Jan  1 00:00 tmp
drwxrwxr-x    4 1000     1000          4096 Jun  9  2018 usr


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.