Linux 磁盘管理1——基础

一、fdisk 

实例解说Linux中fdisk分区使用方法

  fdisk -Partition table manipulator for Linux ,译成中文的意思是磁盘分区表操作工具;本人译的不太好,也没有看中文文档;其实就是分区工具;

  fdsik 能划分磁盘成为若干个区,同时也能为每个分区指定分区的文件系统,比如linux 、fat32、 linux 、linux swap 、fat16 以及其实类Unix类操作系统的文件系统等;当然我们用fdisk 对磁盘操作分区时,并不是一个终点,我们还要对分区进行格式化所需要的文件系统;这样一个分区才能使用;这和DOS中的fdisk 是类似的;


fdisk -l 查看硬盘及分区信息:

  通过《合理规划您的硬盘分区》,我们知道主分区(包括扩展分区)的总个数不能超过四个;也不能把扩展分区包围在主分区之间;根据这个原则,我们划分硬盘分区就比较容易的多;也能为以后减少不必要的麻烦;

     硬盘总容量=主分区(包括扩展分区)总容量

  扩展分区容量=逻辑分区总容量


关于fdisk -l 一些数值的说明:

Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

  这个硬盘是80G的,有255个磁面;63个扇区;9729个磁柱;每个 cylinder(磁柱)的容量是 8225280 bytes=8225.280K(约为)=8.225280M(约为);

分区序列 引导 开始 终止 容量分区类型ID 分区类型
Device Boot Start End Blocks Id System
/dev/hda1 * 1 765 6144831 7 HPFS/NTFS
/dev/hda2 766 2805 16386300 c W95 FAT32 (LBA)
/dev/hda3 2806 9729 55617030 5 Extended
/dev/hda5 2806 3825 8193118+ 83 Linux
/dev/hda6 3826 5100 10241406 83 Linux
/dev/hda7 5101 5198 787153+ 82 Linux swap / Solaris
/dev/hda8 5199 6657 11719386 83 Linux
/dev/hda9 6658 7751 8787523+ 83 Linux
/dev/hda10 7752 9729 15888253+ 83 Linux

  说明:

  硬盘分区的表示:在Linux 是通过hd*x 或 sd*x 表示的,其中 * 表示的是a、b、c …… …… x表示的数字 1、2、3 …… …… hd大多是IDE硬盘;sd大多是SCSI或移动存储;

  引导(Boot):表示引导分区,在上面的例子中 hda1 是引导分区;

  Start (开始):表示的一个分区从X cylinder(磁柱)开始;

  End (结束):表示一个分区到 Y cylinder(磁柱)结束;

  id和System 表示的是一个意思,id看起来不太直观,我们要在fdisk 一个分区时,通过指定id来确认分区类型;比如 7表示的就NTFS 分区;这个在fdisk 中要通过 t 功能来指定。下面的部份会提到;

  Blocks(容量):这是我翻译的,其实不准确,表示的意思的确是容量的意思,其单位是K;一个分区容量的值是由下面的公式而来的;

  Blocks = (相应分区End数值 - 相应分区Start数值)x 单位cylinder(磁柱)的容量

  所以我们算一下 hda1的 Blocks 的大小 :

  hda1 Blocks=(765-1)x8225.280=6284113.92 K =6284.113.92M

  注:换算单位以硬盘厂家提供的10进位算起,如果以操作系统二进制来算,这个分区容量应该更少一些,得出的这个值和我们通过 fdisk -l 看到的 /dev/hda1的值是大体相当的,因为换算方法不一样,所以也不可能尽可能的精确;再加上分区时的一点损失之类,有时或大或小是存在的;

  我们查看分区大小或者文件的时候,还是用十进制来计算比较直观;推算办法是 byte 向前推小数点三位就是K ,K单位的值向前推小数点三位就是M,M向前推小数点三位就是G…… …… 一般也差不了多少;这么算就行。


