根文件系统制作过程
Posted 四季帆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根文件系统制作过程相关的知识,希望对你有一定的参考价值。
1. 顶层Makefile中有根文件系统目标
$(ROOTFS): $(ROOTFSDIR) #生成ROOTFS之前需要生成依赖ROOTFSDIR
#使用脚本rootfsimg.sh来生成根文件系统的image
$(HIDE)$(shell $(LITEOSTOPDIR)/tools/scripts/make_rootfs/rootfsimg.sh $(ROOTFS_DIR) $(FSTYPE) ${ROOTFS_SIZE})
$(HIDE)cd $(ROOTFS_DIR)/.. && zip -r $(ROOTFS_ZIP) $(ROOTFS)
ifneq ($(OUT), $(LITEOS_TARGET_DIR))
$(HIDE)mv $(ROOTFS_DIR) $(LITEOS_TARGET_DIR)rootfs
endif
$(ROOTFSDIR): prepare $(APPS) #生成ROOTFSDIR之前需要生成依赖prepare和$(APPS)
$(HIDE)$(MAKE) clean -C apps
$(HIDE)$(shell $(LITEOSTOPDIR)/tools/scripts/make_rootfs/rootfsdir.sh $(OUT)/bin $(OUT)/musl $(ROOTFS_DIR))
ifneq ($(VERSION),)
$(HIDE)$(shell $(LITEOSTOPDIR)/tools/scripts/make_rootfs/releaseinfo.sh "$(VERSION)" $(ROOTFS_DIR))
endif
prepare: #拷贝一些动态库和标准库
$(HIDE)mkdir -p $(OUT)/musl
ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
$(HIDE)cp -f $(LITEOSTOPDIR)/../../prebuilts/lite/sysroot/usr/lib/$(LLVM_TARGET)/a7_softfp_neon-vfpv4/libc.so $(OUT)/musl
$(HIDE)cp -f $(LITEOS_COMPILER_PATH)/lib/$(LLVM_TARGET)/c++/a7_softfp_neon-vfpv4/libc++.so $(OUT)/musl
else
$(HIDE)cp -f $(LITEOS_COMPILER_PATH)/target/usr/lib/libc.so $(OUT)/musl
$(HIDE)cp -f $(LITEOS_COMPILER_PATH)/arm-linux-musleabi/lib/libstdc++.so.6 $(OUT)/musl
$(HIDE)cp -f $(LITEOS_COMPILER_PATH)/arm-linux-musleabi/lib/libgcc_s.so.1 $(OUT)/musl
$(STRIP) $(OUT)/musl/*
endif
$(APPS): $(LITEOS_TARGET)
$(HIDE)$(MAKE) -C apps all #进入apps目录并编译目标all
2. 制作根文件系统的脚本(rootfsimg.sh)
set -e
system=$(uname -s)
ROOTFS_DIR=$1
FSTYPE=$2
ROOTFS_SIZE=$3
ROOTFS_IMG=${ROOTFS_DIR}".img"
#Linux下使用mkfs.jffs2工具制作根文件系统
JFFS2_TOOL=$(dirname $(readlink -f "$0"))/../../fsimage/mkfs.jffs2
#Windows下使用mkfs.jffs2.exe工具制作根文件系统
WIN_JFFS2_TOOL=$(dirname $(readlink -f "$0"))/../../fsimage/win-x86/mkfs.jffs2.exe
if [ "${ROOTFS_DIR}" = "*rootfs" ]; then
chmod -R 755 ${ROOTFS_DIR} #添加权限
chmod 700 ${ROOTFS_DIR}/bin/init 2> /dev/null
chmod 700 ${ROOTFS_DIR}/bin/shell 2> /dev/null
fi
if [ "${FSTYPE}" = "jffs2" ]; then
if [ "${system}" != "Linux" ] ; then
${WIN_JFFS2_TOOL} -q -o ${ROOTFS_IMG} -d ${ROOTFS_DIR} --pagesize=4096
else
chmod +x ${JFFS2_TOOL}
echo ${JFFS2_TOOL} -q -o ${ROOTFS_IMG} -d ${ROOTFS_DIR} --pagesize=4096 --pad=${ROOTFS_SIZE}
${JFFS2_TOOL} -q -o ${ROOTFS_IMG} -d ${ROOTFS_DIR} --pagesize=4096 --pad=${ROOTFS_SIZE}
cp ${ROOTFS_IMG} ${ROOTFS_DIR}".jffs2"
cp ${ROOTFS_IMG} ${ROOTFS_DIR}".jffs2.bin"
fi
elif [ "${FSTYPE}" = "vfat" ]; then
if [ "${system}" != "Linux" ] ; then
echo "Unsupported fs type!"
else
BLK_SIZE=512
CLT_SIZE=2048
FAT_TAB_NUM=2
CLT_CNT=$(( ${CLT_SIZE} / ${BLK_SIZE} ))
if [ $# -eq 3 ]; then
IMG_SIZE=$3
else
FAT32_ITEM_SIZE=4
RESV_CNT=38
IMG_MIN_SIZE=1048576
DIR_SIZE=$(( $(echo $(du -s ${ROOTFS_DIR} | awk '{print $1}')) * 1024 ))
IMG_SIZE=$(( ${DIR_SIZE} / (1 - ${FAT_TAB_NUM} * ${FAT32_ITEM_SIZE} / ${CLT_SIZE}) + ${RESV_CNT} * ${BLK_SIZE}))
if [ ${IMG_SIZE} -le ${IMG_MIN_SIZE} ]; then
IMG_SIZE=${IMG_MIN_SIZE}
fi
fi
IMG_CNT=$(( (${IMG_SIZE} + ${BLK_SIZE} - 1) / ${BLK_SIZE} ))
echo mtools_skip_check=1 >> ~/.mtoolsrc
dd if=/dev/zero of=${ROOTFS_IMG} count=${IMG_CNT} bs=${BLK_SIZE}
mkfs.vfat ${ROOTFS_IMG} -s ${CLT_CNT} -f ${FAT_TAB_NUM} -S ${BLK_SIZE} > /dev/null
mcopy -i ${ROOTFS_IMG} ${ROOTFS_DIR}/* -/ ::/
fi
else
echo "Unsupported fs type!"
fi
以上是关于根文件系统制作过程的主要内容,如果未能解决你的问题,请参考以下文章
[架构之路-30]:目标系统 - 系统软件 - Linux OS根文件系统rootfs的概念组成制作以及用busybox制作根文件系统