最小文件系统树和initramfs文件系统的制作

文件系统树的制作

上一次中我们出现了这个错误

... ... ...
1f05           40960 mtdblock5  (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
[<c0037abc>] (unwind_backtrace+0x0/0xf0) from [<c032bf08>] (panic+0x58/0x184)
[<c032bf08>] (panic+0x58/0x184) from [<c0008d20>] (mount_block_root+0x15c/0x210)
... ... ...

找不到文件系统树,需要我们做文件系统树。接下来,我们就尝试着做一下。

1. 创建根文件目录树的结构

根文件系统目录树用来存放基本命令、系统配置、动态库、设备节点、应用程序等所以文件。

[klaus@localhost fl2240maker]$ cd rootfs_fl2440/
[klaus@localhost rootfs_fl2440]$ ls
[klaus@localhost rootfs_fl2440]$ clear
[klaus@localhost rootfs_fl2440]$ ls
[klaus@localhost rootfs_fl2440]$  mkdir rootfs
[klaus@localhost rootfs_fl2440]$ ls
rootfs
[klaus@localhost rootfs_fl2440]$ cd rootfs/
[klaus@localhost rootfs]$ mkdir -p {apps,bin,data,dev,info,proc,root,sbin,sys,tmp,var,etc/init.d,mnt/{usb,mmc},usr/{,bin,sbin,lib},lib/{,modules/{,3.0.0}}}
[klaus@localhost rootfs]$ tree
... ... ...
23 directories, 0 files
[klaus@localhost rootfs]$ 

2. 安装动态库

Linux的应用运行离不开动态库,当程序运行时,会默认到/lib路径下查找响应的动态库文件。
PS:当动态库文件不在该路径下时,可以通过设置环境变量LD_LIBRARY_PATH来加载。

[klaus@localhost rootfs]$ cd lib/
[klaus@localhost lib]$ find /opt/x-tools/arm920t/ -name "*.so*" | grep -v gconv | xargs -i cp -af {} ./
[klaus@localhost lib]$ ls -l `find -L -type l`
lrwxrwxrwx 1 klaus klaus 21 Mar 27 01:54 ./libanl.so -> ../../lib/libanl.so.1
lrwxrwxrwx 1 klaus klaus 30 Mar 27 01:54 ./libBrokenLocale.so -> ../../lib/libBrokenLocale.so.1
lrwxrwxrwx 1 klaus klaus 23 Mar 27 01:54 ./libcrypt.so -> ../../lib/libcrypt.so.1
lrwxrwxrwx 1 klaus klaus 20 Mar 27 01:54 ./libdl.so -> ../../lib/libdl.so.2
lrwxrwxrwx 1 klaus klaus 19 Mar 27 01:54 ./libm.so -> ../../lib/libm.so.6
lrwxrwxrwx 1 klaus klaus 21 Mar 27 01:54 ./libnsl.so -> ../../lib/libnsl.so.1
lrwxrwxrwx 1 klaus klaus 28 Mar 27 01:54 ./libnss_compat.so -> ../../lib/libnss_compat.so.2
lrwxrwxrwx 1 klaus klaus 25 Mar 27 01:54 ./libnss_dns.so -> ../../lib/libnss_dns.so.2
lrwxrwxrwx 1 klaus klaus 27 Mar 27 01:54 ./libnss_files.so -> ../../lib/libnss_files.so.2
lrwxrwxrwx 1 klaus klaus 28 Mar 27 01:54 ./libnss_hesiod.so -> ../../lib/libnss_hesiod.so.2
lrwxrwxrwx 1 klaus klaus 29 Mar 27 01:54 ./libnss_nisplus.so -> ../../lib/libnss_nisplus.so.2
lrwxrwxrwx 1 klaus klaus 25 Mar 27 01:54 ./libnss_nis.so -> ../../lib/libnss_nis.so.2
lrwxrwxrwx 1 klaus klaus 24 Mar 27 01:54 ./libresolv.so -> ../../lib/libresolv.so.2
lrwxrwxrwx 1 klaus klaus 20 Mar 27 01:54 ./librt.so -> ../../lib/librt.so.1
lrwxrwxrwx 1 klaus klaus 27 Mar 27 01:54 ./libthread_db.so -> ../../lib/libthread_db.so.1
lrwxrwxrwx 1 klaus klaus 22 Mar 27 01:54 ./libutil.so -> ../../lib/libutil.so.1
[klaus@localhost lib]$

部分链接存在失效,解决失效链接

[klaus@localhost lib]$ vim symlink.sh
[klaus@localhost lib]$ sh symlink.sh && rm -f symlink.sh
[klaus@localhost lib]$ ls
ld-2.9.so                  libc-2.9.so      libgcc_s.so.1         libnss_compat.so.2    libnss_nis-2.9.so      libresolv-2.9.so     libthread_db-1.0.so
ld-linux.so.3              libcrypt-2.9.so  libm-2.9.so           libnss_dns-2.9.so     libnss_nisplus-2.9.so  libresolv.so         libthread_db.so
libanl-2.9.so              libcrypt.so      libmemusage.so        libnss_dns.so         libnss_nisplus.so      libresolv.so.2       libthread_db.so.1
libanl.so                  libcrypt.so.1    libm.so               libnss_dns.so.2       libnss_nisplus.so.2    librt-2.9.so         libutil-2.9.so
libanl.so.1                libc.so          libm.so.6             libnss_files-2.9.so   libnss_nis.so          librt.so             libutil.so
libbfd-2.20.1.20100303.so  libc.so.6        libnsl-2.9.so         libnss_files.so       libnss_nis.so.2        librt.so.1           libutil.so.1
libbfd.so                  libdl-2.9.so     libnsl.so             libnss_files.so.2     libpcprofile.so        libSegFault.so       modules
libBrokenLocale-2.9.so     libdl.so         libnsl.so.1           libnss_hesiod-2.9.so  libpthread-2.9.so      libstdc++.so
libBrokenLocale.so         libdl.so.2       libnss_compat-2.9.so  libnss_hesiod.so      libpthread.so          libstdc++.so.6
libBrokenLocale.so.1       libgcc_s.so      libnss_compat.so      libnss_hesiod.so.2    libpthread.so.0        libstdc++.so.6.0.13
[klaus@localhost lib]$

这里是链接失效的脚本文件。功能为删除重新制作

安装BusyBox解决命令问题

busyBox的下载编译

[klaus@localhost lib]$ cd ../../../3rdparty/
[klaus@localhost 3rdparty]$ wget https://busybox.net/downloads/busybox-1.27.1.tar.bz2
[klaus@localhost 3rdparty]$ tar -xjf busybox-1.27.1.tar.bz2
[klaus@localhost 3rdparty]$ cd busybox-1.27.1
[klaus@localhost busybox-1.27.1]$ export TERM=vt100
[klaus@localhost busybox-1.27.1]$ make menuconfig

更改安装路径和指定自己的交叉编译器
路径
改掉部分我们不需要的细节,如邮箱,打印机等等

Linux System Utilities --->
    [ ] nsenter 将该选项去掉,否则编译出现错误: undefined reference to `setns'
Coreutils --->
    [*] sync
    [ ] Enable -d and -f flags (requires syncfs(2) in libc) 将该选项去掉,否则编译出现错误: undefined reference to `syncfs'
Miscellaneous Utilities --->
    [*] flashcp Norflash拷贝命令
    [*] flash_eraseall Norflash和Nandflash的擦除命令
    [*] flash_lock Norflash的写保护命令
    [*] flash_unlock Norflash的解写保护命令
Print Utilities --->不用全部取消,节约空间
Mail Utilities ---> 不用全部取消,节约空间

安装拷贝

[klaus@localhost busybox-1.27.1]$ make && make install
[klaus@localhost busybox-1.27.1]$ cd ../../linux/rootfs/
[klaus@localhost rootfs]$ ln -s bin/busybox init
[klaus@localhost rootfs]$ ls
apps  bin  data  dev  etc  info  init  lib  linuxrc  mnt  proc  root  sbin  sys  tmp  usr  var
[klaus@localhost rootfs]$ ls bin/
ash      chmod     date           echo     fgrep   hostname  kill     ls      more        netstat        printenv  rpm           setserial  sync    usleep
base64   chown     dd             ed       fsync   hush      link     lsattr  mount       nice           ps        run-parts     sh         tar     vi
busybox  conspy    df             egrep    getopt  ionice    linux32  lzop    mountpoint  pidof          pwd       scriptreplay  sleep      touch   watch
cat      cp        dmesg          false    grep    iostat    linux64  mkdir   mpstat      ping           rev       sed           stat       true    zcat
chattr   cpio      dnsdomainname  fatattr  gunzip  ipcalc    ln       mknod   mt          ping6          rm        setarch       stty       umount
chgrp    cttyhack  dumpkmap       fdflush  gzip    kbd_mode  login    mktemp  mv          pipe_progress  rmdir     setpriv       su         uname
[klaus@localhost rootfs]$ ls sbin/        ls usr/bin/               ls usr/sbin

可以看一下链接过来的所以命令
命令

创建任务节点

[klaus@localhost rootfs]$ ls
apps  bin  data  dev  etc  info  init  lib  linuxrc  mnt  proc  root  sbin  sys  tmp  usr  var
[klaus@localhost rootfs]$ sudo mknod -m666 dev/null c 1 3
[sudo] password for klaus:
[klaus@localhost rootfs]$ sudo mknod -m666 dev/console c 5 1
[klaus@localhost rootfs]$ sudo mknod -m666 dev/ttyS0 c 4 64
[klaus@localhost rootfs]$ sudo mknod rtc c 10 135
[klaus@localhost rootfs]$ ls -l dev/
total 0
crw-rw-rw- 1 root root 5,  1 Apr 18 19:47 console
crw-rw-rw- 1 root root 1,  3 Apr 18 19:47 null
crw-rw-rw- 1 root root 4, 64 Apr 18 19:48 ttyS0
[klaus@localhost rootfs]$ ls -l r
root/ rtc   
[klaus@localhost rootfs]$ ls -l rtc
crw-r--r-- 1 root root 10, 135 Apr 18 19:48 rtc
[klaus@localhost rootfs]$

创建/var路径文件

[klaus@localhost linux]$ cd rootfs/
[klaus@localhost rootfs]$ ln -s /tmp var/lock
[klaus@localhost rootfs]$  ln -s /tmp var/log
[klaus@localhost rootfs]$ ln -s /tmp var/run
[klaus@localhost rootfs]$  ln -s /tmp var/tmp
[klaus@localhost rootfs]$ ls -l var/
total 0
lrwxrwxrwx 1 klaus klaus 4 Apr 18 19:49 lock -> /tmp
lrwxrwxrwx 1 klaus klaus 4 Apr 18 19:49 log -> /tmp
lrwxrwxrwx 1 klaus klaus 4 Apr 18 19:49 run -> /tmp
lrwxrwxrwx 1 klaus klaus 4 Apr 18 19:49 tmp -> /tmp
[klaus@localhost rootfs]$

创建/etc路径文件

[klaus@localhost rootfs]$ vim etc/inittab
[klaus@localhost rootfs]$ vim etc/fstab
[klaus@localhost rootfs]$ vim etc/hostname
[klaus@localhost rootfs]$ cat etc/inittab
#Format for each entry: <id>:<runlevels>:<action>:<process>
#
#id == tty to run on, or empty for /dev/console.
# If specified, then /dev/$id device must exist
# runlevels == ignored, busybox doesn't support it
# action == one of sysinit, respawn, askfirst, wait, and once
# process == program to run
# Startup the system

# mount all the file systems specified in /etc/fstab
::sysinit:/bin/mount -a
# Use mdev to auto generate device nod and auto mount SD card and USB storage
::sysinit:/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
::sysinit:/sbin/mdev -s
#make shm, pts support
::sysinit:/bin/mkdir -p /dev/pts
::sysinit:/bin/mkdir -p /dev/shm
::sysinit:/bin/mount -t devpts devpts /dev/pts
#Set hostname
null::sysinit:/bin/hostname -F /etc/hostname
#Enable console logon
null::respawn:/sbin/getty -L ttyS0 115200 vt100
# now run any rc scripts, which used to start other application
null::wait:/etc/init.d/rcS
# system daemon
null::respawn:/sbin/syslogd -n
null::respawn:/sbin/klogd -n
# Stuff to do before rebooting
null::shutdown:/bin/killall klogd
null::shutdown:/bin/killall syslogd
null::shutdown:/bin/umount -a -r
[klaus@localhost rootfs]$ cat etc/fstab
# /etc/fstab: static file system information.
#
#<file system> <mount pt> <type> <options> <dump> <pass>
/dev/root / ext2 rw,noauto 0 1
proc /proc proc defaults 0 0
usbfs /proc/bus/usb usbfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
ramfs /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
[klaus@localhost rootfs]$

这里的文件可以拷贝自己虚拟机里面的文件,下面的部分文件也同样可以。

创建系统启动脚本

[klaus@localhost rootfs]$ cd etc/
[klaus@localhost etc]$ ls
fstab  hostname  init.d  inittab
[klaus@localhost etc]$ cd init.d/
[klaus@localhost init.d]$ vim rcS
[klaus@localhost init.d]$  chmod a+x rcS
[klaus@localhost init.d]$ vim S10_network
[klaus@localhost init.d]$ chmod a+x S10_network
[klaus@localhost init.d]$  vim S99_rcsApp
[klaus@localhost init.d]$  chmod a+x S99_rcsApp
[klaus@localhost init.d]$ ls
rcS  S10_network  S99_rcsApp
[klaus@localhost init.d]$

创建shell的配置文件

[klaus@localhost etc]$ cat profile 
# Busybox Shell(ash) configure file
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/apps/bin:/apps/tools
export PS1='\w >: '
export USER=`id -un`
export LOGNAME=$USER
export HOSTNAME=`/bin/hostname`
export HISTSIZE=500
export HISTFILESIZE=500
export PAGER='/bin/more'
export EDITOR='/bin/vi'
export INPUTRC=/etc/inputrc
export LD_LIBRARY_PATH=/lib:/usr/lib:/apps/lib
export network_cfg_dir=/apps/etc/network
### Some alias command
alias vim='vi'
alias ll='ls -l'
alias l.='ls -d .*'
alias df='df -h'
[klaus@localhost etc]$ 

创建Linux登录帐号文件和其他文件

这一部分同样也可以拷贝自己的系统文件,弄完之后可以看到这样的一个效果

[klaus@localhost etc]$ ll
total 48
-rw-r--r-- 1 root root  189 Apr 18 20:00 fstab
-rw-r--r-- 1 root root   15 Apr 18 20:00 group
-rw-r--r-- 1 root root   14 Apr 18 20:00 hostname
-rw-r--r-- 1 root root   20 Apr 18 20:00 hosts
drwxr-xr-x 2 root root 4096 Apr 18 20:00 init.d
-rw-r--r-- 1 root root 1124 Apr 18 20:00 inittab
-rw-r--r-- 1 root root   46 Apr 18 20:00 issue
-rw-r--r-- 1 root root   26 Apr 18 20:00 passwd
-rw-r--r-- 1 root root  495 Apr 18 20:00 profile
-rw-r--r-- 1 root root   46 Apr 18 20:00 resolv.conf
-rw-r--r-- 1 root root   59 Apr 18 20:00 shadow
-rw-r--r-- 1 root root    8 Apr 18 20:00 TZ
[klaus@localhost etc]$ 

内核initramfs选择和编译

内核选择initramfs文件启动

[klaus@localhost linux-3.0]$ make menuconfig

General setup --->
    [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
    (../../linux/rootfs/) Initramfs source file(s) 指定前面制作的根文件系统树所在的路径
Device Drivers --->
    [*] Block devices --->
    < > Network block device support
    < > Low Performance USB Block driver
    < > RAM block device support 务必将这个ramdisk选项取消掉,否则initramfs根文件系统不能启动,默认用作
initrd启动。
    < > ATA over Ethernet support

[klaus@localhost linux-3.0]$ make
[klaus@localhost linux-3.0]$mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n "Linux Kernel" -d arch/arm/boot/zImage linuxrom-s3c2440.bin

编译完成后,我们可以看一下文件的大小和信息

[klaus@localhost linux-3.0]$  du -sh arch/arm/boot/zImage
6.8M    arch/arm/boot/zImage
[klaus@localhost linux-3.0]$ ls -l linuxrom-s3c2440.bin
-rwxrwxr-x. 1 klaus klaus 7066328 Apr  3 06:58 linuxrom-s3c2440.bin
[klaus@localhost linux-3.0]$  du -sh linuxrom-s3c2440.bin
6.8M    linuxrom-s3c2440.bin

u-boot环境变量的配置和下载

设置好bootargs参数,就可以下载了

[fl2440@lingyun]# set bootargs 'console=tty0 console=ttyS0,115200 mem=64M rw loglevel=7
[fl2440@lingyun]# save
[fl2440@lingyun]# tftp 30008000 linuxrom-s3c2440.bin;bootm 30008000

内核加initramfs文件系统就可以跑起来了


Default Logon Username: root Password: asd123
LingYunFL2440 login: root
Password: 
~ >: mount
rootfs on / type rootfs (rw)//这里为initramfs
proc on /proc type proc (rw,relatime)
usbfs on /proc/bus/usb type usbfs (rw,relatime)
tmpfs on /dev type tmpfs (rw,relatime)
ramfs on /tmp type ramfs (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
~ >: 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值