fdisk 对硬盘及分区的操作,进入fdisk 对硬盘操作阶段:

  我们可以对硬盘进行分区操作,前提是您把fdisk -l 弄明白了;通过fdisk -l ,我们能找出机器中所有硬盘个数及设备名称;比如上面的例子,我们会看到两个设备一个是/dev/hda ,另一个是/dev/sda ;

  fdisk 操作硬盘的命令格式如下:

  [root@localhost]# fdisk 设备

  比如我们通过 fdisk -l 得知 /dev/hda 或者 /dev/sda设备;我们如果想再添加或者删除一些分区,可以用

  [root@localhost]# fdisk /dev/hda

  或

  [root@localhost]# fdisk /dev/sda

  注 在以后的例子中,我们要以 /dev/sda设备为例,来讲解如何用fdisk 来操作添加、删除分区等动作;

  fdisk 的说明:

  当我们通过 fdisk 设备,进入相应设备的操作时,会发现有如下的提示;以 fdisk/dev/sda 设备为例,以下同。

[root@localhost ]# fdisk /dev/sda
Command (m for help): 在这里按m ,就会输出帮助;
Command action
   a toggle a bootable flag
   b edit bsd disklabel
   c toggle the dos compatibility flag
   d delete a partition 注:这是删除一个分区的动作;
   l list known partition types 注:l是列出分区类型,以供我们设置相应分区的类型;
   m print this menu 注:m 是列出帮助信息;
   n add a new partition 注:添加一个分区;
   o create a new empty DOS partition table
   p print the partition table 注:p列出分区表;
   q quit without saving changes 注:不保存退出;
   s create a new empty Sun disklabel
   t change a partition's system id 注:t 改变分区类型;
   u change display/entry units
   v verify the partition table
   w write table to disk and exit 注:把分区表写入硬盘并退出;
   x extra functionality (experts only) 注:扩展应用,专家功能;

  其实我们常用的只有注有中文的,其它的功能我们不常用(呵,主要是我不会用,否则早会卖弄一下了);x扩展功能,也不是常用的;一般的情况下只要懂得 d l m p q tw 就行了;

  下面以实例操作来详述,没有例子没有办法就,新手也看不懂;


列出当前操作硬盘的分区情况,用p:

Command (m for help): p
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
   Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
/dev/sda6 51 76 200781 83 Linux

然后我们根据前面所说通过t指令来改变分区类型;

  最后不要忘记w保存退出;


 二、df 和 du


常用命令:df –hi
a:显示全部的档案系统和各分割区的磁盘使用情形
i:显示i -nodes的使用量
k:大小用k来表示 (默认值)
t:显示某一个档案系统的所有分割区磁盘使用量
x:显示不是某一个档案系统的所有分割区磁盘使用量
T:显示每个分割区所属的档案系统名称

 

指令 df 可以显示目前所有档案系统的最大可用空间及使用情形,请看下列这个例子:
# df –h

Filesystem             Size  Used   Avail    Use%     Mounted on

/dev/mapper/VolGroup00-LogVol00

                      37G  3.6G   32G      11%  /

/dev/sda1              99M  12M   83M     13%  /boot

tmpfs                 506M    0  506M     0%  /dev/shm


du命令详细用法
常用命令:[b]du[/b] –a
查询档案或目录的磁盘使用空间,我一般用的比较多的就是du -sh (查看当前目录的总空间)


a:显示全部目录和其次目录下的每个档案所占的磁盘空间
b:大小用bytes来表示 (默认值为k bytes)
c:最后再加上总计 (默认值)
s:只显示各档案大小的总合
x:只计算同属同一个档案系统的档案
L:计算所有的档案大小

指令 du 能以指定的目录下的子目录为单位,显示每个目录内所有档案所占用的磁盘空间大小。使用 -h 参数来显示 human-readable 的格式。例如:

# du -h /etc
104K /etc/defaults
6.0K /etc/X11
在查看目录的使用情形时,我们可以将输出结果导到 sort 指令进行排序,以了解哪个档案用了最多的空间:
# du /etc | sort -nr | more
1746 /etc
388 /etc/mail
318 /etc/rc.d

Linux、Unix-Like平台的用户都可能会发现,du与df的查询结果会不一致。最常见的情况就是,df显示的已使用磁盘占用率比du统计出来的结果要大很多。下面说下两者结果不同的原因,主要是由于两者计算结果的方式不同。

