上一次中我们出现了这个错误
... ... ...
1f05 40960 mtdblock5 (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
[] (unwind_backtrace+0x0/0xf0) from [] (panic+0x58/0x184)
[] (panic+0x58/0x184) from [] (mount_block_root+0x15c/0x210)
... ... ...
找不到文件系统树,需要我们做文件系统树。接下来,我们就尝试着做一下。
根文件系统目录树用来存放基本命令、系统配置、动态库、设备节点、应用程序等所以文件。
[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]$
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]$
这里是链接失效的脚本文件。功能为删除重新制作
[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]$
[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]$
[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 == 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.
#
#
/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]$
[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]$
这一部分同样也可以拷贝自己的系统文件,弄完之后可以看到这样的一个效果
[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文件启动
[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
设置好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)
~ >: