首页 > 代码库 > Linux磁盘管理.md

Linux磁盘管理.md

df

df 即“可用磁盘”disk free,用于显示文件系统的磁盘使用情况。默认情况下 df 命令将以每块 1K 的单位进行显示所有当前已挂载的文件系统,如果你想以人类易读的格式显示 df 命令的输出,像这样“df -h”使用 -h 选项。

参数

  • -a, --all 包含所有的具有 0 Blocks 的文件系统

  • --block-size={SIZE} 使用 {SIZE} 大小的 Blocks

  • -h, --human-readable 使用人类可读的格式(预设值是不加这个选项的...)

  • -H, --si 很像 -h, 但是用 1000 为单位而不是用 1024

  • -i, --inodes 列出 inode 资讯,不列出已使用 block

  • -k, --kilobytes 就像是 --block-size=1024

  • -l, --local 限制列出的文件结构

  • -m, --megabytes 就像 --block-size=1048576

  • --no-sync 取得资讯前不 sync (预设值)

  • -P, --portability 使用 POSIX 输出格式

  • -t, --type=TYPE 限制列出文件系统的 TYPE

  • -T, --print-type 显示文件系统的形式

  • -x, --exclude-type=TYPE 限制列出文件系统不要显示 TYPE

举例

以人类可读的方式列出磁盘使用情况:

[root@hpf-linux ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda5        13G  3.7G  8.4G  31% /
tmpfs           491M     0  491M   0% /dev/shm
/dev/sda1       190M   26M  155M  14% /boot
/dev/sda2       4.7G  9.8M  4.5G   1% /home

说明:linux中df命令的输出清单的第1列是代表文件系统对应的设备文件的路径名(一般是硬盘上的分区);第2列给出分区容量的大小;第3,4列分别表示已用的和可用的磁盘空间。用户也许会感到奇怪的是,第3,4列空间数之和不等于第2列中的空间数。这是因为缺省的每个分区都留了少量空间供系统管理员使用。即使遇到普通用户空间已满的情况,管理员仍能登录和留有解决问题所需的工作空间。清单中Use% 列表示普通用户空间使用的百分比,即使这一数字达到100%,分区仍然留有系统管理员使用的空间。最后,Mounted on列表示文件系统的挂载点。
输出所有已挂载文件系统的类型:

[root@hpf-linux ~]# df -Th
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda5      ext4    13G  3.7G  8.4G  31% /
tmpfs          tmpfs  491M     0  491M   0% /dev/shm
/dev/sda1      ext4   190M   26M  155M  14% /boot
/dev/sda2      ext4   4.7G  9.8M  4.5G   1% /home

显示磁盘的inode信息:

[root@hpf-linux ~]# df -i
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/sda5      850304 86900 763404   11% /
tmpfs          125544     1 125543    1% /dev/shm
/dev/sda1       51200    38  51162    1% /boot
/dev/sda2      320000    11 319989    1% /home

du

du命令:disk usage,就是关于目录使用情况的。它的作用就是计算目录大小的。但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的。

参数

  • -a或-all 显示目录中个别文件的大小。

  • -b或-bytes 显示目录或文件大小时,以byte为单位。

  • -c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。

  • -D或--dereference-args 显示指定符号连接的源文件大小。

  • -h或--human-readable 以K,M,G为单位,提高信息的可读性。

  • -H或--si 与-h参数相同,但是K,M,G是以1000为换算单位。

  • -k或--kilobytes 以1024 bytes为单位。

  • -l或--count-links 重复计算硬件连接的文件。

  • -L<符号连接>或--dereference<符号连接> 显示选项中所指定符号连接的源文件大小。

  • -m或--megabytes 以1MB为单位。

  • -s或--summarize 仅显示总计。

  • -S或--separate-dirs 显示个别目录的大小时,并不含其子目录的大小。

  • -x或--one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。

  • -X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。

  • --exclude=<目录或文件> 略过指定的目录或文件。

  • --max-depth=<目录层数> 超过指定层数的目录后,予以忽略。

应用举例

显示当前目录或指定目录所占用磁盘空间:

[root@hpf-linux ~]# du -sh /root/
799M    /root/
[root@hpf-linux ~]# du -sh
799M    .

显示几个文件或目录各自占用磁盘空间的大小,还统计它们的总和

[root@hpf-linux ~]# du -shc mysql-5.6.25-linux-glibc2.5-x86_64.tar.gz php-5.6.12.tar.xz 
298M    mysql-5.6.25-linux-glibc2.5-x86_64.tar.gz
12M    php-5.6.12.tar.xz
309M    总用量

说明:加上-c选项后,du不仅显示两个目录各自占用磁盘空间的大小,还在最后一行统计它们的总和。
按照空间大小排序:

# du -h|sort -nr|more

输出当前目录下各个子目录所使用的空间:

[root@hpf-linux ~]# du -h  --max-depth=1
25M    ./nginx-1.8.0
369M    ./php-5.6.12
82M    ./zabbix-2.4.6
8.0K    ./.pki
12K    ./.dbus
799M   

fdisk

FDISK进行硬盘分区从实质上说就是对硬盘的一种格式化。当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即MasterBootRecord,MBR)和引导记录备份的存放位置。而对于文件系统以及其他操作系统管理硬盘所需要的信息则是通过之后的高级格式化,即Format命令来实现。用一个形象的比喻,分区就好比在一张白纸上画一个大方框。而格式化好比在方框里打上格子。安装各种软件就好比在格子里写上字。分区和格式化就相当于为安装软件打基础,实际上它们为电脑在硬盘上存储数据起到标记定位的作用。

