你好:

     感谢你访问我的 Blog ,本博客只提供博主的技术经验分享,你可以在此做简单的留言和评论,我会抽空回复你;若是要深入交流探讨,请联系QQ:47853253或者加QQ群:12012081


 

新【核心机】换硬盘重做系统小记

使用ghost对拷Linux系统硬盘数据  :

直接启动机器,在DOS下运行ghost,Disk to disk对拷,飞快结束。发现被拷贝的盘分区结构变了,但是没数据。



搜索了不少帖子,说ghost没法备份和拷贝Linux系统的硬盘数据。说是推荐用g41或dd,还有说直接cat的。不过g41那个iso比较大,貌似70多M,但可以通过网络来备份和恢复。



后来终于找到了直接用ghost对拷的方法,运行ghost的时候加上-IA参数,就可以了。(就是一个扇区一个扇区的拷)



某日又遇到了问题,两个相同大小的磁盘,对拷的时候出现Destination drive may be too small(40011)。百度上有价值的东西毛都没搜到。这个也没啥办法,人家是中文搜索引擎,专门搜八卦和垃圾信息的,技术问题还是要问Google。最后结论是:

BIOS设置不对或ghost对磁盘大小的检测有问题,这个老外有文章说明

Ghost Will Not Use All Space On a Drive.

不用点这个链接了,Symantec已经把文章删了。。。

解决方法是使用-FIS参数调用ghost

因此,最好是用ghost -ia -FIS来对拷磁盘。(我当时用的是ghost 8.3,或许ghost11已经没有这个bug了~)

_________________________________________________________________________

ghost恢复hxhx.gho之后,linux最后一个分区无法访问:
进入live cd。将最后个一个分区用gpart工具格式化EXT3,然后,将gho文件中的最后一个分区拷出来覆盖进去。live CD 下能识别fat分区。如果无法粘贴进入新分区:
你需要获取权限:
ctrl+alt+t打开一个终端
sudo passwd root
输入密码:
再次输入密码:

然后注销,用root和你新设置的密码登录。这会子就可以粘贴了。
粘贴之后,修改权限:
所有者:我 读写 创建和删除
组:root   读写   创建和删除
其它:   读写   创建和删除
更改文件和文件夹权限——读写——创建和删除


ubuntu下几个重要的内核文件可编译来支持更多的设备:
1.fstab   vfstab
2.menu.list
3.device.map
4.grub
5.sysctl.conf
6.initrd或initrd.img   以及initrd-4.0或initrd-4.0.img
________________________________________________________________________

解决CentOS/Ubuntu/Fedora/RHEL Linux下硬盘切换到AHCI模式后无法启动的办法:


---==很拽的分割线==-------=======knityster -=编织者=======------很拽的分割线------======-----

起因:
安装Linux的时候硬盘没有采用AHCI模式,所以编译内核的时候没有加入AHCI支持


---==很拽的分割线==-------=======knityster -=编织者=======------很拽的分割线------======-----

解决办法:
1. 在BIOS 中将硬盘模式先修改为IDE, 然后正常进入Linux

2. 备份已有文件
su - root
mkdir /boot/backup
mv /boot/initrd-2.6.18-128.el5xen.img /boot/backup/initrd-2.6.18-128.el5xen.img
cp /etc/modprobe.conf /etc/modprobe.conf.bak

3. 修改配置文件
geidt /etc/modprobe.conf
在:
alias scsi_hostadapter ata_piix
后添加如下内容:
alias scsi_hostadapter ahci

4. 重新编译内核

先查看当前内核版本号:
uname -r
2.6.18-128.el5xen

然后重新编译内核,格式:
mkinitrd --preload ahci <内核存放路径和名称> <内核版本号>
内核存放路径和名称: 即为之前保存的内核的路径和名称
内核版本号:即为上面使用uname -r 查询出来的内容

实例:
cd /boot
mkinitrd --preload ahci /boot/initrd-2.6.18-128.el5xen.img 2.6.18-128.el5


5. 重启,进入BISO,将硬盘模式修改为AHCI后重新进入Linux即可。



______________________________________________________________________

Ubuntu 7.04 多个硬盘导致无法启动的问题 :

进度条前进了一小格之后就不动了。
用ctrl+alt+f1切换看到如下信息:

failed to set xfermode (err_mask=0x40) 启动参数中加入irqpoll后就可以正常启动了:


