!!!----本文的所有实验均是在centos 6.6平台上实现的----!!!



一、计算机基础知识

冯·诺依曼体系机构构成的计算机,必有的五大基本组成部件:


wKiom1UxuTDj6CV5AAFbpe5I1ro396.jpg

冯·诺依曼体系结构图

    ·运算器:用于完成各种算术运算、逻辑运算和数据传送等数据加工处理。

    ·控制器:用于控制程序的执行,是计算机的大脑。运算器和控制器组成计算机

的中央处理器(CPU)。控制器根据存放在存储器中的指令序列(程序)进行工作,并由

一个程序计数器控制指令的执行。控制器具有判断能力,能根据计算结果选择不同的

工作流程。

    ·存储器:用于记忆程序和数据,例如:内存。程序和数据以二进制代码形式不加

区别地存放在存储器中,存放位置由地址确定。

    ·输入设备:用于将数据或程序输入到计算机中,例如:鼠标、键盘。

    ·输出设备:将数据或程序的处理结果展示给用户,例如:显示器、打印机。

    上述功能的体现在硬件中除了CUP、内存等其他输入输出,还有北桥芯片和南桥芯片也至关重要。简单的讲,北桥芯片,主要负责控制AGP显卡、内存与CPU之间的数据交换,南桥芯片,主要负责软驱、硬盘、键盘以及附加卡的数据交换。(南桥芯片相对于北桥芯片数据处理量并不算大,它通过汇总的方式将数据传到北桥芯片,北桥芯片才是主芯片)



二、设备类型

通过上面的介绍,我们知道南桥芯片主要连接一些I/O设备,决定主板上的功能,主板上的各种接口(usb、串口),PCI总线(内猫、声卡),IDE(硬盘、光驱),以及主板上的其他芯片(RAID、网卡)都归南桥控制,属低速总线控制器。注:服务器的最重要的两大I/O是网卡和磁盘。

这么多I/O设备,南桥芯片是如何来识别这些设备呢?设备类型又有哪些呢?

I/O端口:就是一种地址,用于标识对应的I/O设备 I/O端口范围:0--65535。

(1)设备类型(宏观上分类)

    ·字符设备character:以字符为单位进行顺序访问的设备 例如键盘。

    ·块设备block:以块为单位,能够进行随机访问的设备。

(2)设备具体的分类(比如磁盘,CPU,内存等,我们需要对这些设备进行标识)

    设备文件定义:关联至一个驱动程序,进而能够与之对应硬件设备进行交互。

(3)设备文件的标识:

    主设备号:标识的是设备类型。

    次设备号:同一类设备中不同设备的标识。(例如都是磁盘,要跟上具体编号1、2...)

wKioL1UzgGHRYAu6AALk-OjSI8o664.jpg注意:设备文件的特性:设备文件无大小,只有元数据,没有数据。(理解为设备文件是内核上虚拟出来的,是硬件设备的前端体现)



三、磁盘结构

wKiom1UzlFSieHbdAACvhNme4dM406.jpg

                   经典的磁盘结构

上图给出了一个磁盘驱动器两个主要的移动部件;一个是磁盘组合(disk assembly) ,另一个是磁头组合(head assembly)。磁盘组合由一个或多个圆盘(platter)组成,它们围绕着一根中心主轴旋转。圆盘的上表面和下表面涂覆了一薄层磁性材料,二进制 位被存储在这些磁性材料上。其中,0和1在磁材料中表现为不同的模式。

wKiom1Uzl93g_Za5AAEPaxzWwlU750.jpg
                   盘面的顶视图

    1、盘面:硬盘的每一个盘片都有两个盘面(Side),即上、下盘面,一般每个盘面都会利用,都可以存储数据,成为有效盘片,也有极个别的硬盘盘面数为单数。

    2、磁道:磁盘在格式化时被划分成许多同心圆,这些同心圆轨迹叫做磁道(Track)。磁道从外向内从0开始顺序编号。硬盘的每一个盘面有300~1 024个磁道,新式大容量硬盘每面的磁道数更多。

    3、扇区:每秒转动的角度,即每段圆弧叫做一个扇区。扇区从“1”开始编号,每个扇区中的数据作为一个单元同时读出或写入,从逻辑层面上讲已经进行了低的格式化,单位为512字节。

    4、柱面:所有盘面上的同一位置的磁道构成一个圆柱,通常称做柱面(Cylinder),每个圆柱上的磁头由上而下从“0”开始编号。(分区是按照柱面进行分区的)



四、linux中的磁盘介绍

linux的哲学思想(1)--一切皆文件。linux中的磁盘是以设备文件的形式展现出来的。