参数

  • -b<分区大小> 指定每个分区的大小。

  • -l 列出指定的外围设备的分区表状况。

  • -s<分区编号> 将指定的分区大小输出到标准输出上,单位为区块。

  • -u 搭配"-l"参数列表,会用分区数目取代柱面数目,来表示每个分区的起始地址。

举例

fdisk –l 查看系统上的磁盘信息:

[root@hpf-linux ~]# fdisk -l

Disk /dev/sda: 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: 0x000e64ad

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26         664     5120000   83  Linux
Partition 2 does not end on cylinder boundary.
/dev/sda3             664         918     2048000   82  Linux swap / Solaris
Partition 3 does not end on cylinder boundary.
/dev/sda4             918        2611    13597696    5  Extended
/dev/sda5             919        2611    13596672   83  Linux

我们在使用fdisk -l命令是会查看系统所有的磁盘信息,如果我们想查看单个硬盘情况,可以通过 fdisk -l /dev/sda 或者fdisk -l /dev/sdb 来操作。通过上面可以看出此系统是有一块磁盘,并且此磁盘分3个主分区一个扩展分区,而扩展分区又分一个逻辑分区。在Linux系统中默认最多分4个主分区,若想增加分区就要把其中一个主分区变为扩展分区,之后就可以通过扩展分区划分多个逻辑分区。通过上面可以看出这个硬盘是21.5G的,有255个磁面;63代表一个磁面的扇区; 2610个磁柱;每个 cylinder(磁柱)的容量是 8225280 bytes=8225.280 K(约为)=8.225280M(约为); 上面输出的分区信息每列的信息:

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

  • 引导:表示引导分区,在上面的例子中 sda1 是引导分区;

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

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

  • 数据块容量:其单位是K;一个分区容量的值是由下面的公式而来的; Blocks = (相应分区End数值 - 相应分区Start数值)x 单位cylinder(磁柱)的容量 所以我们算一下 hda1的 Blocks 的大小 : sda1 Blocks=(26-1)x8225.280=213857.280 K = 213.86M 注:换算单位以硬盘厂家提供的10进位算起,如果以操作系统二进制来算,这个分区容量应该更少一些,得出的这个值和我们通过 fdisk -l 看到的 /dev/sda1的值是大体相当的,因为换算方法不一样,所以也不可能尽可能的精确;

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

  • 分区类型

fdisk 对硬盘及分区的操作:
我们可以对硬盘进行分区操作,通过fdisk -l ,我们能找出机器中所有硬盘个数及设备名称;比如上面的例子,我们会看到一个设备一个是/dev/sda。fdisk 操作硬盘的命令格式如下:# fdisk 设备。当我们通过 fdisk 设备,进入相应设备的操作时,会发现有如下的提示:

[root@hpf-linux ~]# 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) 注:扩展应用,专家功能;

其实我们常用的只有注有中文的,其它的功能我们不常用;一般的情况下只要懂得 d l m p q t w 就行了;

列出当前操作硬盘的分区情况,用p:
Command (m for help): p

Disk /dev/sda: 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: 0x000e64ad

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26         664     5120000   83  Linux
Partition 2 does not end on cylinder boundary.
/dev/sda3             664         918     2048000   82  Linux swap / Solaris
Partition 3 does not end on cylinder boundary.
/dev/sda4             918        2611    13597696    5  Extended
/dev/sda5             919        2611    13596672   83  Linux

执行删除分区5:
Command (m for help): d
Partition number (1-5): 5

Command (m for help): p

Disk /dev/sda: 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: 0x000e64ad

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26         664     5120000   83  Linux
Partition 2 does not end on cylinder boundary.
/dev/sda3             664         918     2048000   82  Linux swap / Solaris
Partition 3 does not end on cylinder boundary.
/dev/sda4             918        2611    13597696    5  Extended

警告:删除分区时要小心,请看好分区的序号,如果您删除了扩展分区,扩展分区之下的逻辑分区都会删除;所以操作时一定要小心;如果知道自己操作错了,请不要惊慌,用q不保存退出;切记切记!!!!在分区操作错了之时,千万不要输入w保存退出!!!

添加一个分区:
Command (m for help): n
First cylinder (919-2611, default 919): 注:这个就是分区的Start 值;这里最好直接按回车,如果您输入了一个非默认的数字,会造成空间浪费;
Using default value 919
Last cylinder, +cylinders or +size{K,M,G} (919-2611, default 2611): +200M  注:这个是定义分区大小的,+200M 就是大小为200M ;当然您也可以根据p提示的单位cylinder的大小来算,然后来指定 End的数值。回头看看是怎么算的;还是用+200M这个办法来添加,这样能直观一点。如果您想添加一个10G左右大小的分区,请输入 +10G ;

Command (m for help): p

