系统启动时遇到“设备忙”问题的解决

今天做了一个实验,碰到了一个问题。

实验是这样的:

为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;

(1) 为硬盘新建两个主分区;并为其安装grub;

(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;

(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;

(4) 为grub提供配置文件;

(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;

这是我的实验步骤:

(1) 为硬盘新建两个主分区;并为其安装grub;

将新添加的磁盘/dev/sdc分为三个主区,其中一个作为swap分区:

[[email protected] ~]# fdisk -l /dev/sdc

Disk /dev/sdc: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x8a6c3caa

  Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1          26      208813+  83  Linux
/dev/sdc2              27         680     5253255   83  Linux
/dev/sdc3             681         942     2104515   82  Linux swap / Solaris

强制内核重读分区表:

[[email protected] ~]# partx -a /dev/sdc

格式化分区:

[[email protected] ~]# mke2fs -t ext4 /dev/sdc1
[[email protected] ~]# mke2fs -t ext4 /dev/sdc2
[[email protected] ~]# mkswap /dev/sdc3

创建挂载点:

[[email protected] ~]# mkdir /mnt/boot

将两个主分区区别挂载至挂载点:

[[email protected] ~]# mount /dev/sdc1 /mnt/boot/

为新添加的/dev/sdc硬盘安装grub:

[[email protected] ~]# grub-install --root-directory=/mnt/sysroot/ /dev/sdc

(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;

[[email protected] ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz
[[email protected] ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.im
g

根据FHS创建rootfs必要目录:

[[email protected] ~]# mkdir /mnt/sysroot//创建挂载点;
[[email protected] ~]# mount /dev/sdc2 /mnt/sysroot///挂载rootfs;
[[email protected] ~]# cd /mnt/sysroot/
[[email protected] sysroot]# mkdir -pv etc bin sbin lib lib64 tmp mnt media home root dev 
selinux usr var proc sys

(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;

首先复制bash、ls、cat程序:

[[email protected] ~]# cp /bin/bash /mnt/sysroot/bin/
[[email protected] ~]# cp /bin/ls /mnt/sysroot/bin/
[[email protected] ~]# cp /bin/cat /mnt/sysroot/bin/

接着复制ls程序的库文件:

[[email protected] ~]# ldd /bin/ls
linux-vdso.so.1 =>  (0x00007fff32bda000)//应用程序访问库文件的入口;
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003eff200000)
librt.so.1 => /lib64/librt.so.1 (0x0000003efe600000)
libcap.so.2 => /lib64/libcap.so.2 (0x000000341d800000)
libacl.so.1 => /lib64/libacl.so.1 (0x000000341b800000)
libc.so.6 => /lib64/libc.so.6 (0x0000003efde00000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003efda00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003efd600000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003efe200000)
libattr.so.1 => /lib64/libattr.so.1 (0x000000341b400000)
[[email protected] ~]# 
[[email protected] ~]# cp /lib64/libselinux.so.1 /mnt/sysroot/lib64/    
[[email protected] ~]# cp /lib64/librt.so.1 /mnt/sysroot/lib64/
[[email protected] ~]# cp /lib64/libcap.so.2 /mnt/sysroot/lib64/
[[email protected] ~]# cp /lib64/libacl.so.1 /mnt/sysroot/lib64/
[[email protected] ~]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/
[[email protected] ~]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
[[email protected] ~]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/
[[email protected] ~]# cp /lib64/libpthread.so.0 /mnt/sysroot/lib64/
[[email protected] ~]# cp /lib64/libattr.so.1 /mnt/sysroot/lib64/

以同样的方式复制bash、cat程序的库文件。

(4) 为grub提供配置文件;

根据系统的启动流程可知:当设置硬盘为第一启动项时,第一个安装有引导程序的硬盘会被BIOS设置为要启动的硬盘,因为BIOS扫描顺序是从/dev/sda开始扫描的,而/dev/sda之上有grub,所以需要在/dev/sda之上的grub的配置文件中添加启动项,其指向/dev/sdc硬盘上的引导程序grub。

因此,需要编辑/boot/grub/grub.conf,在其中添加以下几项:

title CentOS 6 (Express)

root (hd2,0)

//这里表示为系统上第3块硬盘之上的第一个分区,即/dev/sdc之上的/dev/sdc1;

kernel /vmlinuz ro root=/dev/sdc2 selinux=0 init=/bin/bash

//指定要启动的内核文件;这里还需指定不开启selinux功能,并指定第一个启动的用户空间的程序是/bin/bash;

initrd /initramfs.img

//指定与该内核匹配的ramdisk文件,作为临时根文件系统,提供真正的根文件系统所在设备的驱动程序;

(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;

因为新添加的菜单项为/boot/grub/grub.conf的第三项,所以将/boot/grub/grub.conf中的default参数设置为2:

default=2

最后一步:同步后(sync)重启。

启动之后遇到以下问题:一直显示/dev/sdc2设备忙,但设备根本还没有挂载,更何况是使用。

后来通过读取/dev/sda上的MBR中的grub启动系统,使用fsck检查/dev/sdc设备,显示如下:

到这里问题就解决了,是这样的,用fsck检查了一下/dev/sdc2,信息提示说是磁盘的超级块损坏了,然后我就重新格式化了一下/dev/sdc2,重新创建FHS目录、复制程序和库文件,同步后再重启就可以了。

时间: 2024-10-06 13:42:09

系统启动时遇到“设备忙”问题的解决的相关文章

Ubuntu连接以太网时显示“设备未托管”的解决办法

Ubuntu连接以太网时显示"设备未托管"的解决办法 故障分析: 电脑之前可能设置过PPOE(有线宽带虚拟拨号),常见为连接校园拨号宽带. 解决办法: 第一步:打开终端 第二步:切换到root用户 第三步:切换到 /etc/network 目录下:cd /etc/network/ 第四步:键入vim interface进入编辑interfaces文件模式.最后一行内容的意思是说eth0需要手动配置连接,但是当前局域网是DHCP网络,也就是接入网络的电脑需要"自动获取IP地址&

coocs2d-html5在使用cocoseditor时调用设备的accelerometer来使用重力感应

在使用大牛touchsnow开发的插件cocoseditor开发游戏时遇到了一些问题,然后就试着解决,最近想试下coocs2d-html5能否使用重力感应,发现是可以的,不过这个只能在移动真机上测试,电脑上的模拟器是不行的, 首先需要在onDidloadFromCCB()方法内设置可以使用Accelerometer: this.rootNode.onAccelerometer = function (event) { this.controller.onAccelerometer(event);

SSH问题:系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 'beans' 的声明“异常

现象:spring加载配置文件applicationContext.xml出错,抛出nested exception is og.xml.sax.SAXParseException; lineNumber: 12; columnNumber: 47; cvc-elt.1: 找不到元素 'beans' 的声明r的异常信息. 造成该异常原因有两种: 第一,配置文件头部配置的xsd版本信息不正确,造成解析时出错.spring头部xsd或dtd校验文件的查找分两步,第一先从本地jar包中找,如果找到则用

谈谈Android系统启动时的那点事儿

Android系统完整的启动过程,从系统层次角度可分为Linux系统层.Android系统服务层.Zygote进程模型三个阶段:从开机到启动Home Launcher完成具体的任务细节可分为七个步骤,下面就从具体的细节来解读Android系统完整的初始化过程. 一.启动BootLoader Android 系统是基于Linux操作系统的,所以它最初的启动过程和Linux一样.当设备通电后首先执行BootLoader引导装载器,BootLoader是在操作系统内核运行之前运行的一段小程序.通过这段

系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 'beans' 的声明“异常

现象:spring加载配置文件applicationContext.xml出错,抛出nested exception is og.xml.sax.SAXParseException; lineNumber: 12; columnNumber: 47; cvc-elt.1: 找不到元素 'beans' 的声明r的异常信息. 造成该异常原因有两种: 第一,配置文件头部配置的xsd版本信息不正确,造成解析时出错.spring头部xsd或dtd校验文件的查找分两步,第一先从本地jar包中找,如果找到则用

系统启动时出现 An error occurred during the file system check.

系统配置的yum源是163的镜像站,本来想用lsb_release命令查看一下系统的版本等信息,结果显示没有此命令,那就安装其相关软件包吧,用yum -y install redhat-lsb相依属性列出了40个软件包,本来没想安装这么多,愣了个神还没有按 y 键呢系统自己就莫名其妙又继续了,继续就继续吧,中间还不断报错,这还不算,Ctrl+C键还结束不了,前些天用163更新软件包也出现了类似的错误和情况,40个包啊,检查一个包就error,error之后又尝试其他mirrors,这个时间就将近

ORACLE操作表时”资源正忙,需指定nowait"的解锁方法

ORACLE操作表时”资源正忙,需指定nowait"的解锁方法 问题: 执行 drop table table_name 时,提示”资源正忙,需指定nowait"      由于TB_PROJECT为设置主键造成只能查询而无法修改和删除的问题导致PL/SQL无响应,从而对此表一直处于锁定状态 分析: 表示table_name表由某个用户操作时进行了锁定,必须先解锁才能继续进行操作 解决: 1> 通过此语句查询正在锁定的SESSION_ID: SELECT  SESSION_ID 

win7,M?i?n?d?m?a?n?a?g?e?r?2?0?1?2使用模板时弹出Runtime error R6025解决方法

Mindjet.MindManager2012.v10.0在应用个别模板时提示"参数错误",然后自动关闭. 解决办法: 如果是win7系统,可以进入C:\Users\(用户名)\AppData\Local\Mindjet\MindManager\10\Library\ENU\Templates, 可以看到如下模板:Management/Meetings and Events/Personal Productivity/Problem Solving/Project Management

universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法

在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使用UIL遇到了这个问题,相信这个问题许多使用UIL的人都碰到过 现在把解决方法贴出来给有同样问题的朋友做参考 先看下UIL的工作流程 在已经允许内存,存储卡缓存的前提下,当一个图片被请求display时,首先要判断图片是否缓存在内存中,如果false则尝试从存储卡读取,如果依然不存在最后才从网络地址