(1)设备文件的名称

即linux磁盘设备文件的访问标识:/dev/[s|h]d[a-z][1、2...]。

    [s|h]:磁盘设备接口类型。

    [a-z]:磁盘编号。

    [1、2...]:分区标号,1-4编号:主分区和逻辑分区的编号,5以上的编号为逻辑分区编号。如sda1,代表SCIS接口类型的第一块磁盘的第一个主分区

注意:特性--对于linux系统而言,每个分区都是可以独立访问的设备

(2)磁盘接口类型

    ·IDE接口(ATA):并行接口(理解为:两个IDE控制器:每个控制器可通过线缆接入两块磁盘,一主一从)这类接口的传输速率133MB/s。linux中表示为/dev/hd[a-z][1、2...]。

    ·SCSI接口:并行接口,Small Computer System Interface--小型计算机系统接口,特性:自带控制芯片,对CPU的占用率极低,占用CPU的时间是IDE接口占用CPU时间的1/10。所以SCSI的性能极高,它的传输速率为640MB/s。linux中表示为/dev/sd[a-z][1、2...]。

    ·USB接口:串行接口,3.0接口的传输速率为480MB/s。linux中表示为/dev/sd[a-z][1、2...]。

    ·SAS接口:串行接口,也称为序列式SCSI,它由并行SCSI物理存储接口演化而来,序列方式能提供更快速的通信传输速度以及更简易的配置。此外SAS并支持与序列式ATA(SATA)设备兼容。它的传输速率是6Gbps。linux中表示为/dev/sd[a-z][1、2...]。



    至此,我们对磁盘有了深入的认识,那么一个新的磁盘需要经哪些操作才能使用呢?

很简单只要记住3个步骤就OK啦--Ⅰ磁盘分区、Ⅱ格式化(创建文件系统)、Ⅲ挂载

接下来详细讲解每一个步骤的具体实现方法。



五、磁盘管理工具fdisk(分区)

fdisk提供了一个交互式接口来管理分区,它有许多子命令,用于磁盘额分区的管理,所有编辑操作,都是在内存中完成的。没有直接同步到磁盘,保存退出后才能完成磁盘的同步。

fdisk -l 显示所有的磁盘设备的详细信息。

fdisk -l [设备名] 显示指定的设备的详细信息。

子命令的作用(常用的必须记熟)

    m 显示帮助信息

    n 创建一个新分区

    d 删除一个分区

    w 保存分区信息并退出

    q 不保存退出

    t 修改分区的system id(16进制的数字)

    l 列出已知的所有分区类型

    p 打印分区表,列出现有的分区信息

    注:在子命令模式中,想删除当前的字符,按ctrl+backspace组合键才能删除

wKiom1U06sLztMhGAAE87AMtUD0621.jpg

查看内核中的分区情况
cat /proc/partitions 内核是否真正读取了分区表

wKioL1UzgTjC9lWUAAHAd6P-APo295.jpg



六、文件系统的创建(格式化)

磁盘分区后,我们接下来就是格式化,也就是文件系统的创建,怎么什么是文件系统呢?

①文件系统的定义:管理存储空间中,存储大量文件时,实现按名存储的一种机制(按照块的来进行存储,一个块=2个扇区的大小)

注意重点来了哦,先来了解文件系统的结构(这部分要是看不懂后面的一些命令选项就很难理解了)

    每一个文件都是有元数据和数据组成是毋庸置疑的,文件系统通常会将这两部分的数据分别存放在不同的块,权限和属性放置到inode中,实际参数放在data bolck中。另外,还有一个superbolck,会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等。

wKioL1UzYn6QlfhkAADpZVs5A_s215.jpg

块组的结构图

对上图的解析(重点)

一个分区可以理解为由一个Boot Block和N多个块组(Block Group)构成的。

Boot Block:块是预留的,用来引导系统分区的。它被是MBR中的Boot Loader调用的。

Super Block:存储整个文件系统的详细信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息;块组0上必须有Super Block,其他的组可以有也可以没有,最好是在其他的块组中有Super Block,用于备份。

GDT:块组的描述符,描述该组存放的是什么数据

Block Bitmap(块位图):可以知道哪些block是空的

Inode Bitmap(inode位图):可以知道哪些inode是未使用的,哪些是使用的