Disk /dev/sda: 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: 0x000e64ad

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26         664     5120000   83  Linux
Partition 2 does not end on cylinder boundary.
/dev/sda3             664         918     2048000   82  Linux swap / Solaris
Partition 3 does not end on cylinder boundary.
/dev/sda4             918        2611    13597696    5  Extended
/dev/sda5             919         944      208824+  83  Linux

通过fdisk的t指令指定分区类型:
Command (m for help): t   注:通过t来指定分区类型;
Partition number (1-5): 5 注:要改变哪个分区类型呢?我指定了5,其实也就是sda5
Hex code (type L to list codes): L  注:在这里输入L,就可以查看分区类型的id了;

Hex code (type L to list codes): 8e  注:指定为LVM类型
Changed system type of partition 5 to 8e (Linux LVM)

Command (m for help): p

Disk /dev/sda: 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: 0x000e64ad

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26         664     5120000   83  Linux
Partition 2 does not end on cylinder boundary.
/dev/sda3             664         918     2048000   82  Linux swap / Solaris
Partition 3 does not end on cylinder boundary.
/dev/sda4             918        2611    13597696    5  Extended
/dev/sda5             919        2611    13596672   8e  Linux LVM

说明:在刚开始用n创建磁盘分区的时候会有一个选择这两个选项:e是代表扩展分区p代表的是主分区。
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)

创建完分区后可以在/proc/partitions中查看内核磁盘分区表。在已经分区并且已经挂载其中某个分区的磁盘设备上创建的新分区,内核可能在创建完成后无法直接识别。那么可以使用partx -a [device]或者kpartx -af [device]来进行通知内核强制重读磁盘分区表。

mke2fs

mke2fs命令用于在设备上(通常为硬盘)创建Linux文件系统。mke2fs本身并不执行建立文件系统的工作,而是去调用相关的程序来执行。

参数

  • -b<区块大小>:指定区块大小,单位为字节;

  • -c;检查是否有损坏的区块;

  • -f<不连续区段大小>:指定不连续区段的大小,单位为字节;

  • -F:不管指定的设备为何,强制执行mke2fs; * -i<字节>:指定"字节/inode"的比例;

  • -N:指定要建立的inode数目;

  • -l<文件>:从指定的文件中,读取文件西中损坏区块的信息;

  • -L<标签>:设置文件系统的标签名称;

  • -m<百分比值>:指定给管理员保留区块的比例,预设为5%;

  • -M:记录最后一次挂入的目录;

  • -q:执行时不显示任何信息;

  • -r:指定要建立的ext2文件系统版本;

  • -R=<区块数>:设置磁盘阵列参数;

  • -S:仅写入superblock与group descriptors,而不更改inode able inode bitmap以及block bitmap;

  • -v:执行时显示详细信息;

  • -V:显示版本信息。

  • -t : 给定档案系统的型式。

举例

将sdb1分区格式化为ext4格式:

[root@hpf-linux ~]# mke2fs -t ext4 /dev/sdb1 
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
24480 inodes, 97636 blocks
4881 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
12 block groups
8192 blocks per group, 8192 fragments per group
2040 inodes per group
Superblock backups stored on blocks: 
    8193, 24577, 40961, 57345, 73729

Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

注意:这里的文件系统是要指定的,比如 ext3 ;reiserfs ;ext4 ;fat32 ;msdos 等。设备可以是一块硬盘的分区,软盘,光驱等。 在格式化分区之前,您得懂得如何查看硬盘分区情况,并有针对性的格式化;可以用fdisk -l命令查看. 格式化完成后,可以用mount命令加载分区了。比如将上面格式后的/dev/sdb1分区挂载到/mnt/。

[root@hpf-linux ~]# mount /dev/sdb1 /mnt/
[root@hpf-linux ~]# ll /mnt/
total 12
drwx------ 2 root root 12288 Apr 13 18:53 lost+found

查看更改卷标命令e2label以及简单使用:

# e2label /dev/sdb1          //查看卷标
DATE
# e2label /dev/sdb1 MYDATE   //更改卷标
# e2label /dev/sdb1
MYDATE

查看分区的UUID和TYPE命令blkid 以及简单使用:

# blkid /dev/sdb2   //不显示信息是因为/dev/sdb2还未格式化
# blkid /dev/sdb1
/dev/sdb1: LABEL="MYDATE" UUID="c15e1494-00b0-4e67-bd9b-f575bee8824d" SEC_TYPE="ext2" TYPE="ext3"

dumpe2fs命令用于打印“ext2/ext3”文件系统的超级块和快组信息:
命令参数:

  • -b:打印文件系统中预留的块信息;

  • -ob<超级块>:指定检查文件系统时使用的超级块;

  • -OB<块大小>:检查文件系统时使用的指定的块大小;

  • -h:仅显示超级块信息;

  • -i:从指定的文件系统映像文件中读取文件系统信息;

  • -x:以16进制格式打印信息块成员。

tune2fs

tune2fs是调整和查看ext2/ext3文件系统的文件系统参数,Windows下面如果出现意外断电死机情况,下次开机一般都会出现系统自检。Linux系统下面也有文件系统自检,而且是可以通过tune2fs命令,自行定义自检周期及方式。