/boot/vmlinuz-2.6.20-16-generic root=UUID=a698723a-4562-4169-89dd-efa56751d19a ro quiet splash irqpoll

_________________________________________________________________

linux内核探索:定制自己的initrd.img-:


1. 什么是initrd.img,它有什么用?
initrd.img是Linux启动过程中很重要的一个文件,如果你编译内核时将一部分功能编译为可加载模块。如果系统的一些设备的驱动编译为可加载模,那么启动时如果没有指定INITRD=/path_to_initrd.img,那么系统启动或者会失败,或者启动后会有设备无法使用(像网卡或者其它设备)。
如果没指定initrd.img或者指定的initrd.img中并没有包含正确的驱动模块,则系统启动时会挂起,并报告"kernel panic: VFS: Unable to mount root fs on 08:06"的错误。

2. 拆解initrd.img
很庆幸initrd.img可以进行拆解,或许这正是设计者高明所在。initrd.img不像通常的以.img为扩展名的ramdisk cramfs文件。它是经过用gzip -9进行压缩过的ramdisk文件。所以,如果直接用#mount initrd.img /temppath -o loop不能mount上,会报告你指定一个文件类型。 所以我拆解它的过程要先将其进行解压缩,然后再mount。

cd /lib/modules/kernel_version
mkinitrd /tmp/initrd-kernel_version.img kernel_version
cd /tmp
mv initrd-kernel_version.img initrd-kernel_version.img.gz
gunzip initrd-kernel_version.img.gz
mkdir /mnt/tmp
mount -o loop initrd-kernel_version.img /mnt/tmp <--mount成功后,/mnt/tmp目录中将能看到initrd-kernel_version.img中的所有文件及目录
cp -a /mnt/tmp/* /tmp/initrd.new <--拷贝一份方便编辑
umount /mnt/tmp
cd /tmp/initrd.new
切换到/tmp/initrd.new目录后,你可以按需要进行编辑。比如更新一些设备驱动模块,或者对其中的一些启动过程中会执行的shell script进行修改。
所有想要的修改完成后,进行打包生成新的initrd.img文件。方法如下:
mkcramfs /tmp/initrd.new /tmp/newinitrd
gzip -9 /tmp/newinitrd /tmp/newinitrd.gz
mv /tmp/newinitrd.gz /tmp/initrd-kernel_version.img

3. 定制自已的initrd.img
我修改initrd.img的起因还是归于用的那台Dell precision 470 及要用OSCAR4.1组建一个linux cluster(正在进行中,尚未完成)。OSCAR4.1包中所用的SystemImager3.2.2-1带的用于网络引导客户机的BOEL-kernel-2.4.25和initrd.img不支持Dell precision 470的Adaptec39320B HostRaid Control Card。此外,在上面装RedHat 9.0后进行内核重编译时,可能因为mkinitrd或者9.0内核版本的原因,生成的img文件无法使用。在此以我实际遇到的问题,主要讲讲更新initrd.img中的硬件驱动模块的方法,抛砖引玉。

模块跟kernel的版本相关,直接的用其它支持你硬件但kernel版本不同的模块进行替换通常不会成功,所以最好到kernel.org上下载所需要的kernel版本的源程序包。我解决我上面的问题的文法就是下载了Linux-2.4.25.tar.gz源程序,并解压到/usr/src目录,之后到adaptec.com网站下载到支持39320B HostRaid的适合linux-2.4版的驱动源程序,并解压替换2.4.25内核源程序中的驱动程序源代码。之后对内核进行重新编译(在本文不详述具体方法,网上有很多相关资料,或许有时间我会写一篇),用make menuconfig时最好直接选上随着原来kernel & initrd.img在一起的config文件。如果不出错,执行make modules_install后就生成了需要的模块(通常在目录/lib/modules/kernel-version)。之后我用新的/lib/modules/kernel-version/lib/下的modules目录及其文件替换掉旧的initrd.img中的modules目录(当然先得拆解之,方法见第2部分)。

备注:通过cpio -i < initrd-kernel_version.img同样可以实现。

_______________________________________________________________________________

linux的启动流程(initrd.img):
http://www.ibm.com/developerworks/cn/linux/l-initrd.html
http://www.linuxfly.org/post/94_1_1.htm

一、从哪里到哪里
本文旨在描述linux中内核如何调用启动,然后如何从img的文件系统切换到硬盘的过程。
描述起于:linux-2.6.11/init/main.c中函数 static int init(void * unused)
描述止于:/etc/rc.d/rc.sysinit文件的被调用

二、描写流程
在linux代码linux-2.6.11/init/main.c中init这个函数被调用时,初始启动的文件
系统镜像:/boot/initrd-2.6.11.12.img(以2.6.11.12内核为例)已被grub加载到
内存中,并已挂载到根目录上("/")。


1、我们先来看看initrd-2.6.11.12.img到底是个什么东西:
[root@wj-server1 tmp]# cd /tmp
[root@wj-server1 tmp]# cp /boot/initrd-2.6.11.12.img /tmp/initrd-2.6.11.12.gz
[root@wj-server1 tmp]# gunzip initrd-2.6.11.12.gz
解压缩后的文件为:
[root@wj-server1 tmp]# ls -l initrd-2.6.11.12
-rw-r--r-- 1 root root 846848 7月 31 17:01 initrd-2.6.11.12
是一个CPIO格式的文件,该文件格式是种文件镜像让我们将它解开到一个目录中看看
其中的具体内容:
[root@wj-server1 tmp]# mkdir initrd
[root@wj-server1 tmp]# cd initrd
[root@wj-server1 initrd]# cpio -i < ../initrd-2.6.11.12
1654 blocks
[root@wj-server1 initrd]# ls
bin bootsplash dev etc init lib loopfs proc sbin sys sysroot
[root@wj-server1 initrd]# find .
.
./lib
./bin
./bin/nash
./bin/insmod
./bin/modprobe
./bin/hotplug
./etc
./dev
./dev/console
./dev/null
./dev/ram
./dev/systty
./dev/tty1
./dev/tty2
./dev/tty3
./dev/tty4
./loopfs
./proc
./sys
./sysroot
./sbin
./init
./bootsplash

可见该镜像文件目录中包括:

/bin 目录下的四个用于启动和切换到硬盘上的程序:
nash(用于处理根目录下的/init脚本)、insmod和modprobe来加载内核驱动、hotplug用
于外设的拔插处理。

/dev 目录下的八个设备文件

/init 是个nash的启动脚本文件

/bootsplash 是内核打了bootsplash补丁后,会在对该文件进行读取操作,然后将该文件
中包含的图片文件在启动时显示。
[root@wj-server1 initrd]# dmesg | grep -i bootsplash
bootsplash 3.1.6-2004/03/31: looking for picture... silentjpeg size 36270 bytes,
...found (1024x768, 19600 bytes, v3).
内核的这个装载信息就是在处理该文件。(具体的bootsplash的使用和创建这里不细说)。

附:CPIO文件的打包
[root@wj-server1 initrd]# cd /tmp/initrd
[root@wj-server1 initrd]# rm ../initrd-2.6.11.12
[root@wj-server1 initrd]# find . | cpio -c -o > ../initrd-2.6.11.12
1654 blocks
[root@wj-server1 initrd]# gzip ../initrd-2.6.11.12
[root@wj-server1 initrd]# mv ../initrd-2.6.11.12.gz ../initrd-2.6.11.12.img


2、回到内核init函数中,看看如何调用/boot/initrd-2.6.11.12.img中/init脚本的
....
// 这里判断在grub装载的/boot/initrd-2.6.11.12.img中是否有"/init"这个文件?
if (sys_access((const char __user *) "/init", 0) == 0)
execute_command = "/init"
else
....
// 如果有"/init"这个文件就先运行它。
if (execute_command)
run_init_process(execute_command);

run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");

panic("No init found. Try passing init= option to kernel");

由代码我们看到kernel会先判断并运行/boot/initrd-2.6.11.12.img中的/init文件,我们
来看看该/boot/initrd-2.6.11.12.img/init文件的内容,我们上面已将该文件展开到目录
/tmp/initrd中:
[root@wj-server1 initrd]# cat ./init
#!/bin/nash # 该文件是个nash的脚本文件

# 挂接proc文件系统
mount -t proc /proc /proc

# 不输出nash调试信息,由/proc/cmdline决定,cat /proc/cmdline我的启动参数
# 输出ro root=/dev/hda3 vga=791 splash=silent,如果该命令行中带了quiet参
# 数,则不输出nash提示信息。
setquiet

# 提示信息(这里提示因该放到上面去,mkinitrd-4.2.17-2mgc.rpm包中原来如是,
# 笔误?为什么这里牵涉到mkinitrd这个包类?因为:/boot/initrd-2.6.11.12.img
# 文件由下面命令生成:mkinitrd /boot/initrd-2.6.11.12.img 2.6.11.12)
echo Mounted /proc filesystem

# 挂接sys文件系统
echo Mounting sysfs
mount -t sysfs /sys /sys

# 创建/dev临时目录
echo Creating /dev
mount -o mode=0755 -t tmpfs /dev /dev

# 创建设备文件(这些设备文件在切换到硬盘后,由/etc/rc.sysinit中start_udev
# 重新创建)
mknod /dev/console c 5 1
mknod /dev/null c 1 3
mknod /dev/zero c 1 5

# 新建伪终端目录
mkdir /dev/pts
# 新建共享内存目录
mkdir /dev/shm

# 这里是调用的nash中的makedevs指令装载硬盘等块设备,不装载其他设备只装载
# 硬盘等块设备
echo Starting udev
# 告诉内核当发现新拔插设备时用"/sbin/hotplug"程序来处理
echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
makedevs
makedevs # 这里多搞一次没必要

echo Creating root device
# 由grub启动命令行root=/dev/hda3来联接设备/dev/root到root变量所指定的启动
# 设备,见下面我的grub启动参数:
# kernel /boot/vmlinuz-2.6.11.12 ro root=/dev/hda3 vga=791 splash=silent
mkrootdev /dev/root

# 挂接/dev/root目录
echo Mounting root filesystem
mount -o defaults --ro -t ext3 /dev/root /sysroot

echo Switching to new root
# 切换根目录到设备/dev/root目录,运行完该命令根目录"/"->"/dev/hda3"
switchroot --movedev /sysroot



由上面的注释我们大概能够明白./init脚本的基本运行流程:
a、装载基本的内核系统文件和设备文件
b、根据grub的启动命令行参数,判断root根文件设备,参看/boot/grub/grub.conf文件中制定
的参数,该参数在内核启动后可有cat /proc/cmdline显示出来,nash和其他的一些程序也是通
过读该系统文件来去内核启动参数的。
c、在将从grub启动参数中获得根设备并将其与/dev/root设备联接以后,通过nash的switchroot
指令将/dev/root设备挂接到根目录上("/")

看看这样操作后,留下的痕迹:
[root@wj-server1 initrd]# ls -l /dev/root
lrwxrwxrwx 1 root root 9 7月 31 12:06 /dev/root -> /dev/hda3
[root@wj-server1 initrd]# mount
/dev/hda3 on / type ext3 (rw)

到此为止,已将硬盘设备装载到根目录下了,从而取代了原来有initrd.img文件的根位置。



3、再回头看看内核中main.c中init函数,看看如何调用/sbin/init处理/etc/inittab文件
....
// 如果有"/init"这个文件就先运行它。
if (execute_command)
run_init_process(execute_command);

run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");

panic("No init found. Try passing init= option to kernel");

我们已经运行完run_init_process(execute_command);这里了,然后继续运行:
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");

/sbin/init这个文件在SysVinit-2.85-34mgc.rpm这个包中,该程序的主要处理代码在文件:
sysvinit-2.85/src/init.c中,该文件主要查找和处理/etc/inittab文件,按照该文件的内容
依次做处理。

[root@wj-server1 initrd]# cat /etc/inittab
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault: # /sbin/init 根据这里判断启动的级别

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit # /sbin/init 会最先运行这个系统配置文件

l0:0:wait:/etc/rc.d/rc 0 # /sbin/init 根据上面取得的级别运行相应
l1:1:wait:/etc/rc.d/rc 1 # 目录下的启动脚本
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-Delete
ca::ctrlaltdel:/sbin/shutdown -t3 -r now # 设置关机热键

# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1 # 建立6个登陆控制终端可以通过CTRL-ALT-F?
2:2345:respawn:/sbin/mingetty tty2 # 切换,'?'表示第几个登陆控制台,比如第1
3:2345:respawn:/sbin/mingetty tty3 # 个为F1,第2个为F2依次类推。F7为X11控制
4:2345:respawn:/sbin/mingetty tty4 # 台,后面就没有了,所以在X下可以很灵活
5:2345:respawn:/sbin/mingetty tty5 # 的切换到控制台下面操作。
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
x:5:once:/etc/X11/prefdm -nodaemon

通过内核中对/sbin/init的调用现在已经执行/etc/rc.d/rc.sysinit操作了。


____________________________________________________________________

修改 initrd.gz 文件 (法二):

2.6内核的 initrd.gz 解压后多是一个 cpio 格式的文件

可用 cpio 命令取档:


代码:
cp */initrd.gz .
gunzip initrd.gz
mkdir tmp
cd tmp
cpio  -iF ../initrd.gz