先来看看两者是如何计算的

  df命令:

  df是从文件系统考虑,通过文件系统中未分配的空间来确定文件系统中已分配空间的大小。例如:如果一个文件系统中有8192个512-byte 块,并且4000个块没有被分配出去,那么已分配的空间就是4192个512-byte 的块。

  已分配空间=空间总数-未分配空间

  df中的used还包含了程序申请的、被程序占用的空间等等。因为基于文件系统总体来计算,所以df命令是报告文件系统空间使用情况最可靠的命令。

  du命令:

  du是面向文件的命令,它计算分配给指定文件或者目录的空间。du命令必须跟着目的参数,而且不能隔离文件系统。

  例如:运行 #du /命令将计算所有在/文件系统下所有文件的空间分配信息。其中包括/文件系统所有的文件和安装在/下面的,例如/tmp, /var和/usr下面的其他文件系统的文件。可以用du命令带-x参数来限制仅在文件系统内进行操作。但是有时候会导致输出结果不完全。

  du命令只计算被文件占用的空间。不计算文件系统metadata 占用的空间,如inodes, inode maps, 或者disk maps。

  du命令只计算那些可以访问的文件所占用的存储空间。

  下面两种情况du命令不会计算已经分配给文件的空间。

  Case1:

  文件被隐藏了。

  例如:如果一个文件存放在/bobby 目录下, 接着有文件系统安装(mount)在/bobby目录下, 那么du 命令将不会计算 /bobby 目录下的文件所占用的存储空间。

  Case2:

  文件被其他的应用的打开了,接着文件被删除了(rm命令删除)。 在这种情况下,文件所占用的存储空间将维持着被分配的状态直到所有对这个文件的访问都被关闭。由于目录中没有这个文件的相关纪录,du命令将不会计算这个文件的被分配空间,但df命令将计算这部分已分配的空间。

  除rm外,有些不明显的操作也会产生类似的问题。

  例如gzip命令,其对某个文件xxx.log进行压缩时,会产生一个新的xxx.log.gz文件,完成后,会把原来的xxx.log删除。这时,若仍有进程在使用xxx.log文件。那么,实际上该文件还是只会标记为deleted,其空间也不会释放,问题与上面提到的情况是相同的。所以,在编写脚本时,可先判断是否仍有进程正在使用该文件,然后再进行gzip操作。

  通俗点讲,du就是遍历某个目录,把所有文件的大小加起来,都是那看得见的东西的和

  简单的模拟测试实验(以下实验属引用,未测试。看了下输出,结果应该没问题。呵呵!)

  实验情况

1、创建并删除文件

  创建文件前的磁盘容量情况:?View Code BASH
1
2
3
4
# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda1              12G  5.7G  5.5G  51% /
tmpfs                 506M     0  506M   0% /dev/shm
  创建文件:?View Code BASH
1
2
3
4
# dd if=/dev/zero of=test.iso bs=1024k count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 14.3055 seconds, 73.3 MB/s
  现在的磁盘情况:?View Code BASH
1
2
3
4
# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda1              12G  6.7G  4.6G  60% /
tmpfs                 506M     0  506M   0% /dev/shm
  模拟某个进程正在使用该文件:?View Code BASH
1
# tail -f /tmp/test.iso




三、dd 命令

dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。 

1、命令简介

dd 的主要选项: 

指定数字的地*以下列字符结尾乘以相应的数字: 

b=512, c=1, k=1024, w=2, xm=number m 

if=file        输入文件名,缺省为标准输入。 

of=file      输出文件名,缺省为标准输出。 

ibs=bytes    一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。 

obs=bytes    一次写 bytes 个字节(即一个块大小为 bytes 个字节)。 

bs=bytes     同时设置读写块的大小为 bytes ,可代替 ibs 和 obs 。 

cbs=bytes      一次转换 bytes 个字节,即转换缓冲区大小。 

skip=blocks    从输入文件开头跳过 blocks 个块后再开始复制。 

seek=blocks    从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)。 

count=blocks     仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。 

conv=conversion[,conversion...]          用指定的参数转换文件。 


转换参数: 

ascii 转换 EBCDIC 为 ASCII。 

ebcdic 转换 ASCII 为 EBCDIC。 

