Linux RHEL 5.1 文件系统损坏修复案例 参考文档整理 (HP)
出现错误提示:
Ext3-fs error(device dm-0):ext3_check_descriptors:Block bitmap for group 0 not in group(block 33261)!
EXT3-fs:group descriptors corrupted!
1、Linux救援模式应用1
当系统连单用户模式都无法进入时或出现GRUB命令行也不能解决的引导问题,我们就需要使用Linux救援模式来进行故障排除了。步骤如下:
1、将Linux安装光盘(如果使用CD光盘,则放入第一张引导光盘)放入光驱,设置固件CMOS/BIOS为光盘引导,当Linux安装画面出现后,在“boot:”提示符后输入“linux rescue”回车进入救援模式。(想了解救援模式详细信息,还可以按F5键查看)
2、系统会检测硬件,引导光盘上的Linux环境,依次提示你选择救援模式下使用的语言(建议选择默认的英文即可,根据笔者测试,部分Linux系统选择中文会出现乱码);键盘设置用默认的“us”就好;网络设置可以根据需要,大部分故障修复不需要网络连接,可不进行此项设置,选择“No”。
3、接下来系统将试图查找根分区。
默认在救援模式,硬盘的根分区将挂载到光盘Linux环境的/mnt/sysimage目录下,默认选项“continue”表示挂载权限为读写;“Read-only”为只读,如果出现检测失败可以选择“skip”跳过。此处,因为要对系统进行修复,所以需要有读写权限,一般选择默认选项“continue”。进入下一步后,系统提示执行“chroot /mnt/sysimage”命令,可以将根目录挂载到我们硬盘系统的根目录中去。
2、Linux救援模式应用2
当你的Linux系统出现问题时你会怎么办,直接重新安装,还是用Linux救援模式。或许你对这个模式很陌生但是并不妨碍他会对你有很大的帮助,可以帮你挽回很多重要的数据,是你不必很伤脑筋的对付上级的质询。
现在我来讲解进入rescue (示例系统为RHEL 3)
1.用安装光盘或者硬盘安装的方式进入安装界面,在shell中输入 Linux rescue
2.然后根据提示选择语言和键盘格式
3.选择是否配置网卡一般系统到了要rescue了,网络也就不需要了,所以可以选择否跳过网卡配置,当然你如果需要也可以选择是,具体设置过程和安装时一样。
4.选择是否然让系统查找硬盘上的RHEL系统,选择继续。
5.硬盘上的系统已经被找到并挂载在/mnt/sysimage下
6.按提示chroot /mnt/sysimage
chroot 之后你就可以已经在你的要被拯救的系统下了。
grub挂了的,grub-install /dev/hdxx
配置文件改错的,vi /etc/fstab vi /etc/inittab……
软件包被毁的 rpm -F xxx.rpm
完成修复工作后,exit命令退出chroot,exit退出rescue shell系统重启。
备注:
如果你硬盘上的系统是非rhel系统如debian的,那么在第4步时,rescue程序会找步不到硬盘上的系统,所以我们这是选择"跳过",直接进入shell.假设现在硬盘上的有一个
debian 系统 /dev/hda1为/boot分区 /dev/hda5为 /分区 /dev/hda6为swap.那么我们现在这么做。
# fdisk -l (查看分区情况)
# mkdir /mnt/Linux
# mkdir /mnt/Linux/boot (根据fdisk -l得到的信息创建目录)
# mount -t ext3 /dev/hda5 /mnt/Linux
# mount -t ext3 /dev/hda1 /mnt/Linux/boot(挂载硬盘上的文件系统)
# chroot /mnt/Linux (chroot改变工作系统)
自此我们顺利进入硬盘上的debian系统,剩下来到就和先前一样了,有冤的报冤有仇的报仇。
另:
如果你的系统是文件系统损坏那么就不用挂载,chroot 系统了。
直接 fsck /dev/hdxx 即可。
其实我们仔细想想这个rescue会发现,所谓rescue模式只是一个带shell的Linux运行环境而已,然后通过mount和 chroot进入要修复的系统的。
所以在没有rescue 盘的情况下我可以利用 Linux livecd或软盘版的Linux进入shell环境然后重做
# fdisk -l (查看分区情况)
# mkdir /mnt/Linux
# mkdir /mnt/Linux/boot (根据fdisk -l得到的信息创建目录)
# mount -t ext3 /dev/hda5 /mnt/Linux
# mount -t ext3 /dev/hda1 /mnt/Linux/boot(挂载硬盘上的文件系统)
# chroot /mnt/Linux (chroot改变工作系统)
就可以简单的进入一个Linux救援模式了。
3、Linux文件系统修复
1 获取错误的出错磁盘(或者设备)块的大小.
有很多种方法可以得到. 比如,
# tune2fs -l /dev/hda4
其实大多数情况下是 1 K.
2 对当前的出错磁盘备份.
恢复超级块(Superblock)的过程其实也是一个有风险的过程.能做备份就做好备份.如果有其他空闲设备,用 dd命令把该设备上的内容备份起来.
3 一般来说,超级块错基本上也就是主超级块错,在 Ext2/Ext3文件系统创建的时候,会同时在屏幕上提示我们在已经在几个地方备份了超级块.那么怎么发现这些超级块在什么地方呢?我们看看帮助信息:
-b superblock
Instead of using the normal superblock, use an alternative
superblock specified by superblock. This option is normally
used when the primary superblock has been corrupted. The loca-
tion of the backup superblock is dependent on the filesystem's
blocksize. For filesystems with 1k blocksizes, a backup
superblock can be found at block 8193; for filesystems with 2k
blocksizes, at block 16384; and for 4k blocksizes, at block
32768.
Additional backup superblocks can be determined by using the
mke2fs program using the -n option to print out where the
superblocks were created. The -b option to mke2fs, which spec-
ifies blocksize of the filesystem must be specified in order for
the superblock locations that are printed out to be accurate.
If an alternative superblock is specified and the filesystem is
not opened read-only, e2fsck will make sure that the primary
superblock is updated appropriately upon completion of the
filesystem check.
4 开始恢复.如果文件系统块大小为1K,则我们可以用如下命令恢复:
# /sbin/fsck.ext3 -b 8193 /dev/hda4
如果这个备用块(8193)也有问题,那么可以尝试 24577(8192*3+1) ,或者是 40961 (8192*5+1).
可能您也会看出来,超级块的保存位置是按照 1,3,5,7这样的规律的.具体的位置在 BlockSize(8192)*N+1.
4、Linux中DD命令详解
1.dd命令简介
功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换。可以用该命令实现DOS下的diskcopy命令的作用。先用dd命令把软盘上的数据写成硬盘的一个寄存文件,再把这个寄存文件写入第二张软盘上,完成diskcopy的功能。需要注意的是,应该将硬盘上的寄存文件用rm命令删除掉。系统默认使用标准输入文件和标准输出文件。
语法:dd [选项]
if =输入文件(或设备名称)。
of =输出文件(或设备名称)。
ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数。
skip = blocks 跳过读入缓冲区开头的ibs*blocks块。
obs = bytes 一次写入bytes字节,即写入缓冲区的字节数。
bs = bytes 同时设置读/写缓冲区的字节数(等于设置ibs和obs)。
cbs = byte 一次转换bytes字节。
count=blocks 只拷贝输入的blocks块。
conv = ASCII 把EBCDIC码转换为ASCIl码。
conv = ebcdic 把ASCIl码转换为EBCDIC码。
conv = ibm 把ASCIl码转换为alternate EBCDIC码。
conv = block 把变动位转换成固定字符。
conv = ublock 把固定位转换成变动位。
conv = ucase 把字母由小写转换为大写。
conv = lcase 把字母由大写转换为小写。
conv = notrunc 不截短输出文件。
conv = swab 交换每一对输入字节。
conv = noerror 出错时不停止处理。
conv = sync 把每个输入记录的大小都调到ibs的大小(用NUL填充)。
2.实例分析
2.1.数据备份与恢复
2.1.1整盘数据备份与恢复
备份:
dd if=/dev/hdx of=/dev/hdy
将本地的/dev/hdx整盘备份到/dev/hdy
dd if=/dev/hdx of=/path/to/image
将/dev/hdx全盘数据备份到指定路径的image文件
dd if=/dev/hdx | gzip >/path/to/image.gz
备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径
恢复:
dd if=/path/to/image of=/dev/hdx
将备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/hdx
将压缩的备份文件恢复到指定盘
2.1.2.利用netcat远程备份
dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234
在源主机上执行此命令备份/dev/hda
netcat -l -p 1234 | dd of=/dev/hdc bs=16065b
在目的主机上执行此命令来接收数据并写入/dev/hdc
netcat -l -p 1234 | bzip2 > partition.img
netcat -l -p 1234 | gzip > partition.img
以上两条指令是目的主机指令的变化分别采用bzip2 gzip对数据进行压缩,并将备份文件保存在当前目录。
2.1.3.备份MBR
备份:
dd if=/dev/hdx of=/path/to/image count=1 bs=512
备份磁盘开始的512Byte大小的MBR信息到指定文件
恢复:
dd if=/path/to/image of=/dev/hdx
将备份的MBR信息写到磁盘开始部分
2.1.4.备份软盘
dd if=/dev/fd0 of=disk.img count=1 bs=1440k
将软驱数据备份到当前目录的disk.img文件
2.1.5.拷贝内存资料到硬盘
dd if=/dev/mem of=/root/mem.bin bs=1024
将内存里的数据拷贝到root目录下的mem.bin文件
2.1.6.从光盘拷贝iso镜像
dd if=/dev/cdrom of=/root/cd.iso
拷贝光盘数据到root文件夹下,并保存为cd.iso文件
2.2.增加Swap分区文件大小
dd if=/dev/zero of=/swapfile bs=1024 count=262144
创建一个足够大的文件(此处为256M)
mkswap /swapfile
把这个文件变成swap文件
swapon /swapfile
启用这个swap文件
/swapfile swap swap defaults 0 0
在每次开机的时候自动加载swap文件,需要在 /etc/fstab文件中增加一行
2.3.销毁磁盘数据
dd if=/dev/urandom of=/dev/hda1
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/hda1将无法挂载,创建和拷贝操作无法执行。
2.4磁盘管理
2.4.1.得到最恰当的block size
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小
2.4.2测试硬盘读写速度
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度
2.4.3.修复硬盘
dd if=/dev/sda of=/dev/sda
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生magnetic flux point。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。
2.4.4.软盘拷贝
要把一张软盘的内容拷贝到另一张软盘上,利用/tmp作为临时存储区。把源盘插入驱动器中,输入下述命令:
$ dd if =/dev/fd0 of = /tmp/tmpfile
拷贝完成后,将源盘从驱动器中取出,把目标盘插入,输入命令:
$ dd if = /tmp/tmpfile of =/dev/fd0
软盘拷贝完成后,应该将临时文件删除:
$ rm /tmp/tmpfile
2.4.5.把net.i这个文件写入软盘中,并设定读/写缓冲区的数目。(注意:软盘中的内容会被完全覆盖掉)
$ dd if = net.i of = /dev/fd0 bs = 16384
2.4.6.将文件sfile拷贝到文件 dfile中。
$ dd if=sfile of=dfile
5、RHEL6救援模式挂载LVM
RHEL6救援模式挂载LVM出错:mount unknown filesystem type 'lvm2_member'
解决办法:
1、从fdisk信息不难看出,已经加密的“*” ,肯定是我的引导分区,而我的真实/安装在/dev/sda2上的。
2、挂载出错
3、查看物理卷、卷组:pvs、vgs
4、查看逻辑卷:lvdisplay
5、如未激活,需要激活逻辑卷
6、挂载逻辑卷
这里,在chroot之前 bash-4.1#目录下的/是内存中的 /,也叫伪根;
chroot后 sh-4.1#目录下的/才是系统真实的/,也叫真根
6、parted命令
由于MBR分区表只支持2T磁盘,所以大于2T的磁盘必须使用GPT分区表,具体方法如下:
GPT格式的磁盘相当于原来MBR磁盘中原来保留4个partition table的4*16个字节,只留第一个16个字节,类似于扩展分区,真正的partition table在512字节之后,GPT磁盘没有四个主分区的限制。
但fdisk不支持GPT,我们可以使用parted来对GPT磁盘操作。
parted功能很强大,既可用命令行也可以用于交互式
在提示符下输入parted就会进入交互式模式,如果有多个磁盘的话,我们需要运行select sdx x为磁盘,来进行磁盘的选择
代码
parted>
parted>select sdb 假设磁盘为sdb
parted>mklabel gpt 将MBR磁盘格式化为GPT
#parted>mklabel msdos 将GPT磁盘转化为MBR磁盘
parted>mkpart primary 0 100 划分一个起始位置为0,大小为100M的主分区
parted>mkpart primary 100 200 划分一个起始位置为100M,大小为100M的主分区
#parted>mkpart primary 0 -1 将整块磁盘分成一个分区
parted>print 打印当前分区
parted>quit 退出
在parted里边不支持ext3的文件系统,所以如果要使用的话,要退出parted进行格式话
代码
mkfs.ext3 /dev/sdx1
因为fdisk是不支持GPT磁盘,所以不要使用fdisk -l来查看X磁盘刚才分好的区,看不到的。
命令行的模式:
将硬盘转化为GPT磁盘后,执行下列命令
代码
parted /dev/sdx mkpart primary 0 100 划分一个起始位置为0大小为100M的主分区
7、Solaris下NFS教程
所有的测试环境都是sun的solaris系统。
1、理解nfs服务器和客户端功能。
nfs是sun公司来建立来使用tcp/ip协议以及sun的远程调用和外部数据表示规范的产品。nfs的使用非常方便,也比较可靠。他具有在不同操作系统之间共享文件的能力。
nfs服务器可以使用nfs来让其他远程机器共享它的本地资源。nfs客户机是访问nfs服务器的共享资源的机器。其实在实际工作中,一台主机即可以是nfs服务器,也可以是nfs客户机。他们可以互相共享和访问。
只要你能理解nfs服务器和nfs客户机之间的不同。剩下的就很easy了。
2、 nfs服务器和nfs客户机区别。
2、1 solaris使用分布式文件系统或dfs命令公享资源。公享资源可以手动和自动设置。
nfs服务器运行两个守侯进程:mountd和 nfsd。
用到的文件是:
/etc/rc3.d/S15nfs.server
/etc/dfs/dfstab
/etc/dfs/sharetab
/etc/rmtab
nfs服务器使用命令是:share unshare shareall unshareall
nfs客户机上运行的守侯进程是:statd和 lockd。
用到的文件是:
/etc/vfstab
/etc/mnttab
nfs客户机使用命令是:mount umount mountall umountall
2、2 nfs服务器设置
nfs服务器需要运行两个守侯进程mountd和nfsd来工作。当nfs客户机试图访问一个远程的nfs服务器资源。nfs客户机通过mount命令请求与 nfs服务器的mountd守侯进程进行连接。当nfs服务器响应客户机时候,返回给可户机一个信息。客户机把这个信息写到本地的/etc/mnttab文件中。这个信息是服务器中共享文件和目录的信息。它是资源信息的编码:磁盘设备号、节点生成号、节点号等。这个是唯一的。
一旦可户机得到请求信息,nfs服务器上的mountd进程就会在服务器本地的/etc/rmtab文件中添加一条信息。这是为了保持对当前加载可户机上文件的跟踪。这个文件为每一个被加载资源添加一个条目,格式是:
remote hostname: local filename name
注意:mountd每一次重新启动和可户机发一个卸载请求,都会更新服务器的/etc/rmtab文件中的旧条目。
2、3共享设置命令。
明白了以上的道理,下面说具体的操作了。nfs服务器使用/usr/sbin/share命令为客户机共享资源。
命令详解:
# share ---显示所有可以安装的资源,不管它是否已经被安装。
# share [ -F filesystem ] [ -o options ] [-d description ] pathname-to-resource
---指定共享文件。
* -F file system type 指定被公享的文件系统类型。
* -o options 指定客户对资源访问的类型。
* -d description 功享资源的简单描述。当你share命令不带任何参数运行,他就会被显示。
* pathname-to-resource 在服务器上共享的资源名字。
------------------------------------------------------
*-o 指定了允许客户访问共享资源的用户也权限。具体如下:
rw 表示用户可读/写,是默认植。
rw=client1:client2指定用户可以有读/写权限。可以有很多用户,用冒号分隔。
ro 表示只读。
ro=client1:client2指定用户client1和client2只读。client1可以是用户名,也可以是ip地址,或者一个网段。例如:ro=@202.99.88.0/24
root=client:client2指定client1和client2上的root用户对共享资源有超级用户的权限。但是,他的优先级小于nfs服务器的本地权限。
例如:用户peng有个目录/exprot/home/games要共享。
# share -F nfs -o rw=lnx3000:race , ro=@202.88.99.0/24:sune450 ,root=mmmmn -d "i love MM !" /export/home/peng/games
运行结果:共享/exprot/home/peng/games目录,名字是lnx3000和race的两台主机有读/写权限;202.88.99.0这个c类网的机器和sun450这个主机只有读的权限;mmmmn这台主机的root用户可以对共享资源有超级用户访问权限。但是声名一点,要是我给共享目录/exprot/home/peng/games目录只读,mmmmn的root权限也没有用,只能只读。因为服务器本地权限大于任何share的权限。。
取消share资源。
# unshare [ -F nfs ] path-to-resource
* -F nfs 指定系统类型,默认。
* path-to-resource 指定共享路径。
例如:
# unshare /export/home/peng/games
取消这个共享资源了。
2、4开机自动共享资源。
以上的命令方法,在机器重新启动的时候,设置消失。如何保留和开机自动启动nfs共享。我们可以用/etc/dfs/dfstab文件来实现自动共享文件。只要主机启动进入运行级别3,nfs资源共享自动启动。
1、编辑/etc/dfs/dfstab文件,添加:
share [ -F filesystem ] [ -o options ] [-d description ] pathname-to-resource
-----这个和命令行是一样的。。。
2、# /etc/init.d/nfs.server start
这样就ok了。
3、手工快速命令。
# shareall --共享所有列在/etc/dfs/dfstab中的共享资源。
# unshareall --取消所有列在/etc/dfs/dfstab中的共享资源。
2、5资源查看。
# dfshares
用以查看服务器的共享资源。输入格式如下:
resource server access transprot
* resource 可被远程调用的资源的主机和路径名。
* server 指定资源的系统名称。
* access 服务器指定的权限,默认是rw,显示为“-”。
* transport 指定共享资源的端口。
# dfmounts命令
显示服务器上查看共享资源被利用的状况,输出格式如下:
RESOURCE SERVER PATHNAME CLIENTS
* resource 共享资料名称。
* server pathname 共享资料目录。
* client 连接的客户端。
# nfsstat
看nfs的全部状态
3、nfs客户机设置。
安装好nfs服务器后,就可以用客户端使用共享资料了。首先要检测nfs服务器,然后安装。
3、1检测nfs服务器。
# showmount [ -ade ] <hostname>
* -a 显示已经已经使用的资源和来自哪个nfs服务器。
* -d 显示已经被远程安装的资源。
* -e 显示可以被安装的可以资源。一般用-e来查看远程主机的可以资源。
3、2建立共享。
# mount [ -F nfs ] [ -o options ] path-to-resource path-to-local-mount-point
* -F nfs 指定共享文件系统,默认的。没必要指定。
* -o options 指定选项,例如权限。默认rw,可读/写。也可以ro--只读。
* path-to-rescource 指定nfs服务器的主机名和共享资源路径。
* path-to-local-mount-point 指定共享资源在本地的mount点。
例如:
# mkdir /export/home/games
# mount peng:/export/home/peng/games /exprot/home/games
共享远程主机peng的/export/home/peng/games目录,可读写,挂接在本地的/exprot/home/games目录上。
3、3取消共享。
# umount [-F nfs] remote-path-to-resource path-to-local-mount-point
* -F nfs 默认的文件系统。
* remote-path-to-resource 远程主机和共享目录路径,主机和共享目录路径用冒号分隔。
* path-to-local-mount-point 本地主机挂点。
例如:
# umount peng:/export/home/peng/games /export/home/games
取消远程主机peng上的/exprot/home/peng/games这个目录的在本地/export/home/games上的共享。
3、4系统开机自动共享。
修改/etc/vfstab文件,格式如下:
device to mount device to fsck mount point FS type fsck pass mount at boot mount options
* device to mount 指定远程服务器名和共享路径。远程服务器名和共享路径用冒号分开。
* device to fsck 这个是空的。从来不从客户机进行文件检测。
* mount point 指定本地的mount点。这个目录必须是已经存在的。
* FS type 对于nfs资源系统来说,当然是nfs了。
* fsck pass 这个也是空的。表示不从客户机进行文件系统检测。
* mount at boot 选择yes or no,yes就是启动时自动安装。
* mount options 用逗号分隔的mount命令的列表。
例如:
# vi /etc/vfstab 添加:
peng:/export/home/peng/games - /export/home/games nfs - yes soft,bg
表示开机自动把远程主机peng的/export/home/peng/games目录自动挂到本机的/export/home/games下。soft选项是目录不能安装,产生一个错误。bg选项,系统启动过程中安装在后台。
关于mount options的参数,请用 man mount自己看看吧。
3、5手工调试命令。
# mountall
不带任何参数,安装所有列在/etc/vfstab文件中mount at boot中为yes的资源。
# mountall -r 只影响远程文件
# mountall -l 只影响本地文件
# umountall
不带任何参数,谢载已经安装的资源。不包括/ 、/proc、/usr、/var。另外,系统忙,也可能不会卸载。
# umountall -r 只影响远程文件
# umountall -l 只影响本地文件
小节:
到这里我想应该没有什么问题了。
大家只要注意一下客户端和服务器端的区分。
nfs服务器端运行守侯进程mound、nfsd
nfs服务器端使用文件/etc/dfs/dfstab、/etc/dfs/sharetab、/etc/rmtab
nfs服务器使用命令是:share unshare shareall unshareall
nfs客户端运行守侯进程statd、lockd。
用到的文件是/etc/vfstab、/etc/mnttab
nfs客户机使用命令是:mount umount mountall umountall
知道这些,就ok了。
FAQ :
1、运行mount命令不能得到共享资源,得到信息:“nfs server not responding”。
answer:确信服务器上nfsd和mountd已经运行,资源已经用共享命令正确共享。
2、当我企图共享到本地磁盘时,错误为:“mount:/tmp_mount not found”.
answer: 你有没有在本地创建mount点。。。
---- 但是有时我们操作时,在机器B上执行了mount命令后,会返回"RPC: Program not registered"这样的错误,这是因为在机器A上缺少mountd和nfsd这两个守护进程(daemon)。UNIX系统启动时,系统会自动检查/etc/dfs/dfstab文件,如果文件中有要共享的资源,则启动这两个守护进程,反之,则不启动。所以如果我们在/etc/dfs/dfstab中没有内容,则系统不能启动mountd和nfsd这两个守护进程,用share命令共享的目录也不能真正被别的系统共享。
---- 解决这个问题的方法很简单,我们可以把要共享的目录放入/etc/dfs/dfstab中,则下一次系统启动时会自动共享这个目录;另外,我们也可以手动启动这两个守护进程,方法是首先用超级用户(root)登陆,在命令行输入如下命令:
machine_A# /etc/rc3.d/S15nfs.server start
或输入:
machine_A# /usr/lib/nfs/mountd
machine_A# /usr/lib/nfs/nfsd -a 16
就可以启动这两个守护进程了。
更多推荐
所有评论(0)