修改后,再把它做成 cpio 格式的包。

网上讲是用
代码:
find . | cpio -c -o | gzip -9  > ../initrd.gz


经试多次都不能启动,

查看 /usr/sbin/mkinitramfs

得知应这样才做


代码:
find . | cpio -L -o -H newc | gzip -9 > ../initrd.gz


-L 解除符号连接的关联

-H newc 是采用新型 (SVR4) 跨平台格式, 支持大于 65536 i节点 的 文件系统,不能启动主要是这个,因为缺省格式是老式的"bin"

经试,能成功启动,这样修改 initrd.gz 文件,比 mkinitramfs 形象、方便的多




_________________________________________________________________________

制作从硬盘起动 ubuntu live_cd 的 initrd.gz

由于内核版本不一样,所有做出来的 initrd.gz 不一定通用。
故将制作从硬盘起动 ubuntu live_cd 的initrd.gz的方法介绍如下:

原理:修改起动脚本,使其挂载硬盘上的分区,而不是光盘。

首先把光盘里的 casper 和 install 目录复制到根目录里:


代码:
sudo mount */ubuntu.iso /mnt -o loop
sudo cp -R /mnt/casper /  
sudo cp -R /mnt/install /
sudo umount /mnt


再挂载压缩的文件系统:

代码:
sudo mount /casper/filesystem.squashfs  /mnt -t squashfs -o loop