Inode Table:存放inoode条目

    inode属性:

    1.该文件的访问格式(r,w,x)

    2.该文件的属主属组

    3.该文件的大小

    4.该文件创建或状态改变的时间(ctime)

    5.该文件最近一次读取时间(atime)

    6.该文件最近一次修改时间(mtime)

    7.定义文件特性的标志(flag),例SUID等

    8.该文件真正内容的指向(记录此文件的数据所在的block)

    inode的特性

    ·每个inode大小均固定为128bytes

    ·每个文件都只会占用一个inode,所以文件系统上能创建的文件个数与inode数量有关

    ·inode不记录文件名,文件名的记录在目录block中

    ·系统读取文件是需要先找到inode,并分析inode所记录的权限和用户是否符合,若符合才能开始实际读取block的内容。

Data Block:实际记录文件的内容,若文件太大是,会占用多个block。

wKiom1U0602zlSGeAAJlmrU0pdY459.jpg

深刻了解文件系统

·····································

    问:1、在linux中要创建一个文件test.txt文件,经过哪几步骤?(结合上图)

    答:①首先是通过超级块来明确一下,哪个块组有空间能存储文件;②确定块组之后,在inode表中查找空闲的inode条目,由0标记为1;③通过块位图,查找空闲的block;④在inode条目中添加空闲block块的指向,在空的block中创建test.txt文件。

    问:2、在linux中要查找/tmp/aa/bb文件的过程?

    答:先查/ 的inode-->查/目录block中对应tmp的inode-->根据查到的/tmp的inode去查/tmp/目录block中对应aa的inode->根据查到的/tmp/aa的inode去查/tmp/aa/目录block中对应bb的inode-->根据查到的/tmp/aa/bb的inode去查block发现是文件-->读取数据。

····································  

②常用的linux文件系统类型

centos 7系列,默认使用的是xfs系列

centos 6系列,默认使用的是ext4系列

centos 5系列,默认使用的是ext3系列

centos 4系列,默认使用的是ext2系列 

iso9660 光盘文件系统

nfs 网络文件系统

gfs2 集群文件系统(redhat研发)

mogilefs、hdfs 两者属于分布式文件系统

swap 交换分区格式(注意:swap分区不是把它当作内存来使用,而是内存中的数据交换到swap分区,即swap交换分区拿出部分空间来存储内存中不常用的空间数据,以此来腾出更多的内存空间)

③文件系统管理分为两部分

    ·文件系统内核模块(普通的文件系统类型ext2\3\4)如下理解

wKiom1UzepehEsGlAAHKBMUnoDE964.jpg

/lib/modules/2.6.32-504.el6.x86_64/kernel/fs 文件系统的内核模块的存放目录,只有这里的文件系

统类型才能进行格式化。

    ·文件系统管理工具

注意:VFS 虚拟文件系统(磨平了不同文件系统之间的差异,调用的时候直接访问VFS文件系统)

  wKiom1UzXXTC1IS3AAElbiSgN4c055.jpg

④文件系统管理工具

mkfs:mkfs只是一个调用的功能 实际是这些应用程序的使用(mkfs.cramfs   mkfs.ext3 mkfs.ext4dev    mkfs.vfat     mkfs.ext2     mkfs.ext4     mkfs.msdos)

mkfs -t 文件系统类型 分区名

mke2fs:mke2fs专门用来格式化ext系列文件系统的命令

mke2fs [选项] 分区名           

    -t 用于指定文件系统类型 ext2\3\4

    -b指定块的大小 {1024|2048|4096}块的概念:多个个扇区封装成一个块单元。

    -L卷标名 设定卷标名

    -i# 为数据中间中的每多少(#)个字节创建一个inode (2T硬盘,每个都是几k的小文件,根据文件的大概大小来创建相应的inode条目)

    -N# 指定数据区有多少个inode

    -m# 指定为管理预留空间占主空间的百分比

wKiom1U06kij6qQIAAQkUGQjx2Y115.jpg

tune2fs:tune2fs重新设定ext系列文件系统中的可调参数
tune2fs [选项] 分区名
    -l 查看指定文件系统(分区)的超级块详细信息
    -L 重新指定卷标名
    -m #调整管理员预留空间的百分比
    -u 指定文件系统的UUID

wKioL1UzfSfwtLCtAAEnnAY-JKU844.jpgmkswap:mkswap用于交换分区的格式化

mkswap [选项] 分区名
-L 卷标名

-U UUID

swapon:挂载交换分区

swapoff:卸载交换分区

wKioL1U07oeDt_p3AAHUFaPQwtw925.jpg

free:查看内存的使用情况
    -m 按M为单位
    -g 按G为单位

wKiom1U07aSwqd5iAAD86AEhs50664.jpg
blkid
:块设备信息显示工具  UUID也是一种引用
    -L 卷标名 设备名
    -U   UUID 设备名

