参考网址链接http://blog.csdn.net/liuyu60305002/article/details/6745526 genext2fs
http://blog.csdn.net/luoqindong/article/details/42737879
创建基于arm的debian文件系统
https://github.com/ZubairLK/mkdebianrfs/blob/master/mkdebianrfs.sh
CI20 制作debian文件系统
首先取得debian的文件系统,这个文件系统的源代码移植没找到,网上大都是下载编译好的二进制文件直接用。debian文件系统分了多个版本,选用比较稳定的wheezy,我的开发板是mips架构的,所以执行步骤如下
- 安装 qemu 和 debootstrap 等工具
sudo apt-get install binfmt-support qemu qemu-user-static debootstrap
debootstrap —- 一个 Debian 提供的工具,可以用来下载生成指定构架的文件系统
选择qeme中的qemu-mipsel-static —- 用于模拟 mips 环境
用 debootstrap 从 debian 源中下载
创建文件夹 fs_debian_wheezy
执行命令
$sudo debootstrap –arch=mipsel –foreign wheezy fs_debian_wheezy http://ftp.uk.debian.org/debian/最后的网址不唯一,可以不写,默认国内代理,不过发现下载的文件系统不全,建议要写上制定网址。
抽取完毕进行第二阶段
因为在宿主是 x86 架构,不能安装 mips 架构的软件。需要依靠 qemu-mipsel-static 来
模拟成 mips环境进行安装。
a.复制 qemu-mipsel-static 到刚构建的基本系统中$ sudo cp /usr/bin/qemu-mipsel-static fs_debian_wheezy/usr/bin
b.用 qemu-mipsel-static 来模拟 mips
$ sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot fs_debian_wheezy debootstrap/debootstrap --second-stage
该命令意思是设置一些环境变量,然后切换根目录到fs_debian_wheezy,执行目录fs_debian_wheezy/debootstrap下的命令: debootstrap –second-stage.
(这点在执行chroot命令的同时回去调用qemu-mipsel-static命令,如果报段错误,可能是下载的qemu有问题,换台电脑下载,跟ubantu的软件源有关)
终端上会最后打印 I: Base system installed successfully.,说明根文件系统就定制成功了。
4、收尾工作
a.切换到 qemu
$sudo chroot fs_debian_wheezy
b.设置软件源头
vi /etc/apt/source.list
deb http://cdn.debian.net/debian wheezy main contrib non-free
deb-src http://cdn.debian.net/debian wheezy main contrib non-free
apt-get update 更新软件
c.为 root 设置密码和创建新用户
#passwd root
debian不能以root用户登陆,所以创建一个普通用户,登陆系统后再切换到root用户
#adduser qq
#passwd qq 设置用户i的密码
d.修改 inittab, 打开串口终端
#cp /usr/share/usr/share/sysvinit/inittab /etc/
#vi /etc/inittab
找到 #T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100,大约在 63 行左右
修改为 T0:23:respawn:/sbin/getty -L ttyPS0 115200 vt100,此处依据自己的实际情况修改
e.退出 qemu 环境
#exit
5、由于我采用的是用烧录工具烧写到nand里的,也可以用SD卡。
所以需要把文件系统压缩成ext2格式。
采用genext2fs 这个命令。
$sudo genext2fs -b 102400 -d rootfs ext2
如果报 could not allocate block (no free space)
这个错误的原因是给的大小了,k单位,上述100M
用du -h rootfs 查看文件大小。
我用的是脚本去制作,必须先安装genext2fs ,脚本mkext2.sh源代码如下
echo $#
#if [ $# != 1 ]; then
# echo "usage: $0 [rootfs_dir] "
# exit
#fi
GENEXT2FS=./genext2fs
OUTPUT=system.img
ROOTFS_DIR=$1
echo $ROOTFS_DIR
rm $OUTPUT
cp $ROOTFS_DIR ./rootfs_system -rf
SYSDIR=./rootfs_system
find $SYSDIR -name .gitkeep | xargs rm
echo $TMPDIR $OUTPUT
rm -fr *.img
num_blocks=`du -sk $SYSDIR | tail -n1 | awk '{print $1;}'`
# add 10%
extra_blocks=`expr $num_blocks / 10`
num_blocks=`expr $num_blocks + $extra_blocks`
#if [ $num_blocks -lt $2 ]; then
# num_blocks=$2
#fi
num_inodes=`find $SYSDIR | wc -l`
# add 10%
extra_inodes=`expr $num_inodes / 20`
num_inodes=`expr $num_inodes + $extra_inodes`
echo $GENEXT2FS" -d "$SYSDIR" -b "$num_blocks" -N "$num_inodes" "$OUTPUT
$GENEXT2FS -d $SYSDIR -b $num_blocks -N $num_inodes $OUTPUT -a
e2fsck -fy $OUTPUT
tune2fs -j $OUTPUT
tune2fs -O extents,uninit_bg,dir_index $OUTPUT
fsck.ext4 -fy $OUTPUT
rm $SYSDIR -rf
执行./mkext2 rootfs/
会在当前路径生成system.img
自己的一些浅理解:中间一直在思考debian的文件系统和用buildroot做的文件系统有啥区别(buildroot是采用busybox)。经过对比两个文件系统发现目录结构有一点变化,init启动方式不同,bin/下的命令不同,其中debian的特色就是有apt-get这个命令,debian支持的软件包3万多个,而ubutun才7千多。两者都是linux文件系统,都遵循基本的文件结构,只是etc/ lib/ 下的文件不同。在busybox中可以找到根文件系统的源代码(buildroot/output/build/busybox-1.22.1/)。