参数

  • -c:调整最大加载次数;

  • -C:设置文件系统已经被加载的次数;

  • -e:设置内核代码检测到错误时的行为;

  • -f:强制执行修改,即使发生错误;

  • -i:设置相邻两次文件系统检查的相隔时间;

  • -j:为“ext2”文件系统添加日志功能,将其转换为“ext3”文件系统;

  • -l:显示文件超级块内容;

  • -L:设置文件系统卷标;

  • -m:显示文件保留块的百分比;

  • -M:设置文件系统最后被加载到的目录;

  • -o:设置或清除文件系统加载的特性或选项;

  • -O:设置或清除文件系统的特性或选项;

  • -r:设置文件系统保留块的大小;

  • -T:设置文件系统上次被检查的时间;

  • -u:设置可以使用文件系统保留块的用户;

  • -U:设置文件系统的UUID。

使用举例:

tune2fs -c 30 /dev/hda1 设置强制检查前文件系统可以挂载的次数
tune2fs -c -l /dev/hda1 关闭强制检查挂载次数限制。
tune2fs -i 10 /dev/hda1 10天后检查
tune2fs -i 1d /dev/hda1 1天后检查
tune2fs -i 3w /dev/hda1 3周后检查
tune2fs -i 6m /dev/hda1 半年后检查
tune2fs -i 0 /dev/hda1 禁用时间检查
tune2fs -j /dev/hda1 添加日志功能,将ext2转换成ext3文件系统
tune2fs -r 40000 /dev/hda1 调整/dev/hda1分区的保留空间为40000个磁盘块
tune2fs -o acl,user_xattr /dev/hda1 设置/dev/hda1挂载选项,启用Posix Access Control Lists和用户指定的扩展属性
开机取消自检:
tune2fs -l /dev/sdb1 | grep -E ‘Maximum mount count:|Check interval’
tune2fs -i 0 -c 0 /dev/sdb1

fsck

在Linux系统中,为了增加系统性能,通常系统默认一些数据写在内存中,并不会直接将数据写入硬盘,这是因为内存速度要比硬盘快若干倍。但是有个问题,万一由于“断电”或者其他未知原因,造成系统死机,怎么办?系统就崩溃了。所以,我们需要在特定的时候让数据直接回存到硬盘中。当文件系统发生错误时,可用fsck命令尝试加以修复.直接采用分区编号(如/dev/had3),或使用挂载点(Mount Point,如/、/usr等)指定文件系统皆可。假设一次指定多个文件系统,而这些系统分别位于不同的物理磁盘上,则fsck将会尝试同步的方式去检查他们,以节省操作时间。值得注意的是fsck 扫描文件系统时一定要在单用户模式、修复模式或把设备umount后进行。

语法

 fsck [-sACVRP] [-t fstype] [--] [fsck-options] filesys [...]

参数

  • -a 非互交模式,自动修复

  • -c 检查是否存在有损坏的区块。

  • -C<反叙述器> fsck.ext3命令会把全部的执行过程,都交由其逆向叙述,便于监控程序

  • -d 详细显示命令执行过程

  • -f 强制进行检查

  • -F 检查文件系统之前,先清理该保存设备块区内的数据

  • -l<损坏区块文件> 把文件中所列出的损坏区块,加入标记

  • -L<损坏区块文件> 清除所有损坏标志,重新标记

  • -n 非交互模式,把欲检查的文件系统设成只读

  • -P<数字> 设置fsck.ext2命令所能处理的inode大小为多少

  • -r 交互模式

  • -R 忽略目录

  • -s 顺序检查

  • -S 效果和指定“-s”参数类似

  • -t 显示fsck.ext2命令的时序信息。

  • -v 显示详细的处理过程

  • -y 关闭互动模式

  • -b<分区第一个磁区地址> 指定分区的第一个磁区的起始地址/Super Block。

  • -B<区块大小> 设置该分区每个区块的大小

  • -I设置欲检查的文件系统,其inode缓冲区的区块数目

命令说明

运行fsck后,该命令会分6个阶段对文件系统 进行检查,这六个阶段分别是:
阶段1: 检查块和块的大小
阶段2: 检查路径名
阶段3: 检查连接性
阶段4: 检查参考记数
阶段5: 检查自由块列表
阶段6: 补救自由块列表
对每个阶段进行检查,常见的一些错误:

  1. 移去一个没有相关文件的目录入口 
    这时用户可以回答Yes或Y来删除该目录入口。     

  2. 重连接一个已分配但不能访问的文件:     
    fsck找到了一个已分配的I节点,但却不可访问(该节点没与任何目录连接),这时一般对fsck的"RECONNECT?"回答Yes,即把该I节点连接到lost+found目录下,文件名即是I节点号,之后管理员应检查该文件类型,判明该文件用途,再将该文件拷贝到相应目录下。

  3. 连接数调整ADJUST
    在交互方式下,fsck若发现连接数(与原记录)不一致,将询问用户采取何种行动,本例发现一目录的I节点连接数与该目录的真实连接数不一致。
    这时用户应该回答Yes或Y来改正连接数。     

  4. 自由块表不一致     
    fsck查出未分配块数与超级块中所给出的自由块表不一致。
    这时用户应该回答Yes或Y来修正超级块。
    从上面的出错信息和处理方法可以发现,对于fsck询问的问题大多数情况下都可以用Yes来回答,所以在实际应用时,可以用" -y"选项来执行该命令对硬盘进行检查和修复。