由于是只读的,所以把要修改的内容考贝过来:

代码:
sudo cp -R  /mnt/usr/share/initramfs-tools /


修改/initramfs-tools/scripts/casper

代码:
sudo gedit /initramfs-tools/scripts/casper


找到 find_cd() {*}

把它改为:(或者为自己的)


代码:
find_cd() {
   mounted=
        for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do
            devname=$(sys2dev "${sysblock}")
               for dev in $(subdevices "${sysblock}"); do
                    devname=$(sys2dev "${dev}")
                    case $(get_fstype "${devname}") in
                        vfat|iso9660|ntfs|etx3|udf|reiserfs)
                            mount -t $(get_fstype "${devname}") -o ro "${devname}" $mountpoint || continue
                            if casper_path $mountpoint; then
                                echo $(casper_path $mountpoint)
                                return
                            else
                                umount $mountpoint
                            fi
                            ;;
                    esac
                done
        done
}


现在再挂载回去:

sudo mount --bind /initramfs-tools /mnt/usr/share/initramfs-tools

由于 /mnt/tmp 不能写,所以也要挂载一个能写的过去:

mkdir /gaoxing
sudo mount --bind /gaoxing /mnt/tmp

好了准备好了就可以制作了:(很简单的)

代码:
sudo chroot /mnt /bin/bash
mkinitramfs -o /tmp/initrd.gz /lib/modules/2.6*


