LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1915|回复: 11

急救:linux/debian 启动 如何从 initramfs(busy box)进入正常的系统 (如何正确 mount

[复制链接]
发表于 2010-10-18 13:57:14 | 显示全部楼层 |阅读模式
1.安装更新了debian squeeze 中的udev 重新生成了initramfs.img
                depkg -reconfigure udev

2. 重启之后出现问题
               mounting: mount /dev/sda1  on /root failed . No such device
                mounting: /sys  on /root/sys failed. No such file or directory
                mounting: /proc  ....
                mounting: /dev   ....
             之后进入busy box,提示符如下
                (initramfs)
3.
                PS:

                /dev/sda1 处是grub传递的启动参数(root=/dev/sda1),
                          尝试过root=UUID=XXXX root=(hd0,1) 均出现错误
                           mounting: mount /dev/disk/by-uuid/XXXX on /root failed.
                          mountint: mount (hd0,1) on /root failed.
                /root 是当前文件系统根目录(initramfs的 / 目录)的一个文件夹(/root)
                /sys /proc /dev 都是当前根目录的文件夹
               grub 版本是 grub2 1.98 之前启动正常


4.尝试手动挂载 /dev/sda1 到 /root 目录成功
              mount -r -t ext3 /dev/sda1 /root
              之后手动挂载 /proc /sys /dev 到 /root/proc /root/sys /root/dev 都成功
                mount /proc /root/proc
               mount /sys /root/sys
                mount /dev /root/dev
              之后手动运行 chroot 到 /root 目录并运行 /etc/init.d/rc S 也成功
                chroot /root /etc/init.d/rc S
                但是还是在chroot 环境中,并且不能运行 init 0 或 init 6 (提示没有 /dev/initctl 文件
                 手动创建 之后 也还是不能运行  mkfifo /dev/initctl )
                而且 stdin stdout stderr 没有和终端(屏幕) 关联( 提示 不能打开 /dev/tty ),
                没有 job control 功能
              尝试重新生成 initramfs.img 文件,结果重启后更糟
                     dpkg -reconfigure udev

5. 网上查了资料后 尝试运行 /bin/run-init 导致 kenel panic
                    exec /bin/run-init
                 运行 /init ,同样导致 kenel panic


6.问题应该在  将硬盘根目录 挂载在 /root 目录下的步骤
              手动挂载应该也可以,但是不知道 具体的步骤 命令
             7. 求 怎么样从当前的环境(busy box) 进入正常的系统
                还有 如何配置 initramfs.img 让它正确的 mount /dev/sda1 到 / (根目录)


  initramfs 中的init文件如下

#!/bin/sh

echo "Loading, please wait..."

[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
[ -d /tmp ] || mkdir /tmp
mkdir -p /var/lock
mount -t sysfs -o nodev,noexec,nosuid none /sys
mount -t proc -o nodev,noexec,nosuid none /proc

# Note that this only becomes /dev on the real filesystem if udev's scripts
# are used; which they will be, but it's worth pointing out
tmpfs_size="10M"
if [ -e /etc/udev/udev.conf ]; then
        . /etc/udev/udev.conf
fi
mount -t tmpfs -o size=$tmpfs_size,mode=0755 udev /dev
[ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
[ -e /dev/null ] || mknod /dev/null c 1 3
> /dev/.initramfs-tools
mkdir /dev/.initramfs

# Export the dpkg architecture
export DPKG_ARCH=
. /conf/arch.conf

# Set modprobe env
export MODPROBE_OPTIONS="-qb"

# Export relevant variables
export ROOT=
export ROOTDELAY=
export ROOTFLAGS=
export ROOTFSTYPE=
export IP=
export break=
export init=/sbin/init
export quiet=n
export readonly=y
export rootmnt=/root
export debug=
export panic=
export blacklist=
export resume_offset=

# Bring in the main config
. /conf/initramfs.conf
for conf in conf/conf.d/*; do
        [ -f ${conf} ] && . ${conf}
done
. /scripts/functions

# Parse command line options
for x in $(cat /proc/cmdline); do
        case $x in
        init=*)
                init=${x#init=}
                ;;
        root=*)
                ROOT=${x#root=}
                case $ROOT in
                LABEL=*)
                        ROOT="${ROOT#LABEL=}"

                        # support any / in LABEL= path (escape to \x2f)
                        case "${ROOT}" in
                        */*)
                        if command -v sed >/dev/null 2>&1; then
                                ROOT="$(echo ${ROOT} | sed 's,/,\\x2f,g')"
                        else
                                if [ "${ROOT}" != "${ROOT#/}" ]; then
                                        ROOT="\x2f${ROOT#/}"
                                fi
                                if [ "${ROOT}" != "${ROOT%/}" ]; then
                                        ROOT="${ROOT%/}\x2f"
                                fi
                                IFS='/'
                                newroot=
                                for s in $ROOT; do
                                        newroot="${newroot:+${newroot}\\x2f}${s}"
                                done
                                unset IFS
                                ROOT="${newroot}"
                        fi
                        esac
                        ROOT="/dev/disk/by-label/${ROOT}"
                        ;;
                UUID=*)
                        ROOT="/dev/disk/by-uuid/${ROOT#UUID=}"
                        ;;
                /dev/nfs)
                        [ -z "${BOOT}" ] && BOOT=nfs
                        ;;
                esac
                ;;
        rootflags=*)
                ROOTFLAGS="-o ${x#rootflags=}"
                ;;
        rootfstype=*)
                ROOTFSTYPE="${x#rootfstype=}"
                ;;
        rootdelay=*)
                ROOTDELAY="${x#rootdelay=}"
                case ${ROOTDELAY} in
                *[![:digit:].]*)
                        ROOTDELAY=
                        ;;
                esac
                ;;
        nfsroot=*)
                NFSROOT="${x#nfsroot=}"
                ;;
        ip=*)
                IP="${x#ip=}"
                ;;
        boot=*)
                BOOT=${x#boot=}
                ;;
        resume=*)
                RESUME="${x#resume=}"
                ;;
        resume_offset=*)
                resume_offset="${x#resume_offset=}"
                ;;
        noresume)
                noresume=y
                ;;
        panic=*)
                panic="${x#panic=}"
                case ${panic} in
                *[![:digit:].]*)
                        panic=
                        ;;
                esac
                ;;
        quiet)
                quiet=y
                ;;
        ro)
                readonly=y
                ;;
        rw)
                readonly=n
                ;;
        debug)
                debug=y
                quiet=n
                exec >/dev/.initramfs/initramfs.debug 2>&1
                set -x
                ;;
        debug=*)
                debug=y
                quiet=n
                set -x
                ;;
        break=*)
                break=${x#break=}
                ;;
        break)
                break=premount
                ;;
        blacklist=*)
                blacklist=${x#blacklist=}
                ;;
        esac
done

if [ -z "${noresume}" ]; then
        export resume=${RESUME}
else
        export noresume
fi

depmod -a
maybe_break top

# Don't do log messages here to avoid confusing usplash
run_scripts /scripts/init-top

maybe_break modules
log_begin_msg "Loading essential drivers"
load_modules
log_end_msg

maybe_break premount
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-premount"
run_scripts /scripts/init-premount
[ "$quiet" != "y" ] && log_end_msg

maybe_break mount
log_begin_msg "Mounting root file system"
. /scripts/${BOOT}
parse_numeric ${ROOT}
maybe_break mountroot
mountroot
log_end_msg

maybe_break bottom
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-bottom"
run_scripts /scripts/init-bottom
[ "$quiet" != "y" ] && log_end_msg

# Move virtual filesystems over to the real filesystem
mount -n -o move /sys ${rootmnt}/sys
mount -n -o move /proc ${rootmnt}/proc

# Check init bootarg
if [ -n "${init}" ] && [ ! -x "${rootmnt}${init}" ]; then
        echo "Target filesystem doesn't have ${init}."
        init=
fi

# Search for valid init
if [ -z "${init}" ] ; then
        for init in /sbin/init /etc/init /bin/init /bin/sh; do
                if [ ! -x "${rootmnt}${init}" ]; then
                        continue
                fi
                break
        done
fi

# No init on rootmount
if [ ! -x "${rootmnt}${init}" ]; then
        panic "No init found. Try passing init= bootarg."
fi

maybe_break init

# don't leak too much of env - some init(8) don't clear it
# (keep init, rootmnt)
unset debug
unset MODPROBE_OPTIONS
unset DPKG_ARCH
unset ROOTFLAGS
unset ROOTFSTYPE
unset ROOTDELAY
unset ROOT
unset IP
unset blacklist
unset break
unset noresume
unset panic
unset quiet
unset readonly
unset resume
unset resume_offset

# Chain to real filesystem
exec run-init ${rootmnt} ${init} "$@" <${rootmnt}/dev/console >${rootmnt}/dev/console
panic "Could not execute run-init."
 楼主| 发表于 2010-10-18 18:12:19 | 显示全部楼层
mount 问题解决,新问题又出现了
mount:/dev/sda1 on /root : No such device
原因是设备文件系统的类型不正确。
udev 自动生成的脚本里 get_fstype函数没能正确获取文件格式
通过在grub 传给 kenel的参数里设置 rootfstype=ext3 即可解决问题

新问题是
/scripts/init-bottom/udev :line28 nuke :not found
继续解决。。
回复 支持 反对

使用道具 举报

发表于 2010-10-18 19:51:20 | 显示全部楼层
重装更省事。

不知所云,升级 udev 于 initrd 末直接关系,乱搞。

莫非是 lenny 强行升级 squeeze 中 udev?
回复 支持 反对

使用道具 举报

发表于 2010-10-18 20:19:05 | 显示全部楼层
你的/etc/fstab是直接使用/dev/sda1的么?

建议你换成uuid试一下
用ls -l /dev/disk/by-uuid找到磁盘对应的uuid,然后修改/etc/fstab类似如下:

UUID=<uuid>          /   ext4   defaults        0       2
回复 支持 反对

使用道具 举报

发表于 2010-10-18 20:52:54 | 显示全部楼层
问题在于你的分区类型标志是否为 0x83 ,从 Windows 过来很多常因此引起些莫名其妙的问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-10-18 20:57:39 | 显示全部楼层
Post by 聚焦深空;2116317
重装更省事。

不知所云,升级 udev 于 initrd 末直接关系,乱搞。

莫非是 lenny 强行升级 squeeze 中 udev?

重装更新软件,配置个人设置,更麻烦。

升级udev ->  configure ->  重新 generate initrd.img.gz
文件 -> 重启就死在initramfs里了

一开始是lenny 现在是lenny+squeeze+sid
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-10-18 21:05:54 | 显示全部楼层

SolveD

问题出现了可以解决,也可以绕过去。

chroot进入系统后,使用mkinitramfs重新做了一下initrd.img.gz
重启后有关于udev的提示,但可以正常进入系统了。
   
原来配置的时候使用dpkg配置的,具体怎么生成不太清楚。
现在用另一个就好了。
回复 支持 反对

使用道具 举报

发表于 2010-10-18 21:09:08 | 显示全部楼层
Post by enpersuen;2116344
重装更新软件,配置个人设置,更麻烦。

升级udev ->  configure ->  重新 generate initrd.img.gz
文件 -> 重启就死在initramfs里了

一开始是lenny 现在是lenny+squeeze+sid


你的系统好乱, 建议升级到squeeze或者sid,避免由于软件版本不一致或依赖关系导致的问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-10-18 21:09:57 | 显示全部楼层
Post by blue_stone;2116337
你的/etc/fstab是直接使用/dev/sda1的么?

建议你换成uuid试一下
用ls -l /dev/disk/by-uuid找到磁盘对应的uuid,然后修改/etc/fstab类似如下:

UUID=<uuid>          /   ext4   defaults        0       2


问题出在init没有运行成功,还在内核启动的阶段
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-10-18 21:25:08 | 显示全部楼层
Post by blue_stone;2116347
你的系统好乱, 建议升级到squeeze或者sid,避免由于软件版本不一致或依赖关系导致的问题。


条件限制 只能在windows下上网。
debian更新方式很难没有依赖关系问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表