From 4c38f08f8a17f6057cf509350194aa8f305cef71 Mon Sep 17 00:00:00 2001 From: superconvert <48017165+superconvert@users.noreply.github.com> Date: Thu, 28 Jul 2022 22:25:05 +0800 Subject: [PATCH] Add files via upload --- 00_build_env.sh | 13 ++++++++ 01_build_src.sh | 83 ++++++++++++++++++++++++++++++++++++++++--------- 02_build_img.sh | 77 +++++++++++++++++++++++++++------------------ cat_img.sh | 13 -------- mk_drv.sh | 36 +++++++++++++++++++++ mk_sdb.sh | 37 ++++++++++++++++++++++ mk_strip.sh | 41 ++++++++++++++++++++++++ 7 files changed, 243 insertions(+), 57 deletions(-) create mode 100644 00_build_env.sh create mode 100644 mk_drv.sh create mode 100644 mk_sdb.sh create mode 100644 mk_strip.sh diff --git a/00_build_env.sh b/00_build_env.sh new file mode 100644 index 0000000..01cfb80 --- /dev/null +++ b/00_build_env.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +rm work/kernel_install/ work/glibc_install/ work/busybox_install/ work/libgcc_install work/binutils_install -rf + +if [ -f "/usr/bin/apt" ]; then + apt -y install gcc g++ make gawk bison libelf-dev bridge-utils qemu-system docker.io +fi + +if [ -f "/usr/bin/yum" ]; then + yum -y install gcc gcc-c++ make gawk bison elfutils-libelf bridge-utils qemu-img qemu-kvm qemu-kvm-tools docker +fi + +echo "Run the next script: 01_build_src.sh" diff --git a/01_build_src.sh b/01_build_src.sh index 9a83d2a..b480fc5 100644 --- a/01_build_src.sh +++ b/01_build_src.sh @@ -1,6 +1,57 @@ #!/bin/sh -SYSROOT=`pwd`"/rootfs" +core_num=`nproc` +kernel_install=`pwd`"/work/kernel_install" +glibc_install=`pwd`"/work/glibc_install" +busybox_install=`pwd`"/work/busybox_install" +libgcc_install=`pwd`"/work/libgcc_install" +binutils_install=`pwd`"/work/binutils_install" + +#----------------------------------------------- +# +# 重新生成目标文件 +# +#----------------------------------------------- +if [ "$1" != "" ]; then + if [ $1 != "rebuild" ]; then + exit + fi + echo "rebuild" + cd work + rm -rf kernel_install glibc_install busybox_install libgcc_install binutils_install + # 编译内核, 最终所有模块都装到目录 /lib/modules/4.14.9 + if [ ! -d "kernel_install" ]; then + mkdir -pv kernel_install && cd linux-4.14.9 + make INSTALL_HDR_PATH=${kernel_install} headers_install -j8 && cp arch/x86_64/boot/bzImage ${kernel_install} && cd .. + fi + + # 编译glibc + if [ ! -d "glibc_install" ]; then + mkdir -pv glibc_install && cd glibc-2.32 + mkdir -pv build && cd build + make install -j8 DESTDIR=${glibc_install} && cd .. && cd .. + fi + + # 编译 busybox + if [ ! -d "busybox_install" ]; then + mkdir -pv busybox_install && cd busybox-1.34.1 + make CONFIG_PREFIX=${busybox_install} install && cd .. + fi + + # 编译 libgcc + if [ ! -d "libgcc_install" ]; then + mkdir -pv libgcc_install && cd gcc-7.5.0 + make install -j8 DESTDIR=${libgcc_install} && cd .. + fi + + # 编译 binutils + if [ ! -d "binutils_install" ]; then + mkdir -pv binutils_install && cd binutils-2.36 + make install -j8 DESTDIR=${binutils_install} && cd .. + fi + cd .. + exit +fi #---------------------------------------------- # @@ -31,6 +82,11 @@ if [ ! -f "gcc-7.5.0.tar.xz" ]; then wget $GCC_SOURCE_URL fi +BINUTILS_SOURCE_URL=https://ftp.gnu.org/gnu/binutils/binutils-2.36.tar.xz +if [ ! -f "binutils-2.36.tar.xz" ]; then + wget $BINUTILS_SOURCE_URL +fi + cd .. #--------------------------------------------- @@ -41,23 +97,28 @@ cd .. mkdir -pv work if [ ! -d "./work/linux-4.14.9" ]; then - tar xvf source/linux-4.14.9.tar.xz -C work/ + echo "unzip kernel source" + tar xf source/linux-4.14.9.tar.xz -C work/ fi if [ ! -d "./work/glibc-2.32" ]; then - tar xvf source/glibc-2.32.tar.bz2 -C work/ + echo "unzip glibc source" + tar xf source/glibc-2.32.tar.bz2 -C work/ fi if [ ! -d "./work/busybox-1.34.1" ]; then - tar xvf source/busybox-1.34.1.tar.bz2 -C work/ + echo "unzip busybox source" + tar xf source/busybox-1.34.1.tar.bz2 -C work/ fi if [ ! -d "./work/gcc-7.5.0" ]; then - tar xvf source/gcc-7.5.0.tar.xz -C work/ + echo "unzip gcc source" + tar xf source/gcc-7.5.0.tar.xz -C work/ fi if [ ! -d "./work/binutils-2.36" ]; then - tar xvf source/binutils-2.36.tar.xz -C work/ + echo "unzip binutils source" + tar xf source/binutils-2.36.tar.xz -C work/ fi #--------------------------------------------- @@ -67,12 +128,6 @@ fi #--------------------------------------------- cd work -kernel_install=`pwd`"/kernel_install" -glibc_install=`pwd`"/glibc_install" -busybox_install=`pwd`"/busybox_install" -libgcc_install=`pwd`"/libgcc_install" -binutils_install=`pwd`"/binutils_install" - # 编译内核, 最终所有模块都装到目录 /lib/modules/4.14.9 if [ ! -d "kernel_install" ]; then mkdir -pv kernel_install && cd linux-4.14.9 && make mrproper @@ -85,7 +140,6 @@ fi # 编译glibc if [ ! -d "glibc_install" ]; then - echo $PATH mkdir -pv glibc_install && cd glibc-2.32 mkdir -pv build && cd build && make distclean ../configure --prefix= \ @@ -102,7 +156,6 @@ if [ ! -d "busybox_install" ]; then # 静态编译 sed -i "s/# CONFIG_STATIC is not set/CONFIG_STATIC=y/g" .config sed -i "s|.*CONFIG_SYSROOT.*|CONFIG_SYSROOT=\"${glibc_install}\"|" .config sed -i "s|.*CONFIG_EXTRA_CFLAGS.*|CONFIG_EXTRA_CFLAGS=\"$CFLAGS -I${kernel_install}/include -I${glibc_install}/include -L${glibc_install}/lib\"|" .config - export PATH=/sbin:/bin:/usr/sbin:/usr/bin make busybox -j8 && make CONFIG_PREFIX=${busybox_install} install && cd .. fi @@ -123,3 +176,5 @@ if [ ! -d "binutils_install" ]; then fi cd .. + +echo "Run the next script: 02_build_img.sh" diff --git a/02_build_img.sh b/02_build_img.sh index e4926ec..daebfc8 100644 --- a/02_build_img.sh +++ b/02_build_img.sh @@ -15,13 +15,28 @@ CYAN='\e[1;36m' WHITE='\e[1;37m' # 白色 NC='\e[0m' # 没有颜色 +# ./02_build_img.sh gcc 这样就能编译带 gcc 的系统 +with_gcc=$1 + +#---------------------------------------------- +# +# 进行目录瘦身 +# +#---------------------------------------------- +./mk_strip.sh + #---------------------------------------------- # # 制作磁盘 # #---------------------------------------------- +echo "${CYAN}--- build disk --- ${NC}" # 创建磁盘 64M -dd if=/dev/zero of=disk.img bs=1M count=256 +if [ ! -n "${with_gcc}" ]; then + dd if=/dev/zero of=disk.img bs=1M count=64 +else + dd if=/dev/zero of=disk.img bs=1M count=512 +fi # 对磁盘进行分区一个主分区 fdisk disk.img << EOF n @@ -31,7 +46,7 @@ p w EOF -echo ".........................................................." +echo "${GREEN}+++ build disk ok +++${NC}" # 磁盘镜像挂载到具体设备 loop_dev=$(losetup -f) @@ -44,7 +59,6 @@ diskfs="diskfs" # 挂载磁盘到本地目录 mkdir -pv ${diskfs} mount -t ext3 ${loop_dev} ${diskfs} - # 安装grub 引导 grub-install --boot-directory=${diskfs}/boot/ --target=i386-pc --modules=part_msdos disk.img @@ -76,13 +90,15 @@ rm -rf rootfs/lib/gconv rm -rf rootfs/bin/* rm -rf rootfs/share rm -rf rootfs/var/db -rm -rf rootfs/include -rm -rf rootfs/lib/ld-linux-x86-64.so.2 -ln -s ../lib rootfs/usr/lib -ln -s ../lib/ld-2.32.so rootfs/lib64/ld-linux-x86-64.so.2 +# 编译的镜像带有 gcc 编译器 +if [ ! -n "${with_gcc}" ]; then + rm -rf rootfs/include +else + echo "${RED} with-gcc tools --- you can build your world${NC}" + cp work/glibc_install/lib/libc_nonshared.a rootfs/lib +fi # 拷贝 busybox 到 rootfs -echo "${CYAN}开始制作rootfs...${NC}" cp work/busybox_install/* rootfs/ -r #----------------------------------------------- @@ -91,6 +107,7 @@ cp work/busybox_install/* rootfs/ -r # #----------------------------------------------- cd rootfs +echo "${CYAN}--- build initrd ---${NC}" # 这种方法也可以 mkinitramfs -k -o ./${diskfs}/boot/initrd 4.14.9 # 利用 Busybox 采用脚本制作 init 脚本 https://blog.csdn.net/embeddedman/article/details/7721926 @@ -128,8 +145,7 @@ EOF # /sbin/init [switch_root 执行] ---> /etc/inittab [定义了启动顺序] ---> # /etc/init.d/rcS [系统 mount, 安装驱动,配置网络] ---> -# /etc/init.d/rc.local [文件配置应用程序需要的环境变量] ---> -# /etc/profile [部分初始化] +# /etc/init.d/rc.local [文件配置应用程序需要的环境变量] ---> /etc/profile [部分初始化] chmod +x init } @@ -158,18 +174,8 @@ tty3::once:echo "hello smart-os tty3" tty3::respawn:/bin/sh EOF -# dns 测试 -# 0. 启动脚本 run_nat.sh -# 1. busybox 必须动态编译 -# 2. ifconfig eth0 192.168.100.6 && ifconfig eth0 up -# 3. route add default gw 192.168.100.1 -# 4. echo "nameserver 114.114.114.114" >> /etc/resolv.conf -# cp -rf ../fixed/lib* lib/ && cp ../fixed/ld-linux-x86-64.so.2 lib64/ -strip -g bin/* sbin/* lib/* - find . | cpio -R root:root -H newc -o | gzip -9 > ../${diskfs}/boot/initrd -echo "${GREEN}rootfs制作成功!!!${NC}" -echo ".........................................................." +echo "${GREEN}+++ build initrd ok +++${NC}" cd .. #-------------------------------------------------------------- @@ -177,11 +183,15 @@ cd .. # 生成磁盘文件系统(利用 busybox 结构,省的自己创建了) # #-------------------------------------------------------------- -echo "${CYAN}开始制作diskfs...${NC}" +echo "${CYAN}--- build diskfs ---${NC}" cp rootfs/* ${diskfs} -r -cp work/libgcc_install/* ${diskfs} -r -cp work/binutils_install/* ${diskfs} -r -rm -rf ${diskfs}/init && rm -rf ${diskfs}/linuxrc && rm -rf ${diskfs}/lost+found +# 带有 gcc 编译器 +if [ "${with_gcc}" ]; then + echo "${RED} with-gcc tools --- you can build your world${NC}" + cp work/libgcc_install/* ${diskfs} -r + cp work/binutils_install/* ${diskfs} -r +fi +rm -rf ${diskfs}/init ${diskfs}/linuxrc ${diskfs}/lost+found ${diskfs}/share # 我们测试驱动, 制作的镜像启动后,我们进入此目录 insmod hello_world.ko 即可 ./make_driver.sh $(pwd)/${diskfs}/lib/modules @@ -198,7 +208,7 @@ menuentry "smart-os" { } EOF -# 生成 rcS 文件 +# 生成 /etc/init.d/rcS 文件 title=$(cat<> /etc/resolv.conf @@ -227,10 +237,17 @@ echo "nameserver 114.114.114.114" >> /etc/resolv.conf # exec 执行 /etc/init.d/rc.local 脚本 EOF chmod +x ${diskfs}/etc/init.d/rcS - -echo "${GREEN}diskfs制作成功!!!${NC}" -echo ".........................................................." +echo "${GREEN}+++ build diskfs ok +++${NC}" # 卸载映射 umount ${loop_dev} losetup -d ${loop_dev} + +#--------------------------------------------------------------- +# +# 查看磁盘内容 +# +#--------------------------------------------------------------- +./cat_img.sh + +echo "Run the next script: 03_run_qemu.sh or 04_run_docker.sh" diff --git a/cat_img.sh b/cat_img.sh index 70834e4..158ac31 100644 --- a/cat_img.sh +++ b/cat_img.sh @@ -7,20 +7,7 @@ losetup -o 1048576 ${loop_dev} disk.img mkdir -p ./mnt1 mount -t ext3 ${loop_dev} ./mnt1 echo "/ ---------------------------------------" -ls ./mnt1/ du ./mnt1 -h -echo "boot ---------------------------------------" -ls ./mnt1/boot -echo "sbin ---------------------------------------" -ls ./mnt1/sbin -echo "etc ---------------------------------------" -ls ./mnt1/etc -echo "dev ---------------------------------------" -ls ./mnt1/dev -echo "lib ---------------------------------------" -ls ./mnt1/lib -echo "lib64 -------------------------------------" -ls ./mnt1/lib64 umount ./mnt1 rm -rf mnt1 losetup -d ${loop_dev} diff --git a/mk_drv.sh b/mk_drv.sh new file mode 100644 index 0000000..f02bef9 --- /dev/null +++ b/mk_drv.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +mkdir -pv driver && cd driver + +cat<hello_world.c +#include +#include +#include + +MODULE_LICENSE("GPL"); + +static int __init hello_world_init(void) +{ + printk(KERN_DEBUG "hello world!!!\n"); + return 0; +} + +static void __exit hello_world_exit(void) +{ + printk(KERN_DEBUG "goodbye world!!!\n"); +} + +module_init(hello_world_init); +module_exit(hello_world_exit); +EOF + +cat<Makefile +obj-m += hello_world.o +all: + make -C ../work/linux-4.14.9 M=`pwd` modules +clean: + make -C ../work/linux-4.14.9 M=`pwd` clean +EOF + +echo $1 +make && mv hello_world.ko $1 && make clean && cd .. && rm -rf driver diff --git a/mk_sdb.sh b/mk_sdb.sh new file mode 100644 index 0000000..85faa25 --- /dev/null +++ b/mk_sdb.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +#---------------------------------------------- +# +# 制作磁盘 +# +#---------------------------------------------- + +echo "${CYAN}开始制作磁盘...${NC}" + +# 创建磁盘 64M +dd if=/dev/zero of=extra.img bs=1M count=64 + +# 对磁盘进行分区一个主分区 +fdisk extra.img << EOF +n +p + + + +w +EOF + +echo "${GREEN}磁盘制作成功!!!${NC}" +echo ".........................................................." + +# 磁盘镜像挂载到具体设备 +loop_dev=$(losetup -f) + +# fdisk -l disk.img 查看 start 为 2048, unit 512 所以 -o 偏移扇区 1048576 = 2048 x 512 +losetup -o 1048576 ${loop_dev} extra.img + +# 对磁盘进行格式化 +mkfs.ext3 ${loop_dev} + +losetup -d ${loop_dev} + diff --git a/mk_strip.sh b/mk_strip.sh new file mode 100644 index 0000000..7f67cd1 --- /dev/null +++ b/mk_strip.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +strip_dir() { + for file in `ls $1` + do + if [ -d $1"/"$file ]; then + strip_dir $1"/"$file + else + if [ -x $1"/"$file ]; then + case "$file" in + *.a);; + *.la);; + *)strip $1"/"$file; continue;; + esac + fi + case "$file" in + *.a) strip -g -S -d $1"/"$file;; + *.so) strip $1"/"$file;; + *.so.*) strip $1"/"$file;; + *);; + esac + fi + done +} + +# strip glibc +rm -rf work/glibc_install/share +strip_dir work/glibc_install + +# strip busybox +strip work/busybox_install/bin/busybox + +# strip gcc +rm -rf work/libgcc_install/share +strip_dir work/libgcc_install + +# strip binutils +rm -rf work/binutils_install/share +rm -rf work/binutils_install/x86_64-pc-linux-gnu +strip_dir work/binutils_install +