好了,大功告成,用它来起动吧(理论上可以从硬盘的vfat ntfs etx3 reiserfs分区上起动,也可从光盘起动)

从硬盘起动如下:(以前说过)

把 iso 里面的 casper 文件夹解压到一个盘的根目录下

再用光盘中的 inistall/vmlinuz 和我的这个 initrd.gz 起动

在 grub 的 menu.lst 配置文件中加入

代码:

引用:
title Kubuntu livecd

kernel */vmlinuz append boot=casper ramdisk_size=1048576 root=/dev/ram rw quiet debian-installer/locale=zh_CN splash

initrd */kubuntu_initrd.gz

boot

*/ 为你自己的路径

重起就行了

已经成功的使很多live_cd 从硬盘起动了,包括 6.06 中文件制定版。

________________________________________________________________



确定源盘和目标盘的设备文件名(/dev/sd*或/dev/hd*),
执行命令:dd if=源盘 of=目标盘 conv=noerror,sync
conv中参数的作用:
noerror
拷贝时遇到错误,则跳过,并继续执行
sync
拷贝时遇到错误,跳过此块可能导致后面的数据整体位置改变,加此参数可以用空数据填充目标文件中与错误块位置相同的部分,保证文件系统结构稳定。




dos下可以用fdisk /mbr清一下mbr.在linux下可以用dd命令实现:
mbr是512个字节,用0填充这个区域,这样mbr原先的数据就没有了。
dd if=/dev/zero  of=/dev/sda  bs=446 count=1
这样分区表也没有了:
dd if=/dev/zero  of=/dev/sda  bs=512 count=1
知道这些可以备份分区表:
dd if=/dev/sda  of=mbr.bak  bs=512 count=1
恢复分区表:
dd if=mbr.bak of=/dev/sda  bs=512  count=1