ibm 转换 ASCII 为 alternate EBCDIC. 

block 把每一行转换为长度为 cbs 的记录,不足部分用空格填充。 

unblock 使每一行的长度都为 cbs ,不足部分用空格填充。 

lcase 把大写字符转换为小写字符。 

ucase 把小写字符转换为大写字符。 

swab 交换输入的每对字节。  

noerror 出错时不停止。 

notrunc 不截短输出文件。 

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.清空硬盘或者某分区 

dd if=/dev/zero of=/dev/raw/raw1         ——对裸设备raw1进行清空。

四、dumpe2fs, e2fsck,e2image,e2label, tune2fs:


dumpe2fs用于显示ext2/ext3文件系统的信息。如:显示指定文件系统的超级块信息:dumpe2fs -h /dev/sda7;


e2fsck用于检查ext2/ext3文件系统,根据其返回值来判断具体出错原因,如返回0代表没有错误,返回1代表发生文件系统错误。2系统应该重新启动,4不正常退出错误,8操作错误,16,32.128.。。;


e2image 用于备份文件系统的源数据到指定的映像文件。如: e2image  /dev/sda7 sda7.bak  这样就生成了一个映像文件sda7.bak 可以用file命令探测文件的类型,测得是data类型。


e2label用于设置ext2/ext3文件系统标签。如: e2label /dev/sda7 music  好了这就给sda7设置了music这个标签,如果这个命令不加任何参数,那就显示这个标签,如:e2label /dev/sda7. 显示 music。。。


tune2fs用于调整ext2/ext3文件系统参数,这是一个很强的命令,tune2fs -l /dev/sda. 显示文件系统超级块的内容。


tune2fs用法小结
为了保证文件系统的完整,系统每隔几天或重新启动几次之后就要完整地检查一次,这对于工作站及服务器确实很有必要。但对于个人及家用系统,可以用Tune2fs工具作一些调整。假设根文件系统在/dev/hda1上,如调整每2次完整地检查根文件系统的装载次数为100次: 


        # tune2fs -c 100 /dev/hda1 

        tune2fs 1.10, 24-Apr-97 for EXT2 FS 0.5b, 95/08/09 

       Setting maximal mount count to 100 

调整每2次完整地检查根文件系统的时间间隔为5周: 


        # tune2fs -i 5w /dev/hda1 

  tune2fs 1.10, 24-Apr-97 for EXT2 FS 0.5b, 95/08/09 

  Setting interval between check 3024000 seconds 


另外,系统保留空间也可用tune2fs调整,如调整根文件系统保留空间为40000个磁盘块: 

  # tune2fs -r 40000 /dev/hda1 

  tune2fs 1.10, 24-Apr-97 for EXT2 FS 0.5b, 95/08/09 

  Setting reserved blocks count to 40000 




mknod,hdparm:
hdparm:用于设置硬盘的参数,


  五、对分区进行格式化,以及加载;
  先提示一下;用 mkfs.bfsmkfs.ext2 mkfs.jfs mkfs.msdos mkfs.vfatmkfs.cramfs mkfs.ext3 mkfs.minixmkfs.reiserfs mkfs.xfs 等命令来格式化分区,比如我想格式化 sda6为ext3文件系统,则输入;
  [root@localhost]# mkfs.ext3 /dev/sda6
  如果我想加载 sda6到目前系统来存取文件,应该有mount 命令,但首先您得建一个挂载目录;比如 /mnt/sda6 ;
[root@localhost ]# mkdir /mnt/sda6
[root@localhost ]# mount /dev/sda6 /mnt/sda6
[root@localhost ]# df -lh
Filesystem 容量 已用 可用 已用% 挂载点
/dev/hda8 11G 8.4G 2.0G 81% /
/dev/shm 236M 0 236M 0% /dev/shm
/dev/hda10 16G 6.9G 8.3G 46% /mnt/hda10
/dev/sda6 191M 5.6M 176M 4% /mnt/sda6
这样我们就能进入 /mnt/sda6目录,然后存取文件了
 




上一篇:硬盘修复 Ext4文件系统fsck后损坏的修复过程


下一篇:Linux中ftp安装与基本操作