这里:
RECONNECT
   表示目录丢失,可将其存入lost+found中再作转移。回答yes
SUPERBLK坏(注意是坏,不是wrong)
   修复见上面(如果是wrong就随便了,修不修都可以)
CLEAR
   删i节点,可能会错
REMOVE
   删文件,一般给出文件名。file=....
ADJUST
   调整连接数。实际数与原记录不符。回答yes
使用一般都是yes过去的,不能在正在mount的文件系统上操作,否则有可能导致文件系统损坏。但也没有碰到过用fsck导致发生错误的情况,不过还是建议操作的时候规范一些。
对于一个已经安装好了的文件系统,fsck 命令不会做出矫正。
fsck 命令出于某些原因可以在一个已经安装好了的文件系统中运行,但不是进行修复。但是当文件系统安装完毕之后,也许会返回不准确的错误消息。
fsck 命令检查并以交互方式修复不连贯的文件系统。在安装文件系统之前,应该运行这个命令。您必须能够读设备文件,在这个设备上驻留着文件系统(例如/dev/sda1)安装一个不连贯的文件系统也许会导致系统的崩溃。

运行fsck命令后产生的文件有什么用?
  当执行fsck命令时,fsck命令如果发现存在孤立的文件或目录,这些孤立的文件或目录对于系统管理员或用户来说,无法访问到它,因为它与它的上级目录失去了关联,如果用户允许fsck重新把它们找回来的话,fsck命令就会把这些孤立的文件或目录放在文件系统的/lost+found目录下,并用各自的i-node号来命名,以便用户查找自己需要的文件。Lost+found目录通过它的英文含义我们都可以知道,它是一个失物认领处。
  因此当某个用户发现自己丢失了某个文件,可以在执行fsck之后到/lost+found目录下去查找,这时通过文件名已无法辨认出文件的作用,只能用file之类的命令来确定文件的类型,如果是数据文件,可以用more或vi命令来查看,如果是二进制文件,可以用dbx命令来调试或者试着执行它(注意它可能是一个具有破坏性的程序),知道文件或目录的作用之后,可以对其进行改名。
  如果用户不允许fsck把这些孤立的文件或目录找回来,那么fsck命令就会破坏这些文件或目录,彻底丢失这些文件或目录,用户或系统管理员永远也无法找回它们。

http://leeforget.blog.51cto.com/6950397/1371380

mount

Linux mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件,此命令挂载cdrom,使我们可以访问cdrom中的数据,因为你将光盘插入cdrom中,Linux并不会自动挂载,必须使用Linux mount命令来手动完成挂载。 Linux显示所有的目录都在一个目录树下,而于他们位于哪一个驱动器/硬件无关。在Linux下的磁盘内容作为子目录形式出现的。

命令格式

mount [-t vfstype] [-o options] device dir

参数

  • -a 安装在/etc/fstab文件中类出的所有文件系统。

  • -f 伪装mount,作出检查设备和目录的样子,但并不真正挂载文件系统。

  • -n 不把安装记录在/etc/mtab 文件中。

  • -r 讲文件系统安装为只读。

  • -v 详细显示安装信息。

  • -w 将文件系统安装为可写,为命令默认情况。

  • -t <文件系统类型> 指定设备的文件系统类型,常见的有:

    • ext4 linux目前常用的文件系统

    • msdos MS-DOS的fat,就是fat16

    • vfat windows98常用的fat32

    • nfs 网络文件系统

    • iso9660 CD-ROM光盘标准文件系统

    • ntfs windows NT/2000/XP的文件系统

    • auto 自动检测文件系统

    • smbfs/cifs Windows文档网络共享

  • -o <选项> 指定挂载文件系统时的选项,有些也可写到在/etc/fstab中。常用的有:

    • defaults 使用所有选项的默认值(auto、nouser、rw、suid)

    • auto/noauto 允许/不允许以 –a选项进行安装

    • dev/nodev 对/不对文件系统上的特殊设备进行解释

    • exec/noexec 允许/不允许执行二进制代码

    • suid/nosuid 确认/不确认suid和sgid位

    • user /nouser 允许/不允许一般用户挂载

    • codepage=XXX 代码页

    • iocharset=XXX 字符集

    • ro 以只读方式挂载

    • rw 以读写方式挂载

    • remount 重新安装已经安装了的文件系统

    • loop 挂载“回旋设备”以及“ISO镜像文件”

需要注意的是,挂载点必须是一个已经存在的目录,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用,umount以后会恢复正常。使用多个-o参数的时候,-o 只用一次,参数之间用半角逗号隔开:

# mount –o remount,rw /

例如要挂载windows下文件系统为FAT32的D盘,一般而言在Linux下这个分区对应/dev/hda5,根据具体的分区情况会有不同,这里就以hda5来举例说明:

# mkdir /mnt/hda5 //创建hda5的目录作为挂载点,位置和目录名可自定义//
# mount -t vfat /dev/hda5 /mnt/hda5

一般而言,Linux会自动探测分区的文件系统,除非让你指定时,否则-t vfat 可以省掉。

