寻觅生命中的那一片浅草......

文章带标签 Linux

定制的CentOS,提示无法挂载根分区

定制的CentOS5.4系统无法启动,应该是去到挂载磁盘的时候,提示
VFS:Cannot open root device “sda2” or unknown block(0,0);
Please append a correct “root=” boot option
kernel panic -not syncing:VFS:Unable to mount root fs on unknown block(0,0)

网上查资料说是因为编译内核的时候,没有把scsi的驱动编译进内核,但用的内核是CentOS5.4自带的,如果用完整光盘安装,则不会有错
初步怀疑安装过程出错,用光盘启动进入修复模式
光盘启动后输入
linux rescue
然后按2次确定吧,系统挂载到/mnt/sysimage
chroot /mnt/sysimage,这时就进入到硬盘上的系统了
首先看下grub.conf
cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda2
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-164.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/1

再找台可以正常启动的机器看下
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda2
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-164.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/1
initrd /initrd-2.6.18-164.el5.img

现在看到前面有问题的系统,配置文件里少了一行关于initrd的配置
本来想手动加上去,但
ls /boot/
发现根本没有initrd-2.6.18-164.el5.img
记得上次看刘天斯的<<编译内核及制作RPM包>>
文件见
http://blog.liuts.com/post/180/

里面说到initrd-2.6.18-164.el5.img不是包含在rpm包里的,而是要在安装过程生成的

想到要看下/root目录下的install.log,看安装过程出了什么问题
vi /root/install.log

关键错误
/sbin/mkinitrd:line 1367:mktemp:command not found
Error creating temporaries. Try again
mkinitrd failed

去到正常的系统里
which mktemp
输出:/bin/mktemp
rpm -qf /bin/mktemp
输出:
mktemp-1.5-23.2.2

把mktemp-1.5-23.2.2复制到目录,然后重新生成ISO文件,再安装系统,启动就正常了

需要注意的是,再看下/root/install.log,看报什么错,如果是关键错误,要看如何修复

############################延伸阅读######################
内核引导文件initrd.img简介

http://netbay.bokee.com/3353657.html
作者:coolq 更新日期:2005-08-22
来源:linuxforum.net

什么是initrd?
initrd = init ramdisk,是一个启动时存在于内存的文件系统。 initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的 方式放在 initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的情况下, 通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上。

Linux启动一定要用initrd么?
不必,如果把需要的功能全都编译到内核中(非模块方式),只需要一个内核文件即可,initrd能够减小启动内核的体积并增加灵活性。如果你的内核以模块 方式支持某种文件系统(例如ext3, UFS),而启动阶段的驱动模块(如jbd)放在这些文件系统上,内核是无法读取文件系统的,从而只能通过initrd的虚拟文件系统来装载这些模块。这 里有些人会问: 既然内核此时不能读取文件系统,那内核的文件是怎么装入内存中的呢?答案很简单,Grub是file-system sensitive的,能够识别常见的文件系统。

initrd文件是怎么生成的?
使用mkinitrd命令,这个命令其实是一个Bash脚本
#file `which mkinitrd`
/sbin/mkinitrd: Bourne-Again shell script text executable
该脚本先建立一个8M的空文件,并在此上建立一个文件系统,并拷贝相应的的文件。

查看initrd里面的文件
mkdir /root/initrd
cd /root/initrd
cp /boot/initrd-2.6.18-164.el5.img .
mv initrd-2.6.18-164.el5.img initrd-2.6.18-164.el5.img.gz
gunzip initrd-2.6.18-164.el5.img.gz
file initrd-2.6.18-164.el5.img
输出:initrd-2.6.18-164.el5.img: ASCII cpio archive (SVR4 with no CRC)
cpio -idmv < initrd-2.6.18-164.el5.img
ls
可以看到以下目录和文件
bin dev etc init lib proc sbin sys sysroot

The CentOS CD was not found in any of your CDROM drives

These days I customize CentOS5.4,I boot my ISO on vm , after I select languages and keyboard type, I meet this error:
The CentOS CD was not found in any of your CDROM drives.Please insert the CentOS CD and press OK to retry.

I compare the files of the offical ISO and my ISO, I find a file named “.discinfo” is not present in my ISO.Copy it to my ISO and the problem is solved.

Now I know “cp -a” will not handle the hidden file.

MySQL报错:my_global.h151615 error new No such file or directory

今天安装MySQL,在make的时候报错,错误信息如下:

In file included from mysys_priv.h:16,
from my_new.cc:21:
../include/my_global.h:1516:15: error: new: No such file or directory
make[1]: *** [my_new.o] Error 1
make[1]: Leaving directory `/opt/mysql-5.1.45-10/mysys’
make: *** [all-recursive] Error 1

检查了操作系统版本等情况,都没问题,configure时也没报错,可以正常产生Makefile

将有问题服(假设是A机)的config.log和另外一台正常服(假设是B机)的config.log做对比

发现A机,有2处比较严重的报错

conftest.c:181:21: error: termcap.h: No such file or directory
conftest.cpp:314:20: error: cxxabi.h: No such file or directory

在B机上
updatedb

for i in `locate termcap.h`; do rpm -qf $i; done |uniq
输出:
libtermcap-devel-2.0.8-46.1
ncurses-devel-5.5-24.20060715
dev86-0.16.17-2.2

for i in `locate cxxabi.h`; do rpm -qf $i; done |uniq
输出:

libstdc++-devel-4.1.2-48.el5
libstdc++44-devel-4.4.0-6.el5
xulrunner-devel-1.9.0.18-1.el5_4

到A机上用rpm -qa查询libtermcap-devel,ncurses-devel,dev86,libstdc++-devel,libstdc++44,xulrunner-devel的安装情况
发现libtermcap-devel,dev86,libstdc++-devel没有安装

yum -y install libtermcap-devel dev86 libstdc++-devel

然后再make,就没有报错了

[转]在64位的 CentOS 上只安装64位的软件包

在 64位版本的 CentOS 5.4 上使用 yum 安装软件包的时候如果不小心的话会同时安装 i386 和 x86_64 版本的软件,如下面安装的 httpd-devel 就有 i386 和 x86_64 两个版本:

引用
# yum install httpd-devel

Dependencies Resolved

================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
httpd-devel i386 2.2.3-31.el5.centos.2 updates 147 k
httpd-devel x86_64 2.2.3-31.el5.centos.2 updates 147 k
Installing for dependencies:

同时安装32位和64位版本的软件虽然不是什么错,也不会对系统造成什么问题,但是这样会浪费硬盘空间,而且显得系统臃肿、不干净。如果想要保持一个纯的64位系统、在64位 CentOS 上避免安装32位软件包的话很容易,只需要在 yum.conf 加上一行过滤掉 i386, i686 的软件包就可以了:

引用
# vi /etc/yum.conf
[main]

exclude=*.i?86

然后删除系统上已经按照的 i386/i686 包:

# vi /etc/yum.conf
# yum remove \*.i\?86

[转]Bash获得子进程返回值的方法

我们用“&”把进程放入后台以后,如果需要了解进程的执行情况,可以使用wait函数。默认情况下wait会等待任意子进程结束但是不会返回子进程的返回值。而以子进程的pid作为参数调用wait时,wait便能够返回该子进程的退出状态了。
具体操作如下:

#!/bin/bash
command1 &
command2 &
command3 &
for pid in $(jobs -p)
do
wait $pid
[ “x$?” == “x0” ] && ((count++))
done

这里我们借助了“jobs -p“来获得所有后台进程的pid。

2025年五月
« 5月    
 1234
567891011
12131415161718
19202122232425
262728293031