
前言BusyBox 是一款遵循 GPL 协议的自由开源应用程序。它将众多常用的 Unix 工具进行精简并集中整合于单一的可执行文件中从而极大地节省了存储空间。该软件具备出色的跨平台兼容性可运行于多种遵循 POSIX 标准的操作系统之上不仅包括 Linux及其衍生系统 Android也支持 Hurd、FreeBSD 等系统。由于 BusyBox 的可执行文件体积非常小巧它特别适用于存储和资源受限的嵌入式系统。正因为兼具“小巧”与“全能”的特性其作者形象地将其誉为“嵌入式 Linux 的瑞士军刀”。简单一点就是将一些常用的小工具都集成到BusyBox中同时可以通过自定义指定需要哪些工具然后编译BusyBox等到单一的可执行文件——工具。然后将这个工具放到根文件系统当中补全整个根文件系统。常见的工具如ls、cp、cat、echo、mount、ps等都可以通过 BusyBox 提供。由于它的高度集成和紧凑性BusyBox 被广泛应用于嵌入式设备、路由器、智能手机、Docker 容器等场景。特性BusyBox (瑞士军刀)根文件系统 (工具箱)本质一个软件/可执行文件一个目录结构和文件集合作用提供各种Linux命令的精简实现提供系统启动和运行所需的全部文件组成一个名为busybox的单一文件包含/bin,/etc,/dev,/lib等目录关系是根文件系统中最关键的一个组成部分是存放包括BusyBox在内的所有系统文件的“容器”参考链接如有侵权请联系删除BusyBox - 维基百科自由的百科全书无所不能的BusyBox如何用它打造极小的Linux环境 | Jast blog04_使用busybox制作根文件系统_哔哩哔哩_bilibili【搞linux的旺仔】【根文件系统的构建】busybox构建最简根文件系统_哔哩哔哩_bilibili一、下载busyboxmirror/busybox: BusyBox mirror下载需要的版本为了演示下载的是1.36.1二、配置并编译busybox2.1 声明工具链前缀export CROSS_COMPILE/home/zky/ProjectsHub/Linux_Projects/pingdichan/riscv64-wangzai-linux-gnu-gcc/bin/riscv64-unknown-linux-gnu-或者将其工具链写入makefile2.2 make menuconfig配置要编译的工具后保存后编译make进入设置最好勾选上编译成静态库链接的日志可忽略kyzky-virtual-machine:~/ProjectsHub/Linux_Projects/pingdichan/busybox$ export CROSS_COMPILE/home/zky/ProjectsHub/Linux_Projects/pingdichan/riscv64-wangzai-linux-gnu-gcc/bin/riscv64-unknown-linux-gnu- zkyzky-virtual-machine:~/ProjectsHub/Linux_Projects/pingdichan/busybox$ make -j11 CC applets/applets.o LD applets/built-in.o LD archival/built-in.o CC archival/ar.o CC archival/bbunzip.o CC archival/bzip2.o LD console-tools/built-in.o CC archival/chksum_and_xwrite_tar_header.o CC console-tools/clear.o CC console-tools/reset.o CC archival/cpio.o LD archival/libarchive/built-in.o CC archival/libarchive/common.o CC console-tools/resize.o CC archival/gzip.o LD coreutils/built-in.o CC coreutils/basename.o CC archival/libarchive/data_align.o CC archival/libarchive/data_extract_all.o LD coreutils/libcoreutils/built-in.o CC coreutils/cat.o CC coreutils/libcoreutils/cp_mv_stat.o CC archival/libarchive/data_extract_to_command.o CC archival/libarchive/data_extract_to_stdout.o CC coreutils/libcoreutils/getopt_mk_fifo_nod.o AR console-tools/lib.a CC archival/lzop.o LD debianutils/built-in.o CC debianutils/pipe_progress.o CC archival/libarchive/data_skip.o CC debianutils/run_parts.o CC coreutils/chgrp.o CC archival/libarchive/decompress_bunzip2.o CC debianutils/which.o CC archival/rpm.o AR coreutils/libcoreutils/lib.a CC archival/tar.o LD klibc-utils/built-in.o CC archival/unzip.o CC klibc-utils/resume.o CC coreutils/chmod.o CC coreutils/chown.o AR debianutils/lib.a CC archival/libarchive/decompress_gunzip.o AR klibc-utils/lib.a CC archival/libarchive/decompress_uncompress.o CC coreutils/chroot.o CC coreutils/cksum.o CC coreutils/comm.o CC archival/libarchive/decompress_unlzma.o LD e2fsprogs/built-in.o CC e2fsprogs/chattr.o CC e2fsprogs/e2fs_lib.o CC archival/libarchive/decompress_unxz.o CC archival/libarchive/filter_accept_all.o CC coreutils/cp.o CC coreutils/cut.o LD editors/built-in.o CC editors/awk.o LD findutils/built-in.o CC findutils/find.o CC archival/libarchive/filter_accept_list.o CC coreutils/dd.o AR e2fsprogs/lib.a CC coreutils/df.o CC findutils/grep.o CC archival/libarchive/filter_accept_reject_list.o LD init/built-in.o CC init/halt.o CC coreutils/dirname.o LD libbb/built-in.o CC libbb/appletlib.o LD libpwdgrp/built-in.o CC libpwdgrp/pwd_grp.o CC findutils/xargs.o AR archival/lib.a AR init/lib.a CC coreutils/dos2unix.o CC archival/libarchive/find_list_entry.o LD loginutils/built-in.o CC loginutils/addgroup.o LD mailutils/built-in.o AR mailutils/lib.a CC loginutils/cryptpw.o CC libpwdgrp/uidgid_get.o CC coreutils/du.o CC libbb/ask_confirmation.o CC archival/libarchive/get_header_ar.o CC loginutils/deluser.o CC editors/cmp.o CC archival/libarchive/get_header_cpio.o AR libpwdgrp/lib.a AR findutils/lib.a CC libbb/auto_string.o CC coreutils/echo.o LD miscutils/built-in.o CC coreutils/env.o CC miscutils/ascii.o CC libbb/bb_askpass.o CC coreutils/expand.o LD modutils/built-in.o AR modutils/lib.a CC miscutils/bc.o AR loginutils/lib.a CC coreutils/expr.o CC coreutils/factor.o CC miscutils/crontab.o CC archival/libarchive/get_header_tar.o CC miscutils/hexedit.o CC coreutils/false.o CC libbb/bb_bswap_64.o CC editors/diff.o CC miscutils/i2c_tools.o CC miscutils/less.o LD networking/built-in.o CC networking/dnsd.o CC libbb/bb_cat.o CC editors/ed.o CC archival/libarchive/header_list.o CC libbb/bb_do_delay.o miscutils/i2c_tools.c: In function list_i2c_busses_and_exit: miscutils/i2c_tools.c:1152:32: warning: %s directive output may be truncated writing up to 255 bytes into a region of size 236 [-Wformat-truncation] snprintf(path, NAME_MAX, %s/%s/name, ^~ miscutils/i2c_tools.c:1152:3: note: snprintf output between 25 and 280 bytes into a destination of size 255 snprintf(path, NAME_MAX, %s/%s/name, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ i2cdev_path, de-d_name); ~~~~~~~~~~~~~~~~~~~~~~~~ miscutils/i2c_tools.c:1157:10: warning: %s directive output may be truncated writing up to 255 bytes into a region of size 236 [-Wformat-truncation] %s/%s/device/name, ^~ miscutils/i2c_tools.c:1156:4: note: snprintf output between 32 and 287 bytes into a destination of size 255 snprintf(path, NAME_MAX, ^~~~~~~~~~~~~~~~~~~~~~~~ %s/%s/device/name, ~~~~~~~~~~~~~~~~~~~~ i2cdev_path, de-d_name); ~~~~~~~~~~~~~~~~~~~~~~~~ miscutils/i2c_tools.c:1165:10: warning: %s directive output may be truncated writing up to 255 bytes into a region of size 236 [-Wformat-truncation] %s/%s/device/name, ^~ miscutils/i2c_tools.c:1164:4: note: snprintf output between 32 and 287 bytes into a destination of size 255 snprintf(path, NAME_MAX, ^~~~~~~~~~~~~~~~~~~~~~~~ %s/%s/device/name, ~~~~~~~~~~~~~~~~~~~~ i2cdev_path, de-d_name); ~~~~~~~~~~~~~~~~~~~~~~~~ miscutils/i2c_tools.c:1177:12: warning: %s directive output may be truncated writing up to 255 bytes into a region of size 236 [-Wformat-truncation] %s/%s/device/%s/name, ^~ miscutils/i2c_tools.c:1176:6: note: snprintf output between 33 and 543 bytes into a destination of size 255 snprintf(path, NAME_MAX, ^~~~~~~~~~~~~~~~~~~~~~~~ %s/%s/device/%s/name, ~~~~~~~~~~~~~~~~~~~~~~~ i2cdev_path, de-d_name, ~~~~~~~~~~~~~~~~~~~~~~~~ subde-d_name); ~~~~~~~~~~~~~~ CC coreutils/fold.o CC archival/libarchive/header_skip.o CC networking/ftpd.o CC libbb/bb_getgroups.o LD networking/libiproute/built-in.o CC networking/libiproute/ip_parse_common_args.o CC archival/libarchive/header_verbose_list.o CC coreutils/head.o CC libbb/bb_getsockname.o CC networking/libiproute/ipneigh.o CC archival/libarchive/init_handle.o CC networking/libiproute/libnetlink.o LD networking/udhcp/built-in.o AR networking/udhcp/lib.a CC networking/ftpgetput.o CC coreutils/hostid.o CC libbb/bb_pwd.o CC libbb/bb_qsort.o CC editors/patch.o CC archival/libarchive/lzo1x_1.o CC coreutils/id.o CC libbb/bb_strtonum.o CC miscutils/lsscsi.o CC networking/hostname.o CC networking/libiproute/ll_addr.o CC archival/libarchive/lzo1x_1o.o LD printutils/built-in.o CC printutils/lpr.o CC coreutils/install.o CC miscutils/microcom.o CC networking/httpd.o CC coreutils/link.o CC editors/sed.o CC libbb/capability.o CC networking/libiproute/ll_map.o CC archival/libarchive/lzo1x_d.o CC editors/vi.o AR printutils/lib.a LD procps/built-in.o CC procps/iostat.o CC coreutils/ln.o CC libbb/change_identity.o CC networking/libiproute/ll_proto.o CC networking/ifupdown.o CC networking/libiproute/rt_names.o CC libbb/chomp.o CC archival/libarchive/open_transformer.o CC coreutils/logname.o CC procps/kill.o CC procps/lsof.o CC libbb/common_bufsiz.o CC networking/libiproute/utils.o CC coreutils/ls.o CC libbb/compare_string_array.o CC archival/libarchive/seek_by_jump.o CC procps/mpstat.o CC procps/pgrep.o CC procps/pmap.o CC archival/libarchive/seek_by_read.o CC libbb/concat_path_file.o AR networking/libiproute/lib.a LD runit/built-in.o CC runit/sv.o CC archival/libarchive/unpack_ar_archive.o CC libbb/concat_subpath_file.o CC procps/powertop.o CC networking/ip.o CC miscutils/partprobe.o CC archival/libarchive/unsafe_prefix.o CC archival/libarchive/unsafe_symlink_target.o CC libbb/const_hack.o CC coreutils/md5_sha1_sum.o CC networking/ipcalc.o LD selinux/built-in.o AR selinux/lib.a CC procps/ps.o procps/powertop.c: In function read_cstate_counts: procps/powertop.c:181:20: warning: %s directive writing up to 255 bytes into a region of size 171 [-Wformat-overflow] sprintf(buf, %s/%s/power, /proc/acpi/processor, d-d_name); ^~ procps/powertop.c:181:3: note: sprintf output between 28 and 283 bytes into a destination of size 192 sprintf(buf, %s/%s/power, /proc/acpi/processor, d-d_name); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CC coreutils/mkdir.o AR archival/libarchive/lib.a CC libbb/copy_file.o LD shell/built-in.o CC shell/ash.o CC procps/pstree.o LD sysklogd/built-in.o CC sysklogd/logread.o CC networking/isrv.o CC procps/pwdx.o CC coreutils/mkfifo.o AR runit/lib.a CC procps/smemcap.o LD util-linux/built-in.o CC util-linux/blkdiscard.o CC networking/isrv_identd.o CC libbb/copyfd.o CC coreutils/mktemp.o CC sysklogd/syslogd_and_logger.o CC util-linux/cal.o CC procps/sysctl.o LD util-linux/volume_id/built-in.o CC util-linux/volume_id/bcache.o CC libbb/correct_password.o CC networking/nc.o CC libbb/crc32.o CC coreutils/mv.o CC networking/parse_pasv_epsv.o CC util-linux/volume_id/erofs.o CC miscutils/seedrng.o CC libbb/default_error_retval.o CC util-linux/chrt.o CC procps/watch.o CC coreutils/nice.o CC libbb/device_open.o CC networking/pscan.o CC miscutils/setfattr.o CC libbb/dump.o CC util-linux/volume_id/exfat.o AR sysklogd/lib.a CC coreutils/nl.o CC shell/ash_ptr_hack.o CC util-linux/fallocate.o AR procps/lib.a CC networking/ssl_client.o CC miscutils/setserial.o CC util-linux/volume_id/f2fs.o CC coreutils/nohup.o CC libbb/duration.o CC util-linux/fatattr.o CC coreutils/nproc.o CC networking/telnet.o CC util-linux/volume_id/get_devname.o CC networking/telnetd.o CC coreutils/od.o CC shell/math.o CC util-linux/flock.o AR editors/lib.a CC util-linux/fsfreeze.o CC util-linux/volume_id/minix.o CC miscutils/strings.o CC coreutils/paste.o CC libbb/endofname.o CC shell/shell_common.o CC util-linux/volume_id/nilfs.o CC util-linux/fstrim.o CC miscutils/tree.o CC libbb/executable.o CC util-linux/getopt.o CC miscutils/ts.o CC coreutils/printenv.o CC miscutils/ttysize.o CC util-linux/hexdump.o CC util-linux/volume_id/ubifs.o AR networking/lib.a CC libbb/fclose_nonstdin.o CC util-linux/volume_id/util.o CC coreutils/printf.o CC coreutils/pwd.o CC libbb/fflush_stdout_and_exit.o CC miscutils/ubi_tools.o CC util-linux/volume_id/volume_id.o CC util-linux/hexdump_xxd.o CC coreutils/readlink.o CC util-linux/lspci.o CC libbb/fgets_str.o CC coreutils/realpath.o CC libbb/find_mount_point.o CC miscutils/ubirename.o AR util-linux/volume_id/lib.a CC miscutils/volname.o CC libbb/find_pid_by_name.o CC util-linux/lsusb.o CC coreutils/rm.o CC libbb/find_root_device.o CC coreutils/rmdir.o CC coreutils/seq.o CC libbb/full_write.o CC util-linux/mkfs_ext2.o CC coreutils/shred.o CC util-linux/mkfs_vfat.o AR miscutils/lib.a CC util-linux/more.o CC coreutils/shuf.o CC coreutils/sleep.o CC util-linux/nsenter.o CC libbb/get_console.o CC libbb/get_cpu_count.o CC libbb/get_last_path_component.o CC util-linux/readprofile.o CC libbb/get_line_from_file.o CC coreutils/sort.o CC libbb/get_shell_name.o CC libbb/get_volsize.o CC coreutils/split.o CC coreutils/sum.o CC util-linux/renice.o CC util-linux/rev.o CC coreutils/sync.o CC libbb/getopt32.o CC libbb/getopt_allopts.o CC util-linux/scriptreplay.o CC coreutils/tail.o CC libbb/getpty.o CC coreutils/tee.o CC util-linux/setarch.o CC libbb/hash_md5_sha.o AS libbb/hash_md5_sha256_x86-32_shaNI.o CC coreutils/test.o CC util-linux/setpriv.o AS libbb/hash_md5_sha256_x86-64_shaNI.o AS libbb/hash_md5_sha_x86-32_shaNI.o AS libbb/hash_md5_sha_x86-64.o CC util-linux/setsid.o AS libbb/hash_md5_sha_x86-64_shaNI.o CC coreutils/test_ptr_hack.o CC util-linux/swaponoff.o CC libbb/herror_msg.o CC util-linux/switch_root.o CC libbb/human_readable.o CC coreutils/timeout.o CC coreutils/touch.o CC libbb/inet_common.o CC util-linux/uevent.o CC libbb/inode_hash.o CC coreutils/tr.o CC util-linux/unshare.o CC libbb/isdirectory.o CC coreutils/true.o CC libbb/isqrt.o CC libbb/iterate_on_dir.o CC coreutils/truncate.o CC coreutils/tsort.o CC coreutils/tty.o CC libbb/kernel_version.o CC coreutils/uname.o CC libbb/last_char_is.o CC coreutils/uniq.o AR util-linux/lib.a CC libbb/lineedit.o CC libbb/lineedit_ptr_hack.o CC libbb/llist.o CC libbb/login.o CC coreutils/unlink.o CC libbb/make_directory.o CC libbb/makedev.o CC coreutils/usleep.o CC libbb/messages.o CC coreutils/uudecode.o CC coreutils/uuencode.o CC libbb/missing_syscalls.o CC coreutils/wc.o CC coreutils/whoami.o CC libbb/mode_string.o CC coreutils/yes.o CC libbb/nuke_str.o CC libbb/parse_config.o CC libbb/parse_mode.o CC libbb/percent_decode.o CC libbb/perror_msg.o CC libbb/perror_nomsg.o CC libbb/perror_nomsg_and_die.o CC libbb/pidfile.o CC libbb/platform.o AR coreutils/lib.a CC libbb/print_flags.o CC libbb/print_numbered_lines.o CC libbb/printable.o CC libbb/printable_string.o CC libbb/process_escape_sequence.o CC libbb/procps.o CC libbb/progress.o CC libbb/ptr_to_globals.o CC libbb/pw_encrypt.o CC libbb/read.o CC libbb/read_key.o CC libbb/read_printf.o CC libbb/recursive_action.o CC libbb/remove_file.o CC libbb/replace.o CC libbb/run_shell.o CC libbb/safe_gethostname.o CC libbb/safe_poll.o CC libbb/safe_strncpy.o CC libbb/safe_write.o CC libbb/securetty.o CC libbb/setup_environment.o CC libbb/signals.o CC libbb/simplify_path.o CC libbb/single_argv.o CC libbb/skip_whitespace.o CC libbb/str_tolower.o CC libbb/speed_table.o CC libbb/strrstr.o CC libbb/sysconf.o CC libbb/time.o CC libbb/trim.o CC libbb/u_signal_names.o CC libbb/ubi.o CC libbb/udp_io.o CC libbb/unicode.o CC libbb/update_passwd.o CC libbb/uuencode.o CC libbb/verror_msg.o CC libbb/vfork_daemon_rexec.o CC libbb/warn_ignoring_args.o CC libbb/wfopen.o CC libbb/wfopen_input.o CC libbb/write.o CC libbb/xatonum.o CC libbb/xconnect.o CC libbb/xfunc_die.o AR shell/lib.a CC libbb/xfuncs.o CC libbb/xfuncs_printf.o CC libbb/xgetcwd.o CC libbb/xgethostbyname.o CC libbb/xreadlink.o CC libbb/xrealloc_vector.o CC libbb/xregcomp.o AR libbb/lib.a LINK busybox_unstripped Static linking against glibc, cant use --gc-sections Trying libraries: crypt m rt Library crypt is needed, cant exclude it (yet) Library m is needed, cant exclude it (yet) Library rt is not needed, excluding it Library crypt is needed, cant exclude it (yet) Library m is needed, cant exclude it (yet) Final link with: crypt m zkyzky-virtual-machine:~/ProjectsHub/Linux_Projects/pingdichan/busybox$2.3 make install 默认安装到的是busybox下的_install或者make CONFIG_PREFIX./tmp install千万不要安装到系统的根目录可能会崩2.4 查看配置file ./_install/bin/busybox./_install/bin/busybox: ELF 64-bit LSB executable, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), statically linked, for GNU/Linux 4.15.0, stripped2.5 如果是动态编译的可以使用ldd可以查看该工具依赖哪个库# 查看这个工具链依赖的库路径有哪些 echo void main(){} | riscv64-unknown-linux-gnu-gcc -E -v -/home/zky/ProjectsHub/Linux_Projects/pingdichan/riscv64-wangzai-linux-gnu-gcc/bin/riscv64-unknown-linux-gnu-readelf -d /bin/busybox2.6 后续就是补充完整制作启动脚本复制内核和设备树复制库创建设备节点制作镜像文件完善文件系统等等