# mount /dev/hda5 /mnt/hda5

这样就可以进入/mnt/hda5目录去访问分区中的资源了。

为什么mount上分区后显示不了中文文件为问号/乱码?
显示问号表明你的系统中没有可识别使用的中文字体,请先安装中文字体。确保你的系统已经可以很好的显示中文。显示为乱码一般是mount默认使用的文件系统编码和文件系统中文件的实际编码不一致造成的。要想正常显示中文文件,mount时需要用到 -o 参数里的codepage和iocharset选项。codepage指定文件系统的代码页,简体中文中文代码是936;iocharset指定字符集,简体中文一般用cp936或gb2312。

# mount –o iocharset=gb2312 codepage=936 /dev/hda5 /mnt/hda5

一般来说 mount –o iocharset=cp936 /dev/hda5 /mnt/hda5 就可以解决问题了。
如果这样做了以后还有问题,请尝试UTF-8编码:

# mount –o iocharset=utf8 /dev/hda5 /mnt/hda5

为什么mount上去以后分区普通用户不可写?
mount时加上 –o umask=000 即可:

# mount –o umask=000, iocharset=cp936 /dev/hda5 /mnt/hda5

为什么mount上去后的分区中的文件都变成短文件名了?
这是文件系统挂错的原因,将FAT32挂载成FAT16时就会出现这种情况,先umount,然后用 –t vfat 重新挂载即可解决问题。

# mount –t vat /dev/hda5 /mnt/hda5

如何挂载U盘和mp3?
如果计算机没有其它SCSI设备和usb外设的情况下,插入的U盘的设备路径是 /dev/sda1,用命令:

# mkdir /mnt/u
# mount /dev/sda1 /mnt/u

可以直接使用iso文件吗?
可以,就是mount的这一选项使得Linux下有免费虚拟光驱的说法,具体用法是:

# mkdir /mnt/iso
# mount –o loop linux.iso /mnt/iso

当然,挂载以后挂载点/mnt/iso也是只读的。

如何开机自动挂载分区?
每次挂载都要输入那么长的命令的确是繁琐了些,只要将分区信息写到/etc/fstab文件中即可实现系统启动的自动挂载,例如对于/dev/hda5的自动挂载添加如下的行即可:

/dev/hda5 /mnt/hda5 vfat defaults,iocharset=cp936, rw 0 0

如何挂载samba 分区?

# mkdir /mnt/share
# mount -t smbfs -o username=root,password=abc,codepage=936,iocharset=gb2312 //192.168.1.100/share /mnt/share

如果中文显示不正常请尝试UTF-8编码。当然可以写到fstab中实现自动挂载。

mount –bind是什么意思?
mount –bind 是将一个目录中的内容挂载到另一个目录上,用法是

# mount –bind olddir newdir

这个命令使得自己搭建的FTP要共享某个目录的时候变得特别方便。如果要取消mount用命令:

# mount –move olddir newdir 

如果mount –bind 也想写入fstab中的话格式如下:

olddir newdir none bind 0 0

为什么umount的时候老显示 device busy?
这是因为有程序正在访问这个设备,最简单的办法就是让访问该设备的程序退出以后再umount。可能有时候用户搞不清除究竟是什么程序在访问设备,如果用户不急着umount,则可以用:

# umount -l /mnt/hda5

来卸载设备。选项 –l 并不是马上umount,而是在该目录空闲后再umount。
可以先用命令 ps aux 来查看占用设备的程序PID,然后用命令kill来杀死占用设备的进程,这样就umount的非常放心了。

http://www.9usb.net/200806/linux-mount.html
http://blog.csdn.net/leo201592/article/details/2591731

fuser

有时候会遇到无法卸载的情况,遇到这种情况的原因是因为有其他用户或进程正在访问该文件系统导致的,在Linux系统中,是不允许对正在被访问的文件系统进行卸载操作的,只有当该文件系统上所有访问的用户或进程完成操作并退出后,这个文件系统才能被正常卸载。我们有两种方法来处理这种情况,一是用命令“lsof +挂载点”来查看到底是哪些进程正在访问该文件系统,查找出来后,使用kill命令将进程杀死来进行卸载。二是使用命令“fuser -k +挂载点”。加-k选项是使用命令fuser找出正在访问该文件系统的进程,加上-k选项就是找出来并杀死。通过以上两种方法就可以对一些无法卸载的文件系统进行卸载了。
fuser 使用文件或者套节字来表示识别进程。我常用的他的两个功能:查看我需要的进程和我要杀死我查到的进程。 比如当你想umount光驱或者其他文件系统的的时候,结果系统提示你设备正在使用或者正忙,可是你又找不到到底谁使用了他。这个时候fuser可派上用场了。

命令参数

  • -a 显示所有指定文件的情况,即使没有进程访问它们。

  • -k 表示杀死访问指定文件的进程。

  • -i 表示交互模式,在杀死进程前会提示。必须和 -k 合用。

  • -l:列出所有已知信号名;

  • -m 表示指定文件所在的文件系统或者块设备(处于 mount 状态)。所有访问该文件系统的进程都被列出。

  • -n 指定 sockets 的协议类型。可以是 file(默认)、udp、tcp 。

  • -s 表示安静模式。-u 和 -v 会被忽略,-a 不能和 -s 一起使用。

  • -u 表示在 PID 后面加上进程的 owner

  • -v 表示 verbose 模式。进程以 ps 的方式显示,包括 PID、USER、COMMAND、ACCESS 字段

    • 表示重置所有选项并把信号设置为 SIGKILL