安装Grub:
sudo apt-get grub install


dd </dev/hda >;/root/mbr bs=512 count=1
grub-install /dev/sda
grub-install /mbr



修复GRUB

mkdir /mnt/sda7
mount /dev/sda7 /mnt/sda7
grub-install --root-directory=/mnt/sda7 /dev/sda //要注意格式和空格 ...



写MBR
sudo -i
grub
find /boot/grub/stage1
root (hd0,10)
setup (hd0)
quit



___________________________________________________________________________

         用ghost恢复GHO后到新硬盘后,启动到crying done
rebooting   不停重启。
    利用ubuntu live CD 进去,sudo passwd root,输入密码2次,之后su root 再次输入刚才设置的密码或sudo -i。
sudo fdisk -l -u 分区报错。 搜索live cd的应用,gparted 分区编辑工具进行重新分区。首先删除分区,此过程中如果报错,可能你需要重启电脑。重启之后再进live cd,打开gparted进行分区,分区如下:
sda1.主分区:boot   ubuntu的引导分区和主分区  3G  文件系统:ext3   格式为ext3
sda2.主分区:linux-swap分区    交换分区    3G   文件系统:linux-swap   格式为linux-swap  
sda3.逻辑分区:余下全部,ext3    格式为ext3
sda5.逻辑驱动:3G  ext3     格式为ext3
sda6.逻辑驱动:3G  ext3   格式为ext3
sda7.逻辑驱动:3G  ext3    格式为ext3
sda8.逻辑驱动:余下的所有   ext3   格式为ext3

保存之后,重启进入 win 2003 PE,进行逐个分区恢复,这样就可以修复分区报错。

完成之后需要修复GRUB:

核心机的/分区和boot分区就是sda1
在终端下输入


  sudo -i
    mkdir /media/mnt
    mount /dev/sda1 /media/mnt
    grub-install --root-directory=/media/mnt/ /dev/sda



————————————————————————————————————————————

修复ubuntu grub2引导的方法


ubuntu9.10的grub引导不在使用grub1了,改用grub2(其实是beta版本1.97~)。重装windows系统后,用原来的liveCD方法无法再修复了。只能用下面的两个方法了。

方法1.有grub启动的光盘或U盘修复

如果手上有grub启动的工具盘,用工具盘启动,在grub菜单上按c进入命令行状态,

在grub>提示符下输入

     grub>find /boot/grub/core.img (有/boot分区的用find /grub/core.img)

     (hdx,y) (显示查找到的分区号)

     grub>root (hdx,y)

     grub>kernel /boot/grub/core.img (/boot分区的用 kernel /grub/core.img)

     grub>boot

执行boot后能转入grub2菜单,启动ubuntu后,再在ubuntu终端下执行

     sudo grub-install /dev/sda (或sdb,sdc等,根据第几硬盘而定)修复grub。

      注意:如果ubuntu的启动分区使用ext4格式,要有支持ext4格式的grub才能修复。

方法2:使用liveCD修复grub     (推荐)

用ubuntu9.10的liveCD试用ubuntu启动后,打开终端

假如你的ubuntu的 / 分区是sda9,又假如 /boot分区是 sda6,在终端下输入


   sudo -i
     mount /dev/sda9 /mnt
     mount /dev/sda6 /mnt/boot (如果没 /boot 单独分区这步跳过)
     grub-install --root-directory=/mnt/ /dev/sda
  
和前面一样,要装入第二硬盘的把sda改为sdb。




我的文件系统为ext4,貌似U盘pe 的grub不支持,保险起见用liveCD修复的,修复后却无法引导windows了。可以用下面的方法解决:

       进入ubuntu系统,打开终端,

重建grub列表              sudo update-grub


重新写入第一分区mbr             sudo grub-install /dev/sda

如果想修改启动顺序,可以修改/boot/grub目录下的grub.cfg文件。这里注意此文件不可写的,可以先运行一下命令

