999 兄,能不能帮我理顺一下 Live 上面的安装
grub 安装不了,总线错误,直接安装 /boot 会是只读的,这个先丢一边。该如何正确生成 initrd ? 以下的操作在生成 initrd 时会提示找不到 /sys/block/*,这个应该不是问题所在。
我之前用 MI 安装过的系统重新生成 initrd 也都能用,所以我不知道问题出在哪里。
一直卡在内核加载那里,找不到 /proc /dev 之类,这个太典型了,之前 MI 安装也经常遇到
错误做法:cp -R -v /bin /home /opt /sbin /usr /etc /lib /root /var /srv ./
mkfs.ext4 /dev/sda1
mkdir /tmp/newsystem
mount /dev/sda1 /tmp/newsystem
cd /tmp/newsystem
unsquashfs /mnt/sr0/MagicLinux/base/usr.lzm
mv squashfs-root/* ./;rmdir squashfs-root
....(类似解压略过)
mkdir -p media mnt/sr0
mkdir -p boot/grub
cd boot
cp /boot/vmlinuz vmlinuz-3.1.10
cp /boot/System.map-3.1.10 ./
cp /usr/lib/grub/{stage1,stage2,*stage1_5} grub/
cp /root/{grub.conf,message} grub/
cd grub
ln -s grub.conf menu.lst
cd /tmp/newsystem
mkdir -p proc sys/block dev tmp
以下操作没有必要
cd dev
mknod console c 5 1
mknod null c 1 3
mknod fb0 c 29 0
mknod zero c 1 5
mknod ram b 1 1
mknod systty c 4 0
mknod tty c 5 0
mknod fuse c 10 229
for i in 1 2 3 4 5 6; do
mknod tty$i c 4 $i;
done
cd /tmp/newsystem
chmod 777 proc/ dev/ dev/* sys/ sys/block tmp
chroot .
cd boot
mkinitrd initrd-3.1.10
exit
cd /
umount /tmp/newsystem
[ 本帖最后由 haulm 于 2012-6-4 16:02 编辑 ] 急,没人回答么,应该和内核无关,同一内核 MI 装就行 ?Live 也是可以的。
ls /sys/block/
loop0loop3loop6ram1 ram12ram15ram4ram7sda
loop1loop4loop7ram10ram13ram2 ram5ram8sdb
loop2loop5ram0 ram11ram14ram3 ram6ram9sr0
难道真和这个目录有关,没有建立对应的设备?
[ 本帖最后由 haulm 于 2012-6-4 12:32 编辑 ] 我之前做过安装好像不必手工建立/dev/下的设备啊。不过我安装的时候不是cp -R这么处理的,而是解压squashfs文件的。
grub的安装需要chroot进新系统才能正常安装,好像是这样。 也有可能被 Live 污染了,需要从 base 重新解压,se 兄,能说一下 initrd 的重新生成不,我一会再尝试。 false /init,设备全部删除,留下主目录,现在 init 又要怎么设置》?我现在明白过来了,initrd 必需是在 /etc/fstab 正确描述挂载的设备后才能正确制做。
[ 本帖最后由 haulm 于 2012-6-4 15:27 编辑 ] 这手菜的,/etc/fstab 没写对。
这会进去后变成 root@none了,所有分区只读。。。
难道说 /etc/mtab 也不能缺。。
[ 本帖最后由 haulm 于 2012-6-4 15:26 编辑 ] 莫名其妙的地方:啊哈,还要修改一下 /etc/rc.d/rc.sysinit 的权限,靠,好象是我自己搞坏的。 等有时间写个安装脚本好了,就安装一次搞了四小时。 mknod console c 5 1
必须有,除非你做 rootfs 时,文件系统里面已经有了 console 设备文件一起打包进去了。
这是 bash 运行脚本的必须东西。
udev 服务启动时还会生成一些设备,但这些设备文件生成之前,/dev 里面空的目录会让你不能使用很多需要设备的东西。而且似乎你的系统启动时, rootfs 在 initrd 阶段是在内存里面的。你切换到硬盘分区,必须先挂载这个分区,这个时候你就再一次需要 /dev/ 里面的设备。
/dev/ 和 /proc 逻辑上似乎不是必须的。但实际上,似乎你都不知道你的 initrd 里面到底在干什么。所以你这个问题我只能说无解,因为你现在还是不知道 Linux 的启动过程。 Live 系统的 initrd 很重要,但安装完成后就需要另一个针对硬盘 Linux 系统的 initrd 。
Live 的 initrd 后面再说,先说硬盘里安装好系统的 initrd 。
这个你去看 MI 的调用过程就行了。另外内核的安装脚本里面应该也有生成的部分,你去照抄就行了。
至于 Live 的 initrd 脚本,你先说你想干什么吧。 没什么,已经实现了,就是基于现有的 Live 条件进行安装,现在我已经对整个过程有概念,成功安装了一次了,现在可以写一个简单的对话脚本,自动完成安装。unsquashfs 的确比 cp 要来的快很多,安装非常快哦。 安装程序你还是等新的 MI 吧。用 Live 系统跑新 MI 进行安装。 草稿#!/bin/sh
echo "Live 安装程序 0.1"
echo "请输入需要安装的分区设备名称,注意您的操作将会格式化分区并开始系统安装。"
echo '例如原 Winxp 认知第一硬盘的 E 盘对应设备名为"/dev/sda6"'
echo "您可以运行 kdf 查看所有设备的状况,对重要文件进行备份"
echo "输入:/dev/__"
read dev_get
echo "您输入的设备名为"$dev_get
echo "请再次输入设备名"
read dev_name
if [ "$dev_get" != "$dev_name" ]
then
echo "分区设备没有确认"
exit
fi
if ( ! echo $dev_name|grep /dev/sd>/dev/null )
then
echo "分区设备名不正确"
exit
fi
i=${#dev_name}
s1=${dev_name:5:3}
s2=${dev_name:8}
let s2=s2-1
case $s1 in
sda)
t_s1=0
;;
sdb)
t_s1=1
;;
sdc)
t_s1=2
;;
sdd)
t_s1=3
;;
*)
echo "分区设备名不正确"
exit
;;
esac
case $s2 in
0)
t_s2=0
;;
4)
t_s2=4
;;
5)
t_s2=5
;;
6)
t_s2=6
;;
7)
t_s2=7
;;
8)
t_s2=8
;;
9)
t_s2=9
;;
10)
t_s2=10
;;
11)
t_s2=11
;;
12)
t_s2=12
;;
13)
t_s2=13
;;
14)
t_s2=14
;;
15)
t_s2=15
;;
*)
echo "无此设备名"
exit
;;
esac
echo "开始格式化分区"$dev_name
umount $dev_name
mkfs.ext4 $dev_name
mkdir /tmp/newsystem
mount $dev_name /tmp/newsystem
cd /tmp/newsystem
for i in bin home opt sbin usr etc lib root srv var;do
unsquashfs /mnt/sr0/MagicLinux-2.5.15-Live/base/$i.lzm;
mv squashfs-root/* ./
rmdir squashfs-root
done
mkdir -p boot/grub media mnt/sr0 proc sys/block dev dev/shm dev/pts tmp
cd boot
cp /boot/vmlinuz vmlinuz-3.1.10
cp /boot/System.map-3.1.10 ./
cp /usr/lib/grub/{stage1,stage2,*stage1_5} grub/
cp /boot/{grub.conf,message} grub/
cd grub
ln -s grub.conf menu.lst
cd /tmp/newsystem
cp /boot/{fstab,mtab} etc/
sed -i 's@/dev/LIVE@'"$dev_name"'@g' etc/fstab
sed -i 's@/dev/LIVE@'"$dev_name"'@g' etc/mtab
sed -i 's@/dev/LIVE@'"$dev_name"'@g' boot/grub/grub.conf
sed -i 's@hdLIVE@'"$t_s1"'@g' boot/grub/grub.conf
sed -i 's@_live@'"$t_s2"'@g' boot/grub/grub.conf
chmod 777 proc/ dev/ dev/* sys/ sys/block tmp
echo "请运行 mkinitrd initrd-3.1.10.img 3.1.10"
chroot .
[ 本帖最后由 haulm 于 2012-6-5 02:53 编辑 ] 原帖由 jiangtao9999 于 2012-6-4 23:05 发表 http://forum.linuxfans.org/images/common/back.gif
安装程序你还是等新的 MI 吧。用 Live 系统跑新 MI 进行安装。
自己实现也可以充下电,这脑子不好使了。 我建议更新一下INITRD文件,init文件写成动态的,解释引导参数装载磁盘,这样不用每次安装都需要重现生成.