fuser 显示使用指定文件或者文件系统的进程的 pid ,默认会在每个 pid 后面加上一个字符表示访问的方式 :

  • c :表示 current directory 。表示进程是在该目录下启动的。

  • e :表示是可执行的程序

  • f :打开文件。默认不显示

  • r :root 目录,表示该目录是该进程的 / 目录

  • m :表示 mmap 过的文件或者共享库

fuser 的返回值:
fuser如果没有找到任何进程正在使用指定的file, filesystem 或 socket, 或者在查找过程中发生了fatal error,则返回non-zero 值。 fuser如果找到至少一个进程正在使用指定的file, filesystem 或 socket,则返回zero。

fuser 常用场景 :
fuser通常被用在诊断系统的“resource busy”问题,通常是在你希望umount指定的挂载点得时候遇到。如果你希望kill所有正在使用某一指定的file, file system or sockets的进程的时候,你可以使用-k option。

# fuser –k /path/to/your/filename

这时fuser会向所以正在使用/path/to/your/filename的进程发送SIGKILL。如果你希望在发送之前得到提示,可以使用-i 选项。

# fuser –k –i /path/to/your/filename

应用举例

# fuser -km /home

说明:fuser -km /home 杀死所有访问 /home 文件系统的进程。
查看/usr/local/目录的需要进程。

# fuser -vm /usr/local/

/etc/mtab、/etc/fstab文件说明

  • /etc/fstab文件的作用 :记录了计算机上硬盘分区的相关信息,启动 Linux 的时候,检查分区的 fsck 命令,和挂载分区的 mount 命令,都需要 fstab 中的信息,来正确的检查和挂载硬盘。

  • /etc/mtab文件的作用: 记载的是现在系统已经装载的文件系统,包括操作系统建立的虚拟文件等;而/etc/fstab是系统准备装载的。

每当 mount 挂载分区、umount 卸载分区,都会动态更新 mtab,mtab 总是保持着当前系统中已挂载的分区信息,fdisk、df 这类程序,必须要读取 mtab 文件,才能获得当前系统中的分区挂载情况。当然我们自己还可以通过读取/proc/mount也可以来获取当前挂载信息。

详细说明

在linux中/etc/fstab的数据项如下所示:

设备名称 挂载点 分区的类型 挂载选项 dump选项 fsck选项

# cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Tue Sep 13 19:41:22 2016
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=f3b17e6e-d0ba-4797-bd95-a5e56d57e1d3 /                       ext4    defaults        1 1
UUID=e57690d2-d8c6-40b9-b7b7-cf90f5549c25 /boot                   ext4    defaults        1 2
UUID=e3c900ae-f407-4960-ad6d-d44b9c0083f4 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
  • 设备名称项,可以是实际的设备名称/dev/sda1,也可以是实际设备的标签例如LABLE=/,我们可以知道 LABEL=/1是/dev/sda1的标签;那我们用什么命令来为实际的设备设置标签的方法,对于ext3和ext2文件系统,我们可以用 e2label 来设置 e2label device [newlabel],比如我们想把文件系统为ext3 的分区/dev/hda1的标签设备为 /1 ,我们应该执行如下的命令:[root@localhost beinan]# e2label /dev/hda1 /1

  • 挂载点,没什么多说的,/、 /usr、 swap 都是系统安装时分区的默认挂载点。方法如下:

  • 文件系统类形:

  • 挂载选项,下面列举几个常用的:

    • auto: 系统自动挂载,fstab默认就是这个选项

    • defaults: rw, suid, dev, exec, auto, nouser, and async.

    • noauto 开机不自动挂载

    • nouser 只有超级用户可以挂载

    • ro 按只读权限挂载

    • rw 按可读可写权限挂载

    • user 任何用户都可以挂载

请注意光驱和软驱只有在装有介质时才可以进行挂载,因此它是noauto

  • dump选项,设置是否让备份程序dump备份文件系统,0为忽略,1为备份,如果上次用dump备份,将显示备份至今的天数。

  • fsck选项,告诉fsck程序以什么顺序检查文件系统,为0就表示不检查,(/)分区永远都是1,其它的分区只能从2开始,当数字相同 就同时检查(但不能有两1),

dd

dd是一个Unix和类Unix系统上的命令,主要功能为转换和复制文件。在Unix上,硬件的设备驱动(如硬盘)和特殊设备文件(如/dev/zero和/dev/random)就像普通文件一样,出现在文件系统中;只要在各自的驱动程序中实现了对应的功能,dd也可以读取自和/或写入到这些文件。这样,dd也可以用在备份硬件的引导扇区、获取一定数量的随机数据等任务中。dd程序也可以在复制时处理数据,例如转换字节序、或在ASCII与EBCDIC编码间互换。

参数

  • if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >

  • of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >

  • ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。

  • obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。

  • bs=bytes:同时设置读入/输出的块大小为bytes个字节。

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

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

  • seek=blocks:从输出文件开头跳过blocks个块后再开始复制。 注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。

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

  • conv=CONVS:用指定的参数转换文件。

    • ascii:转换ebcdic为ascii

    • ebcdic:转换ascii为ebcdic

    • ibm:转换ascii为alternate ebcdic

    • block:把每一行转换为长度为cbs,不足部分用空格填充

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

    • lcase:把大写字符转换为小写字符

    • ucase:把小写字符转换为大写字符

    • swab:交换输入的每对字节

    • noerror:出错时不停止

    • notrunc:不截短输出文件

    • sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

  • iflag=FLAGS:读的停顿分隔符号列表

  • oflag=FLAGS:写的停顿分隔符号列表

    • append 追加模式(仅对输出有意义;隐含了conv=notrunc)

    • direct 使用直接I/O 存取模式

    • directory 除非是目录,否则 directory 失败

    • dsync 使用同步I/O 存取模式

    • sync 与上者类似,但同时也对元数据生效

    • fullblock 为输入积累完整块(仅iflag)

    • nonblock 使用无阻塞I/O 存取模式

    • noatime 不更新存取时间

    • noctty 不根据文件指派控制终端

    • nofollow 不跟随链接文件

/dev/null、/dev/zero 伪文件系统

  • /dev/null : 位桶文件(bit bucket),就是我们常说的空文件。是一个输出设备。

任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。把/dev/null看作”黑洞”. 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.

  • /dev/zero :是一个输入设备,你可你用它来初始化文件。

该设备无穷尽地提供0(是ASCII 0 就是NULL),可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入NULL。 像/dev/null一样, /dev/zero也是一个伪文件, 但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的). 写入它的输出会丢失不见, 而从/dev/zero读出一连串的null也比较困难, 虽然这也能通过od或一个十六进制编辑器来做到. /dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件.

举例

将本地的/dev/hdb整盘备份到/dev/hdd

# dd if=/dev/hdb of=/dev/hdd              hdb –> 内存 -> hdd

将/dev/hdb全盘数据备份到指定路径的image文件

# dd if=/dev/hdb of=/root/image            hdb –> 内存 -> image文件

将备份文件恢复到指定盘

# dd if=/root/image of=/dev/hdb             image文件 –> 内存 -> hdb

备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径

# dd if=/dev/hdb | gzip> /root/image.gz

将压缩的备份文件恢复到指定盘

# gzip -dc /root/image.gz | dd of=/dev/hdb

备份磁盘开始的512个字节大小的MBR 主引导记录信息到指定文件

# dd if=/dev/hda of=/root/image count=1 bs=512 

默认从硬盘0柱面0磁道1扇区读取512个字节 count=1指仅拷贝一个块;bs=512指块大小为512个字节。
恢复:

dd if=/root/image of=/dev/hda

备份软盘

# dd if=/dev/fd0 of=disk.img count=1  bs=1440k (即块大小为1.44M)

拷贝内存内容到硬盘

# dd if=/dev/mem of=/root/mem.bin  bs=1024 (指定块大小为1k)  

拷贝光盘内容到指定文件夹,并保存为cd.iso镜像文件

# dd if=/dev/cdrom(hdc)   of=/root/cd.iso

增加swap交换分区文件大小
第一步:创建一个大小为256M的文件:

# dd if=/dev/zero  of=/swapfile  bs=1024 count=262144

第二步:把这个文件变成swap交换分区文件:

# mkswap /swapfile

第三步:启用这个swap交换分区文件:

# swapon /swapfile

第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap交换分区文件:

/swapfile    swap    swap    default   0 0

销毁磁盘数据

# dd if=/dev/urandom of=/dev/hda1

注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。
测试硬盘的读写速度

# dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file    写速度
# dd if=/root/1Gb.file bs=64k | dd of=/dev/null      读速度

通过以上两个命令输出的命令执行时间,可以计算出硬盘的读、写速度。

使用dd命令来测试写速度:

[root@hpf-linux ~]# dd if=/dev/zero of=/tmp/test1.img bs=1G count=1 oflag=dsync
记录了1+0 的读入
记录了1+0 的写出
1073741824字节(1.1 GB)已复制,28.1615 秒,38.1 MB/秒
[root@hpf-linux ~]# dd if=/dev/zero of=/tmp/test2.img bs=1G count=1 conv=fdatasync
记录了1+0 的读入
记录了1+0 的写出
1073741824字节(1.1 GB)已复制,12.1391 秒,88.5 MB/秒

各项的说明:

  • if=/dev/zero (if=/dev/input.file) :用来设置dd命令读取的输入文件名。

  • of=/tmp/test1.img (of=/path/to/output.file):dd命令将input.file写入的输出文件的名字。

  • bs=1G (bs=block-size) :设置dd命令读取的块的大小。例子中为1个G。

  • count=1 (count=number-of-blocks):dd命令读取的块的个数。

  • oflag=dsync (oflag=dsync) :使用同步I/O。不要省略这个选项。这个选项能够帮助你去除caching的影响,以便呈现给你精准的结果。

  • conv=fdatasyn: 这个选项和oflag=dsync含义一样。

Linux磁盘管理.md