sudo chmod +w /boot/grub/grub.cfg

然后再运行sudo gedit /boot/grub/grub.cfg,就可以修改了,类似于grub1的menu.lst修改。

如果大家想进一步了解gurb2,可以到Google Docs去看http://docs.google.com/Doc?docid=0AeVQ5PqmbeaoZGc0czgyOWtfMjRjbWo0ODVoYw&hl=en。在此感谢U坛的小苹果分享。

—————————————————————————————————————————————————


GRUB Loading stage2进不了系统

笔记本装完ghost系统后显示
GRUB Loading stage1.5
GRUB Loading Please Wait
Error 17
修复grub
利用ubuntu的cd进入liveCD的ubuntu后,打开一个终端,输入以下命令:
sudo grub    进入grub
find /boot/grub/stage1 找到安装grub的分区,显示:(hd0,x)
root (hd0,x) 设置root(/的挂载点)所在的分区注意root后有一空格
setup (hd0) 安装设置grub到hd0
quit 推出grub,重启后ok~
Linux系统清除Grub的几种方法







     Linux的grub是一个非常好的引导程序,它可以引导多操作系统。当windows和linux共存时,删除grub直接进入windows方法:
  方案1:用DOS命令fdisk恢复主引导扇区MBR(Main/Master Boot Record)---用win98的引导盘或DOS引导盘引导系统到纯DOS提示符下,执行:"fdisk /mbr"即可。
  方案2:在Linux系统中,恢复MBR。(如果你还能登陆到Linux系统中的话) ---在终端的命令提示符后输入: "dd if=/boot/boot.NNNN of=/dev/hda bs=446 count=1" 注意,其中bs(buffer size)是指重写的字节数。为什么不是512呢?主引导扇区是一个扇区(512字节呀),因为我们只是想通过扇面的命令修复系统MBR的引导或删除 Grub/LILO引导;而不是恢复整个主引导扇区。所以我们只把主引导扇区的备份文件boot.NNNN的前446个字节重写入主引导扇区。 boot.NNNN是我们在安装Linux之前整个主引导分区的备份。如果我们把512个字节全部写入主引导扇区就可能会把安装了Linux后改变了的硬盘DPT表也破坏掉。那就坏事了!!! (MBR的512字节中前446字节为引导程序,紧跟着后面64字节为分区表,最后面2个字节为结束标记)
  方案3:使用工具:Clear MBR 0.9,接运行执行“Clear MBR”即可。
  方案4: Linux的分区已经被你从Windows中删除,系统启动后停在“grub”提示符处。解决方法:
  (1):按照方案1的方法
  (2):如下
  a.在“grub”提示符后输入:“rootnoverify (hd0,0)” 回车。 //将第一块硬盘(hd0)的第一个分区(0)设为根分区/root设备,但不加载文件系统。
  b.在“grub”提示符后输入:“chainloader +1” 回车。//将启动引导权转交给当前分区的首扇区(Windows系统所在分区的首扇区)。
  c.在“grub”提示符后输入:“boot” 回车。系统将启动Windows。如果不成功,则表明 (hd0,0) 不是 Windows 系统所在分区,再从第一步开始试一下“root (hd0,1)/root (hd0,2)/root (hd0,3)/...”,总之这样一定可以引导启动你的Windows系统。
  d.好了,进入Windows了,请采用方案3的方法,轻松搞定!
  (3):用 WINDOWS 盘启动,进入 console 模式,运行 fixboot 和 fixmbr。fixmbr命令用于修复启动磁盘的主启动记录,它仅在使用故障恢复控制台时才可用,它的语法是:fixmbr [device_name],参数device_name是要写入新的主引导记录的设备(驱动器),设备名称可从 map 命令的输出获得。例如,设备名称:DeviceHardDisk0,下列命令示例向指定设备写入一个新的主引导记录:fixmbr DeviceHardDisk0
  注意:如果不指定 device_name,新的主引导记录将被写入引导设备,即装载主系统的驱动器。如果系统检测到无效或非标准分区表标记,将提示用户是否继续执行该命令。除非您访问驱动器有问题,否则不要继续进行。向系统分区写入新的主引导记录可能破坏分区表并导致分区无法访问。



[本日志由 lq3447 于 2016-02-28 04:56 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 核心机
评论: 0 | 引用: 0 | 查看次数: 467
发表评论
你没有权限发表留言!