e2label:分区名 查看分区的卷标名

dumpe2fs:文件系统的超级块信息查看工具

dumpe2fs -h 只显示超级块头部信息

wKioL1U08i7hf8h2AAVXGUUTKgo995.jpg

wKiom1U08NSzEbOcAASESFbWEjA022.jpg

这里没有截取全部的信息,自己动手试试看效果!



七、文件系统的挂载

挂载定义:将额外的文件系统与根文件系统,建立关联关系。使得其作为此额外文件

系统的访问入口的过程。(注:根是一切文件系统的访问入口,是内核所在的分区)

★挂载操作时注意:

·在Linux系统上,所有的文件系统必须通过根文件系统的某个分支来访问;

·单一文件系统不应该被重复挂载在不同的挂载点(目录)中

·单一目录不应重复挂载多个文件系统

·作为挂载点的目录理论上应该都是空白目录,不然原来目录下的文件会被隐藏

★挂载点注意:

·事先存在;

·应该使用别的进程未使用的目录;

·挂载点下原有的文件将被隐藏;

mount:挂载命令
mount [选项] 设备 挂载点

mount查看/etc/mtab已经挂载的条目

    -t 指定文件件系统类型 (centos6以才能智能识别文件系统类型)

    -r 只读挂载

    -w 读写挂载    

    -a 挂载/etc/fstab下的所有条目进行挂载

    -n 挂载时不更新/etc/mtab文件

    -B==--bind

    mount -B 原目录 目标目录,关联目录(把目标目录关联到原目录)

    umount 目标目录(通常用于版本更新)举例如下图

    wKioL1U0-o2xL7VkAAOgibjyq6Y969.jpg


    -o 参数选项[多个时用,隔开 例: -o sync,exce,nouser] -o里面还有参数

    async:异步模式,使用异步模式数据的修改先于内存中完成,根据某种策略定期同步至磁盘,实现永久存储。

    sync:同步模式,直接将数据的修改同步至磁盘

    auto:支持mount -a 这个选项实现自动挂载

    noauto:不支持mount -a 不能实现自动挂载

    noexec:不允许此设备上的二进制程序执行(一般设为不允许)

    exec:允许此设备上的二进制程序执行

    user:允许普通用户挂载设备

    nouser:不允许普通用户挂载设备

unmount:卸载命令    

umount [设备|挂载点] 可以是设备名|卷标名|UUID

fuser:查看有哪些进程正在使用挂载点

fuser -v 挂载点
fuser -km 强行终止正在使用的挂载点的进程(直接杀掉进程)

wKiom1U0_yiRQcIDAAOX1eWbq8c753.jpg


wKioL1U1AIKQ_siaAADCuV-VKD0827.jpg


wKioL1U1AIPhqO-zAAICWVBBOGo440.jpg

与挂载相关的配置文件
/etc/fstab (主要用于系统启动时候挂载设备)
/etc/mtab (存储了已经挂载的条目)
/proc/mounts (内核中识别的所有挂载条目)

wKiom1U09EDDkiW1AAWFdZ9501E139.jpg/etc/fstab开机自动挂载的配置文件

wKiom1Uzq_Dxc_DLAAGi3bbnWag039.jpg

第一列:要挂载的设备名(设备文件,卷标,UUID这三种引用方式)

第二列:挂载点

第三列:文件系统类型

第四列:挂载选项

第五列:转储频率

        0:从不备份

        1:每日备份

        2:每隔一日备份

第六列:自检次序

        0:不自检

        1: 首先自检,通常只被/使用

        2:/自检之后自检

注意:这里面的default选项,既然是挂载选项,直接查看挂载命令mount的帮助

#whatis mount

#man 8 mount     
·defaults-----Use default options: rw, suid, dev, exec, auto, nouser, async, and relatime.



综合练习:答案在本博客最后公布

(1)创建一个2G的分区,文件系统为ext2,卷标为DATA,块大小为1024,预留管理空间为磁盘分区的8%;挂载至/backup目录,要求普通用户不能挂载此设备;

(2)将此文件系统的超级块信息中包含了block和inode的行保存至/tmp/partition.txt中;

(3)复制/etc目录中的所有文件至此文件系统;而后调整此文件系统类型为ext3,要求不能损坏已经复制而来的文件;

(4)调整其预留百分比为3%;

(5)对此文件系统强行做一次检测;



八、链接文件

1、文件的硬链接:指向同一个inode的多个不同的文件路径 他们指向同一组磁盘块

2、文件的字符链接(软连接):符号链接有自己的inode,但是此inode没有指向数据块,而是指向数据

