linux编译安装内核最后只进入了initramfs的shell界面?
我在kernel.org下载了3.2.16的内核,放在根目录/下面,解压,执行了makemenuconfig配置了处理器为x86,保存后make,makemodules_...
我在kernel.org下载了3.2.16的内核,放在根目录/下面,解压,执行了make menuconfig配置了处理器为x86,保存后make,make modules_install,make install,然后出现warnning:etc/(某个目录下)/modprobe.d 然后一句英文忘了,只记得有‘cannot’进去那个文件后也发现就一句英文大致是找不到以前的旧版本什么的。然后我update-grub,reboot,重启后ESC选择3.2.16内核进去最后就出现如下画面,请问到底是怎么回事?如何解决?
展开
1个回答
展开全部
一、initramfs 介绍
最初的想法是Linus提出的: 把cache当作文件系统装载。
他在一个叫ramfs的cache实现上加了一层很薄的封装,其他内核开发人员编写了一个改进版tmpfs,这个文件系统上的数据可以写出到交换分区,而且可以设定一个tmpfs装载点的最大尺寸以免耗尽内存。initramfs就是tmpfs的一个应用。
优点:
(1)tmpfs随着其中数据的增减自动增减容量.
(2)在tmpfs和page cache/dentry cache之间没有重复数据.
(3)tmpfs重复利用了Linux caching的代码, 因此几乎没有增加内核尺寸, 而caching的代码已经经过良好测试, 所以tmpfs的代码质量也有保证.
(4)不需要额外的文件系统驱动.
另外, initrd机 制被设计为旧的"root="机制的前端,而非其替代物,它假设真正的根设备是一个块设备, 而且也假设了自己不是真正的根设备,这样不便将NFS等作为根文件系统。最后/linuxrc不是以PID=1执行的, 因为1这个进程ID是给/sbin/init保留的。 initrd机制找到真正的根设备后将其设备号写入/proc/sys/kernel/real-root-dev, 然后控制转移到内核由其装载根文件系统并启动/sbin/init。
initramfs则去掉了上述假设, 而且/init以PID=1执行, 由init装载根文件系统并用exec转到真正的/sbin/init, 这样也导致一个更为干净漂亮的设计。
生成initramfs镜像命令
若镜像根目录为/initrd,执行下面命令在当前用户主文件夹中生成myinitramfs.gz镜像。
cd /initrd
find .|cpio -o -H newc|gzip>~/myinitramfs.gz
生成的镜像文件是gzip压缩过的。
二、制作用于initramfs的文件系统
1.制作根文件目录
root@li-ace:/home/li/busybox-1.17.2# cd /home/li
root@li-ace:/home/li# mkdir initramfs
root@li-ace:/home/li# cd initramfs/
用shell脚本创建根文件系统的目录结构,并在想要建立根文件系统的地方运行此脚本。我是用root用户登陆的,直接创建了设备节点。
#!/bin/sh
echo "makeing rootdir"
cd /home/li/initramfs
echo "makeing dir: bin dev etc lib proc sbin sys usr mnt tmp var home root ..."
mkdir dev etc lib proc sys mnt tmp #7 dirs
mkdir lib/modules
#Copy bin sbin usr etc from /nfs/rootfs
cd /nfs/rootfs
cp -r bin sbin usr etc `cd -`;cd -
#Copy libs from /nfs/rootfs/lib to lib/
cd /home/li/initramfs/lib
ls
cd /nfs/rootfs/lib
cp libm.so.6 libc.so.6 ld-linux.so.3 `cd -`;cd -
#Don't use mknod, unless you run this Script as
cd /home/li/initramfs/
sudo mknod -m 777 dev/console c 5 1
sudo mknod -m 777 dev/null c 1 3
echo "done"
2.添加init程序
在initramfs根目录下新建init文档,加入一下内容:
#!bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
sleep 1
choose=0
ipaddr=192.168.1.230
serverip=192.168.1.101
echo "##############################################################"
echo "run initramfs --please input \"0\"and Enter"
echo "mount rootfs on nfs --please input \"1\"and Enter"
echo "\"0\" is default"
echo "##############################################################"
echo
read choose
case "$choose" in
"1")
ifconfig eth0 ${ipadder}
ifconfig eth0 up
mount -t nfs ${serverip}:/nfs/rootfs /mnt -o nolock
mount -t sysfs sysfs /mnt/sys;;
*)
PS1="[InitRamFs@\W]#"
export PS1
/bin/sh
exit 0;;
esac
exec switch_root /mnt /sbin/init
保存,并把权限设置为可执行的。
把制作好的initramfs文件系统复制到 /nfs 下
root@li-ace:/usr/src/linux-3.2.10# mv /home/li/initramfs /nfs
把nfs文件系统rootfs拷贝到 /nfs下
3.将initramfs编译进uImage,让它由内核启动后挂载。
PS:参考config_mini6410_n43 配置文件
root@li-ace:/usr/src/linux-3.2.10# make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
(/nfs/initramfs) Initramfs source file(s)
root@li-ace:/usr/src/linux-3.2.10# make uImage ARCH=arm CROSS_COMPILE=arm-linux-
root@li-ace:/usr/src/linux-3.2.10# mv arch/arm/boot/uImage /tftp/initramfs.bin
//将生成的uImage移动到/tftp下
三、下载启动initramfs内核
1.配置好环境变量
Uboot> setenv myboard AT91RM9200DK
Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
myboard=AT91RM9200DK
Environment size: 102/8188 bytes
2.下载启动
MINI6410 # tftp c0008000 initramfs.bin
MINI6410 # tftp c0008000 initramfs.bin
dm9000 i/o: 0x18000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:90:90:90:90:90
operating at 100M full duplex mode
TFTP from server 192.168.1.101; our IP address is 192.168.1.230
Filename 'initramfs.bin'.
Load address: 0xc0008000
MINI6410 # bootm c0008000
IP-Config: Complete:
device=eth0, addr=192.168.1.230, mask=255.255.255.0, gw=255.255.255.255,
host=192.168.1.230, domain=, nis-domain=(none)
dm9000 dm9000: eth0: link up, 100Mbps, full-duplex, lpa 0x4DE1
,
bootserver=255.255.255.255, rootserver=192.168.1.101, rootpath=
Freeing init memory: 4064K
##############################################################
run initramfs --please input "0"and Enter
mount rootfs on nfs --please input "1"and Enter
"0" is default
##############################################################
0
[InitRamFs@/]#ls
bin etc lib mnt sbin tmp
dev init makedir.sh proc sys usr
[InitRamFs@/]#
PS:.config的配置一定要准确,多钻研下怎么配置
一些问题参考:http://blog.chinaunix.net/uid-20543672-id-129729.html
http://www.360doc.com/content/10/1203/21/1378815_74790077.shtml
忽如一夜春风来,告树万树梨花开。岑参
最初的想法是Linus提出的: 把cache当作文件系统装载。
他在一个叫ramfs的cache实现上加了一层很薄的封装,其他内核开发人员编写了一个改进版tmpfs,这个文件系统上的数据可以写出到交换分区,而且可以设定一个tmpfs装载点的最大尺寸以免耗尽内存。initramfs就是tmpfs的一个应用。
优点:
(1)tmpfs随着其中数据的增减自动增减容量.
(2)在tmpfs和page cache/dentry cache之间没有重复数据.
(3)tmpfs重复利用了Linux caching的代码, 因此几乎没有增加内核尺寸, 而caching的代码已经经过良好测试, 所以tmpfs的代码质量也有保证.
(4)不需要额外的文件系统驱动.
另外, initrd机 制被设计为旧的"root="机制的前端,而非其替代物,它假设真正的根设备是一个块设备, 而且也假设了自己不是真正的根设备,这样不便将NFS等作为根文件系统。最后/linuxrc不是以PID=1执行的, 因为1这个进程ID是给/sbin/init保留的。 initrd机制找到真正的根设备后将其设备号写入/proc/sys/kernel/real-root-dev, 然后控制转移到内核由其装载根文件系统并启动/sbin/init。
initramfs则去掉了上述假设, 而且/init以PID=1执行, 由init装载根文件系统并用exec转到真正的/sbin/init, 这样也导致一个更为干净漂亮的设计。
生成initramfs镜像命令
若镜像根目录为/initrd,执行下面命令在当前用户主文件夹中生成myinitramfs.gz镜像。
cd /initrd
find .|cpio -o -H newc|gzip>~/myinitramfs.gz
生成的镜像文件是gzip压缩过的。
二、制作用于initramfs的文件系统
1.制作根文件目录
root@li-ace:/home/li/busybox-1.17.2# cd /home/li
root@li-ace:/home/li# mkdir initramfs
root@li-ace:/home/li# cd initramfs/
用shell脚本创建根文件系统的目录结构,并在想要建立根文件系统的地方运行此脚本。我是用root用户登陆的,直接创建了设备节点。
#!/bin/sh
echo "makeing rootdir"
cd /home/li/initramfs
echo "makeing dir: bin dev etc lib proc sbin sys usr mnt tmp var home root ..."
mkdir dev etc lib proc sys mnt tmp #7 dirs
mkdir lib/modules
#Copy bin sbin usr etc from /nfs/rootfs
cd /nfs/rootfs
cp -r bin sbin usr etc `cd -`;cd -
#Copy libs from /nfs/rootfs/lib to lib/
cd /home/li/initramfs/lib
ls
cd /nfs/rootfs/lib
cp libm.so.6 libc.so.6 ld-linux.so.3 `cd -`;cd -
#Don't use mknod, unless you run this Script as
cd /home/li/initramfs/
sudo mknod -m 777 dev/console c 5 1
sudo mknod -m 777 dev/null c 1 3
echo "done"
2.添加init程序
在initramfs根目录下新建init文档,加入一下内容:
#!bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
sleep 1
choose=0
ipaddr=192.168.1.230
serverip=192.168.1.101
echo "##############################################################"
echo "run initramfs --please input \"0\"and Enter"
echo "mount rootfs on nfs --please input \"1\"and Enter"
echo "\"0\" is default"
echo "##############################################################"
echo
read choose
case "$choose" in
"1")
ifconfig eth0 ${ipadder}
ifconfig eth0 up
mount -t nfs ${serverip}:/nfs/rootfs /mnt -o nolock
mount -t sysfs sysfs /mnt/sys;;
*)
PS1="[InitRamFs@\W]#"
export PS1
/bin/sh
exit 0;;
esac
exec switch_root /mnt /sbin/init
保存,并把权限设置为可执行的。
把制作好的initramfs文件系统复制到 /nfs 下
root@li-ace:/usr/src/linux-3.2.10# mv /home/li/initramfs /nfs
把nfs文件系统rootfs拷贝到 /nfs下
3.将initramfs编译进uImage,让它由内核启动后挂载。
PS:参考config_mini6410_n43 配置文件
root@li-ace:/usr/src/linux-3.2.10# make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
(/nfs/initramfs) Initramfs source file(s)
root@li-ace:/usr/src/linux-3.2.10# make uImage ARCH=arm CROSS_COMPILE=arm-linux-
root@li-ace:/usr/src/linux-3.2.10# mv arch/arm/boot/uImage /tftp/initramfs.bin
//将生成的uImage移动到/tftp下
三、下载启动initramfs内核
1.配置好环境变量
Uboot> setenv myboard AT91RM9200DK
Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
myboard=AT91RM9200DK
Environment size: 102/8188 bytes
2.下载启动
MINI6410 # tftp c0008000 initramfs.bin
MINI6410 # tftp c0008000 initramfs.bin
dm9000 i/o: 0x18000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:90:90:90:90:90
operating at 100M full duplex mode
TFTP from server 192.168.1.101; our IP address is 192.168.1.230
Filename 'initramfs.bin'.
Load address: 0xc0008000
MINI6410 # bootm c0008000
IP-Config: Complete:
device=eth0, addr=192.168.1.230, mask=255.255.255.0, gw=255.255.255.255,
host=192.168.1.230, domain=, nis-domain=(none)
dm9000 dm9000: eth0: link up, 100Mbps, full-duplex, lpa 0x4DE1
,
bootserver=255.255.255.255, rootserver=192.168.1.101, rootpath=
Freeing init memory: 4064K
##############################################################
run initramfs --please input "0"and Enter
mount rootfs on nfs --please input "1"and Enter
"0" is default
##############################################################
0
[InitRamFs@/]#ls
bin etc lib mnt sbin tmp
dev init makedir.sh proc sys usr
[InitRamFs@/]#
PS:.config的配置一定要准确,多钻研下怎么配置
一些问题参考:http://blog.chinaunix.net/uid-20543672-id-129729.html
http://www.360doc.com/content/10/1203/21/1378815_74790077.shtml
忽如一夜春风来,告树万树梨花开。岑参
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |