Tina_Linux系統裁剪開發指南1 概述2 Tina系統裁剪簡介2.1 boot0裁剪2.2 uboot裁剪2.3 內核裁剪2.3.1 刪除不使用的功能2.3.2 刪除不使用的驅動2.3.3 修改內核源代碼2.3.3.1 size工具.2.3.3.2 ksize.py腳本2.3.3.3 nm命令2.3.3.4 kernel壓縮方式.2.4 文件系統裁剪.2.4.1 應用程序及冗余文件裁剪2.4.2 庫的裁剪2.4.2.1 C庫的選擇.2.4.2.2 刪除沒用到的庫2.4.3 應用程序與庫strip2.4.4 文件系統壓縮.3 參考資料
Tina_Linux系統裁剪開發指南
1 概述
編寫目的:
嵌入式產品往往為了壓縮成本而使用較小的flash存儲器,因此可能需要對系統進行裁剪來減少對flash的占用。系統經過裁剪過后,通常也會提升啟動速度以及減少內存占用。 本文介紹TinaLinux中系統裁剪的方法,為有裁剪需求的使用者提供參考。
2 Tina系統裁剪簡介
Tina固件中通常包含boot0、uboot、kernel、rootfs等鏡像。基于經驗,各個鏡像尺寸的量級如下表所示:
表2-1:各鏡像尺寸的量級
鏡像 | 大小 |
---|---|
boot0 | < 100K |
uboot | < 1M |
kernel | >= 3M,< 15M |
rootfs | >= 4M |
可以看到boot0、uboot、kernel、rootfs的尺寸是依次增大的。對于大尺寸的裁剪效果往往比小尺寸的裁剪效果明顯,比如rootfs裁剪1M可能很容易,對于uboot來說,則非常困難。
因此,后續主要介紹kernel以及rootfs的裁剪。
2.1 boot0裁剪
由于boot0很小,通常來說boot0代碼也不開源,因此略過。
2.2 uboot裁剪
目前tina環境中有不同版本的uboot,分別存在兩個不同的文件路徑中,以實際sdk的目錄為準,cboot可以進入到相應的uoot目錄,這兩個路徑分別為lichee/brandy/u-boot或者lichee/brandy-2.0/u-boot
主要有下面兩種裁剪思路:
修改uboot配置文件,刪減不需要的配置。uboot配置文件通常位于源碼下include/configs/${CHIP}.h或者configs/${CHIP}*defconfig。
刪除不需要的uboot命令。
2.3 內核裁剪
通常關于Linux內核裁剪主要有如下方法:
刪除不使用的功能。如符號表、打印、調試等功能。
刪除不使用的驅動。
修改內核源代碼。
內核壓縮。
2.3.1 刪除不使用的功能
下表中列出了一些內核選項,包含選項的描述,默認值以及推薦值(減小內核鏡像尺寸)。
表2-2:內核選項及描述
CONFIG option | Description | Def | Small |
---|---|---|---|
CORE_SMALL | tune some kernel data sizes | N | Y |
NET_SMALL | tune some net-related data sizes | N | Y |
KMALLOC_ACCOUNTING | turn on kmalloc accounting | N | Y * |
AUDIT_BOOTMEM | print out all bootmem allocations | N | Y * |
DEPRECATE_INLINES | cause compiler to emit info about inlines | N | Y * |
PRINTK | printk code and message data | Y | N |
BUG | allow elimination of BUG code | Y | N |
ELF_CORE | allow disabling of ELF core dumps | Y | N |
PROC_KCORE | allow disabling of /proc/kcore | Y | N |
AIO allow | disabling of async IO syscalls | Y | N |
XATTR allow | disabling of xattr syscalls | Y | N |
FILE_LOCKING | allow disabling of file locking syscalls | Y | N |
DIRECTIO | allow disabling of direct IO support | Y | N |
MAX_SWAPFILES_SHIFT | number of swapfiles | 5 | 0 |
NR_LDISCS | number of tty line disciplines | 16 | 2 |
MAX_USER_RT_PRIO | number of RT priority levels | 100 | 5 |
KALLSYMS | load all symbols for debugging/kksymoops | Y | N |
SHMEM | allow disabling of shmem filesystem | Y | N + |
SWAP | support for a swap segment | Y | N |
SYSV_IPC | support for System V IPC | Y | N + |
POSIX_MQUEUE | POSIX message queue support | Y | N + |
SYSCTL | allow disabling of sysctl support | Y | N + |
LOG_BUF_SHIFT | control size of kernel printk buffer | 14 | 11 |
CC_OPTIMIZE_FOR_SIZE | Use gcc -os to optimize for size | Y | Y |
MODULES | allow support for kernel loadable modules | Y | N + |
KMOD | automatic kernel module loading | Y | N |
PCI | allow support for PCI bus and devices | Y | Y - |
XIP_KERNEL | allow support for kernel Execute-in-Place | N | N |
BLK_DEV_LOOP | support for loopback block device | Y | Y - |
BLK_DEV_RAM | block devices for RAM filesystems | Y | Y - |
IOSCHED_AS | Include Anticipatory IO scheduler | Y | Y |
IOSCHED_DEADLINE | Include Deadline IO scheduler | Y | N + |
IOSCHED_CFQ | Include CFQ IO scheduler | Y | N + |
IP_PNP | support for IP autoconfiguration | Y | N + |
IP_PNP_DHCP | support for IP autoconfiguration via DHCP | Y | N + |
IDE | support for IDE devices | Y | N + |
SCSI | support for SCSI devices | Y | N + |
其中:
"Y *"-表示開發的時候設置成Y,發布的時候可以設置成N。
"N +"-表示基于應用需要來判斷是否設置成N。
"Y -"-表示可能需要,可以設置N嘗試一下。
在Tina中,集成了CONFIG_REDUCE_KERNEL_SIZE宏。一旦使能該宏后,將會采用部分上面的裁剪措施來減小kernel鏡像尺寸,主要思路是關閉與log/debug等相關的配置,然后對kernel進行xz壓縮,可參考tina/scripts/reduce-kernel-size.sh。
執行make menuconfig,開啟如下選項:
Tina Configuration Target Images ---> [*] downsize the kernel size (EXPERIMENTAL)
說明:此功能當前是 EXPERIMENTAL 的。建議直接執行 make kernel_menuconfig ,然后按照上述表格來配置。
2.3.2 刪除不使用的驅動
方案明確之后,所需的內核驅動也明確了。可以執行make kernel_menuconfig,將沒有用到的驅動關閉。
2.3.3 修改內核源代碼
內核源碼龐大,直接修改往往難度很大,可借助相關工具來評估模塊以及符號的大小,然后進行針對性的裁剪。
2.3.3.1 size工具.
size命令可查看內核鏡像的text、data、bss等段的大小。如執行"size vmlinux",將會得到:
text data bss dec hex filename
5818117 1378944 168972 7366033 706591 vmlinux
2.3.3.2 ksize.py腳本
在tina/lichee/linux-4.9/scripts目錄下有一個ksize腳本,可以對內核目錄下的built-in.o進行解析,并將解析的內容按照尺寸進行排序,顯示出來。執行結果如下所示:
Linux Kernel total | text data bss
--------------------------------------------------------------------------------
vmlinux
7366033
|
5818117
1378944
168972
--------------------------------------------------------------------------------
drivers/built-in.o
2244823
|
2080782
123885
40156
net/built-in.o
1682005
|
1630911
32590
18504
fs/built-in.o
975830
|
950780
5442
19608
kernel/built-in.o
678363
|
593347
41064
43952
mm/built-in.o
302442
|
272965
7309
22168
sound/built-in.o
237890
|
227338
6836
3716
security/built-in.o
170272
|
145055
13989
11228
block/built-in.o
149110
|
145408
2458
1244
crypto/built-in.o
145972
|
131610
7258
7104
lib/built-in.o
141721
|
141093
559
69
init/built-in.o
33551
|
18558
14909
84
ipc/built-in.o
29998
|
29218
772
8
usr/built-in.o
138
|
138
0
0
--------------------------------------------------------------------------------
sum
6792115
|
6367203
257071
167841
delta
573918
|
-549086
1121873
1131
drivers total | text data bss
--------------------------------------------------------------------------------
drivers/built-in.o
2244823
|
2080782
123885
40156
--------------------------------------------------------------------------------
drivers/usb/built-in.o
448756
|
409279
27813
11664
drivers/block/built-in.o
357202
|
324752
21582
10868
drivers/tty/built-in.o
174213
|
155371
13938
4904
drivers/base/built-in.o
157961
|
153861
3460
640
drivers/mmc/built-in.o
133678
|
131782
1756
140
drivers/scsi/built-in.o
105021
|
95105
9348
568
drivers/md/built-in.o
100909
|
98382
1291
1236
drivers/mtd/built-in.o
96023
|
92244
1467
2312
drivers/hid/built-in.o
86072
|
81552
4160
360
drivers/clk/built-in.o
69737
|
58289
10856
592
drivers/cpufreq/built-in.o
51525
|
44400
1793
5332
drivers/pinctrl/built-in.o
50463
|
46458
3921
84
drivers/input/built-in.o
45250
|
44046
1156
48
drivers/i2c/built-in.o
43511
|
42791
656
64
drivers/spi/built-in.o
39888
|
38323
1557
8
drivers/thermal/built-in.o
38654
|
36673
1893
88
drivers/regulator/built-in.o
36217
|
35257
820
140
drivers/of/built-in.o
35994
|
35095
407
492
drivers/gpio/built-in.o
29432
|
29167
224
41
drivers/leds/built-in.o
25548
|
25076
464
8
drivers/rtc/built-in.o
25072
|
24428
460
184
drivers/tee/built-in.o
24823
|
24662
113
48
drivers/char/built-in.o
23718
|
21642
1224
852
drivers/soc/built-in.o
20916
|
13980
6804
132
drivers/bluetooth/built-in.o
20223
|
19319
100
804
drivers/dma/built-in.o
17892
|
17458
334
100
drivers/irqchip/built-in.o
14767
|
12371
2308
88
drivers/pwm/built-in.o
14636
|
14036
472
128
drivers/dma-buf/built-in.o
13975
|
13904
23
48
drivers/cpuidle/built-in.o
12613
|
10848
1749
16
drivers/watchdog/built-in.o
9986
|
9660
281
45
drivers/power/built-in.o
9836
|
8296
1224
316
drivers/clocksource/built-in.o
9608
|
8708
796
104
drivers/misc/built-in.o
8471
|
8105
340
26
drivers/bus/built-in.o
6357
|
5691
618
48
drivers/hwmon/built-in.o
5230
|
5054
144
32
drivers/hwspinlock/built-in.o
4792
|
4664
128
0
drivers/firmware/built-in.o
4453
|
4384
9
60
drivers/reset/built-in.o
3818
|
3686
132
0
drivers/net/built-in.o
1803
|
1755
48
0
drivers/mfd/built-in.o
1623
|
1511
108
4
drivers/video/built-in.o
379
|
379
0
0
--------------------------------------------------------------------------------
sum
2381045
|
2212444
125977
42624
delta
-136222
|
-131662
-2092
-2468
net total | text data bss
--------------------------------------------------------------------------------
net/built-in.o
1682005
|
1630911
32590
18504
--------------------------------------------------------------------------------
net/ipv4/built-in.o
428233
|
401161
14719
12353
net/mac80211/built-in.o
302085
|
301822
259
4
net/core/built-in.o
267334
|
256693
8573
2068
net/bluetooth/built-in.o
227913
|
226708
1033
172
net/wireless/built-in.o
160236
|
158651
557
1028
net/xfrm/built-in.o
74537
|
72737
1384
416
net/bridge/built-in.o
59936
|
58812
1112
12
net/sched/built-in.o
29706
|
28344
1346
16
net/packet/built-in.o
26453
|
26172
281
0
net/netlink/built-in.o
26105
|
25498
455
152
net/unix/built-in.o
24671
|
22266
340
2065
net/key/built-in.o
21095
|
20783
308
4
net/*.o
16279
|
15811
412
56
net/8021q/built-in.o
15245
|
14981
264
0
net/ipv6/built-in.o
9445
|
8295
1136
14
net/rfkill/built-in.o
7142
|
6710
408
24
net/ethernet/built-in.o
2431
|
2391
40
0
net/llc/built-in.o
2068
|
1980
72
16
net/802/built-in.o
1944
|
1792
140
12
--------------------------------------------------------------------------------
sum
1702858
|
1651607
32839
18412
delta
-20853
|
-20696
-249
92
fs total | text data bss
--------------------------------------------------------------------------------
fs/built-in.o
975830
|
950780
5442
19608
--------------------------------------------------------------------------------
fs/*.o
351665
|
339511
1774
10380
fs/ext4/built-in.o
295807
|
294110
1125
572
fs/jffs2/built-in.o
99642
|
99446
124
72
fs/proc/built-in.o
77696
|
73111
377
4208
fs/fat/built-in.o
49264
|
49088
144
32
fs/jbd2/built-in.o
47379
|
47254
65
60
fs/overlayfs/built-in.o
24939
|
24842
93
4
fs/squashfs/built-in.o
23156
|
23092
60
4
fs/kernfs/built-in.o
21086
|
16863
111
4112
fs/configfs/built-in.o
18193
|
17916
261
16
fs/debugfs/built-in.o
16120
|
16056
52
12
fs/pstore/built-in.o
13904
|
13531
325
48
fs/crypto/built-in.o
13083
|
12799
264
20
fs/notify/built-in.o
12525
|
12186
227
112
fs/nls/built-in.o
11024
|
10904
116
4
fs/sysfs/built-in.o
7041
|
6990
39
12
fs/devpts/built-in.o
3359
|
2986
365
8
fs/ramfs/built-in.o
1820
|
1776
40
4
--------------------------------------------------------------------------------
sum
1087703
|
1062461
5562
19680
delta
-111873
|
-111681
-120
-72
kernel total | text data bss
--------------------------------------------------------------------------------
kernel/built-in.o
678363
|
593347
41064
43952
--------------------------------------------------------------------------------
kernel/*.o
376931
|
346029
17531
13371
kernel/sched/built-in.o
127386
|
119841
6265
1280
kernel/time/built-in.o
101386
|
89633
7465
4288
kernel/printk/built-in.o
55033
|
18477
8444
28112
kernel/irq/built-in.o
47323
|
44325
906
2092
kernel/rcu/built-in.o
29815
|
27655
2131
29
kernel/locking/built-in.o
25617
|
25592
21
4
kernel/power/built-in.o
16652
|
15256
848
548
kernel/bpf/built-in.o
8348
|
7988
68
292
--------------------------------------------------------------------------------
sum
788491
|
694796
43679
50016
delta
-110128
|
-101449
-2615
-6064
sound total | text data bss
--------------------------------------------------------------------------------
sound/built-in.o
237890
|
227338
6836
3716
--------------------------------------------------------------------------------
sound/soc/built-in.o
125556
|
119220
5416
920
sound/core/built-in.o
108923
|
104799
1400
2724
sound/*.o
6612
|
6440
28
144
--------------------------------------------------------------------------------
sum
241091
|
230459
6844
3788
delta
-3201
|
-3121
-8
-72
security total | text data bss
--------------------------------------------------------------------------------
security/built-in.o
170272
|
145055
13989
11228
--------------------------------------------------------------------------------
security/selinux/built-in.o
142606
|
119156
12250
11200
security/keys/built-in.o
31690
|
30618
788
284
security/*.o
25826
|
24091
1719
16
security/integrity/built-in.o
1838
|
1806
20
12
--------------------------------------------------------------------------------
sum
201960
|
175671
14777
11512
delta
-31688
|
-30616
-788
-284
block total | text data bss
--------------------------------------------------------------------------------
block/built-in.o
149110
|
145408
2458
1244
--------------------------------------------------------------------------------
block/*.o
145968
|
142021
2699
1248
block/partitions/built-in.o
7563
|
7543
16
4
--------------------------------------------------------------------------------
sum
153531
|
149564
2715
1252
delta
-4421
|
-4156
-257
-8
lib total | text data bss
--------------------------------------------------------------------------------
lib/built-in.o
141721
|
141093
559
69
--------------------------------------------------------------------------------
lib/*.o
216133
|
214935
1092
106
lib/zlib_inflate/built-in.o
11187
|
11187
0
0
lib/xz/built-in.o
8215
|
8179
36
0
lib/lzo/built-in.o
2551
|
2551
0
0
lib/lz4/built-in.o
1188
|
1188
0
0
--------------------------------------------------------------------------------
sum
239274
|
238040
1128
106
delta
-97553
|
-96947
-569
-37
可以對各個模塊的代碼段數據段的統計信息進行確認,對占用空間大的進行針對性優化。
2.3.3.3 nm命令
nm命令可查看內核模塊中各個符號的尺寸。如執行"nm --size -r vmlinux | head -10",可得到:
00004000 b __log_buf
00003e58 D nand_tbl
00003b14 T __blockdev_direct_IO
0000398c T hidinput_connect
00002f6c t ext4_fill_super
000027fc T hci_event_packet
0000245c t l2cap_recv_frame
000023d4 T dev_ethtool
00002274 t test_atomics
000020e4 t nl80211_send_wiphy
說明,一共有三列數據,分別表示大小、符號類型、符號名。其中符號類型:
b/B -符號位于bss段。
t/T -符號位于text段。
d/D -符號位于data段。
如果某些函數或者全局變量占用較大,可以進行針對性的優化。
2.3.3.4 kernel壓縮方式.
tina環境提供了幾種壓縮格式方式,選擇方式為make kernel_menuconfig:
General setup --->
Kernel compression mode (Gzip) --->
(X) Gzip
( ) LZMA
( ) XZ
( ) LZO
( ) LZ
同一個kernel鏡像使用不同的壓縮方式,鏡像大小如下表所示:
壓縮方式 | 鏡像大小 | 加載內核時間(從falsh加載到dram的時間) | 解壓時間 | 總時間 |
---|---|---|---|---|
GZIP | 2.31M | 124ms | 89ms | 213ms |
LZO | 2.53M | 136ms | 23ms | 159ms |
LZ4 | 2.68M | 143ms | 27ms | 170ms |
XZ | 1.95M | 104ms | 667ms | 771ms |
2.4 文件系統裁剪.
對于文件系統裁剪來說,主要思路是刪、換、壓。
刪。刪除不需要的內容。如幫助文檔、沒用到的庫、調試程序等。
換。使用小尺寸的實現替換大尺寸的實現。如使用musl libc庫替換glibc庫等。
壓。使用合適的壓縮算法。
2.4.1 應用程序及冗余文件裁剪
在不影響整體功能的情況下,一些應用程序或冗余文件往往可以刪除:
調試工具。比如tcpdump、mpstat、strace等等。
性能測試工具。比如lmbench、sysstat、tiobench等等。
冗余文件。幫助文檔、輔助程序、配置文件和數據模塊等,又比如很多應用有相同的共能,只留其一。
采用具有通用功能的替代軟件包。Linux上有許多具有相似功能的軟件包,可以選擇其中占存儲空間較小的軟件包并移植到嵌入式設備上。
資源文件。一些音視頻以及UI資源往往占用很大空間,如果沒有用到,也需要刪除。
2.4.2 庫的裁剪
關于庫的裁剪主要有兩個思路:
使用較小的C庫,如musl libc,uclibc等來替換glibc。
刪除沒有用到的庫。
2.4.2.1 C庫的選擇.
下表列出了當前一些通用的C庫及其特征。
表2-4:常用C庫及其特征
C庫 | 環境 | 大小 | 優點 | 缺點 |
---|---|---|---|---|
glibc | Distribution | 大 | 強大穩定,支持最多的cpu架構 | 占用空間大 |
uclibc | Embedded | 小 | 為嵌入式設計,可配置性好 | 不支持libdb與libnss |
bionic | Android | 小 | 提供了Android特性的函數 | 不提供libthread_db/libm |
musl | Embedded | 小 | 更小,高效靜態鏈接,穩定 | 支持較少的cpu arch |
當前Tina環境下可支持glibc與musl libc兩種C庫。具體可通過menuconfig的方式來配置
使用哪一套。
[*] Advanced configuration options (for developers) --->
Select external toolchain C library (Use glibc) --->
注意,更換C庫后,需要清除方案編譯產物(可執行make distclean),重新編譯。
2.4.2.2 刪除沒用到的庫
嵌入式產品通常應用程序有限,因此可能存在很多庫不會被用到,可以進行刪除。
當前Tina環境提供了一種刪除方法,執行make menuconfig,打開如下選項:
Tina Configuration
Target Images --->
[*] downsize the root filesystem or initramfs
打開之后,在生成rootfs/initramfs之前會對其中沒有用到的庫進行刪除。
具體可參考scripts/reduce-rootfs-size.sh文件,其主要思路是:
分析rootfs下的應用程序所依賴的庫。
分析“應用程序依賴庫”所依賴的庫,一直遞歸下去,直到完全找出所有依賴的庫。
根據上述查找結果,刪除沒有被依賴的庫。
說明:此方法有一定的限制:
當前只分析/lib,/usr/lib下的庫,其他目錄不會處理。
對于部分使用dlopen的應用程序,解析庫可能會出現問題。
2.4.3 應用程序與庫strip
strip會去掉應用程序與庫的符號信息和調試信息,大大減少空間占用。
當前Tina環境下默認開啟了strip功能,如果沒開啟,請確保開啟以減少空間占用。
Tina Configuration
Global build settings --->
Binary stripping method (strip) --->
說明:Tina 上還支持 sstrip ,即 super strip ,相對于 strip 來說,更能減少應用與庫的大小。
2.4.4 文件系統壓縮.
有些文件系統支持壓縮,有些不支持。下表列出了常見的文件系統類型:
表2-5:常用文件系統類型
FS | 使用 | 壓縮 | 讀寫 | 備 注 |
---|---|---|---|---|
ext2 | block device | 無 | RW | 突然斷電或當機時可能導致數據丟失 |
ext3 | block device | 無 | RW | 向前兼容ext3,日志式文件系統,非常成熟穩定 |
ext4 | block device | 無 | RW | 向前兼容ext2和ext3,擴展存儲限制,提升性能 |
btrfs | block device | 有 | RW | 著重于容錯、修復及易管理 |
FAT | block device | 無 | RW | Windows,長期使用速度變慢,不支持>4G文件 |
NTFS | block device | 有 | RW | Windows,基于FAT做若干改進,日志文件系統 |
Cramfs | NAND Flash | 無 | RO | 2013停用,使用Squashfs |
Squashfs | Raw Flash | 有 | RO | 壓縮度更高,沒有大小限制 |
UBIFS | Raw Flash | 有 | RW | 基于JFFS2,Linux3.7之后 |
JFFS2 | Raw Flash | 有 | RW | mount時間很慢,讀寫性能不好 |
YAFFS2 | NAND Flash | 無 | RW | 沒有透明壓縮,不在Linux主線 |
當前Tina環境下比較常用的是squahfs、ext4、jfss2三種文件系統。具體可執行makemenu-
config進行選擇:
Tina Configuration
Target Images --->
*** Root filesystem images ***
[ ] ext4 ----
[ ] jffs
[*] squashfs --->
常見的壓縮有lzop,gzip,xz等,壓縮率最高的是xz。但是xz壓縮解壓最慢,非常影響啟動速度。實際在選擇壓縮方式時應綜合考慮。
審核編輯黃宇
-
嵌入式
+關注
關注
5082文章
19126瀏覽量
305244 -
Linux
+關注
關注
87文章
11304瀏覽量
209523 -
系統
+關注
關注
1文章
1017瀏覽量
21347
發布評論請先 登錄
相關推薦
評論