原文件的访问路径(即一些字符串)

    ·硬链接的特性:Ⅰ硬连接不能跨文件系统 Ⅱ不能对目录进行硬链接 Ⅲ创建硬链接会增加文件的硬连接数。

    ·软连接的特性:Ⅰ符号连接可以跨文件系统 Ⅱ可以对目录进行软连接 Ⅲ不会增加硬连接数,Ⅳ删除原文件,会损坏符号连接文件。

3、ln创建连接文件的命令

ln [选项] 原文件 目标文件 (默认创建硬连接文件)

    -s 指明创建软连接文件

    -v 显示详细信息

wKioL1U1ArLAXvn4AAEQM9EfOis454.jpg

----------------------------------------------------------------------------

九、其他常用命令

du:查看某目录树占用空间的情况

du [选项] 目录

    -s 指列出目录的总和,不列出子目录的大小

    -h 单位换算:转换成人能识别的单位

wKioL1U1GaTDRIhoAAEf1XIeHhE166.jpg

df:查看文件系统空间的(分区)的使用情况

df [选项] [分区名]

    -h 转换成人能识别的单位

    -i 显示分区inode的使用率,而不是分区空间的使用率

wKiom1U1GF7R9meuAAFx8RsrvA8436.jpg

fsck:文件系统的修复工具

fsck [选项] 文件系统(分区)

    -t 指定分区类型

    -a 自动修复错误

    -r 交互式修复错误

e2fsck:专用于ext系列文件系统的修复工具

e2fsck [选项] 文件系统(分区)

    -y 所有问题自动默认为yes



综合题答案:

(1)

#省略分区过程
[root@localhost ~]# fdisk -l /dev/sdb7                    #查看分区详细信息

Disk /dev/sdb7: 2154 MB, 2154991104 bytes
255 heads, 63 sectors/track, 261 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: 0x00000000
[root@localhost ~]# mke2fs -t ext2 -L DATA -b 1024 -m 8 /dev/sdb7    #按要求进行格式化
mke2fs 1.41.12 (17-May-2010)
Filesystem label=DATA
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
131584 inodes, 2104480 blocks
168358 blocks (8.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=69468160
257 block groups
8192 blocks per group, 8192 fragments per group
512 inodes per group
Superblock backups stored on blocks: 
    8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409, 663553, 
    1024001, 1990657

Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@localhost ~]# mount -t ext2 -o nouser /dev/sdb7 /backup/
[root@localhost ~]# mount
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
/dev/mapper/VolGroup-lv_home on /home type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/sr0 on /media type iso9660 (ro)
/dev/sdb7 on /backup type ext2 (rw)

(2)

[root@localhost ~]# dumpe2fs -h /dev/sdb5 | grep -i '\(block\|inode\)' >> 
/tmp/partition.txt                        #用正则来过滤出有用信息
dumpe2fs 1.41.12 (17-May-2010)
[root@localhost ~]# cat /tmp/partition.txt 
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super
Inode count:              131584
Block count:              2104480
Reserved block count:     168358
Free blocks:              2067875
Free inodes:              131574
First block:              1
Block size:               1024
Reserved GDT blocks:      256
Blocks per group:         8192
Inodes per group:         512
Inode blocks per group:   128
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:              256
[root@localhost ~]#

(3)

[root@localhost /]# cp -r /etc/* /backup/
[root@localhost /]# tune2fs -j /dev/sdb7        #-j 选项可以有ext2直接转成ext3
tune2fs 1.41.12 (17-May-2010)
Creating journal inode: done
This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@localhost /]# blkid /dev/sdb7             #查看设备的详细信息
/dev/sdb7: LABEL="DATA" UUID="fc0cf6bd-5be8-4fef-af97-584391dd58ce" SEC_TYPE="ext2" 
TYPE="ext3"

(4)

[root@localhost /]# tune2fs -m 3 /dev/sdb7        #-m 选项指定管理员预留空间
tune2fs 1.41.12 (17-May-2010)
Setting reserved blocks percentage to 3% (63134 blocks)

(5)

[root@localhost /]# umount /backup/        #这里必须先卸载,才能进行检测
[root@localhost /]# e2fsck -f /dev/sdb7
e2fsck 1.41.12 (17-May-2010)
Backing up journal inode block information.

Moving journal from /.journal to hidden inode.

Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 3A: Optimizing directories
Pass 4: Checking reference counts
Pass 5: Checking group summary information

DATA: ***** FILE SYSTEM WAS MODIFIED *****             #已经修改完成
DATA: 1791/131584 files (0.6% non-contiguous), 96429/2104480 blocks