一、Linux中磁盘的表示方式
1. 在Linux中IDE接口的磁盘表示方式为hd,而SATA,SCSI,USB接口的磁盘表示为sd。
2. 硬盘的块数以字母a,b,c,d等方式显示,如第一次硬盘hda/sha;第二块硬盘hdb/sdb。
3. 硬盘的分区以数字1,2,3,4等方式显示,如第一块硬盘的第一个分区hda1/sda1;第二分区hda2/sda2。
二、MBR分区格式
下面画了一张简易的 MBR 分区图:
三、创建磁盘分区相关命令
1 |
[root@localhost ~]# fdisk -l /dev/sda #查看当前系统识别了几块硬盘已经硬盘信息如大小,分区等 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[root@localhost ~]# fdisk /dev/sda #进入磁盘的交互式模式进行管理磁盘,以下是常用指令; m:显示帮助信息 p:显示当前磁盘信息包括没有改变的分区 n:创建一个新分区 e:创建扩展分区 p:创建主分区 l:逻辑分区 d:删除一个分区 t:修改分区类型 L:显示支持的所有分区类型 83表示Linux 82表示Swap 8e表示LVM q:退去不保存 w:退出并保存 |
一般新磁盘必须要创建主分区,然后可以创建扩展分区,在扩展分区上创建逻辑分区。但是不管选择完什么分区接下来都要,选择分区编号,选择起始柱面和结束柱面,分配分区大小(+10G就是分10G,支持M,G)等工作。
另外,创建完磁盘分区之后,可以查看/proc/partions文件,会显示内核当前识别的所有分区。但是不会有刚刚创建的分区,因为系统没有重启内核没有识别到。这时就需要partprobe命令,让内核重读内核分区表(一般创建分区后就必须先让内核读取一下系统分区表)
四、创建文件系统相关命令
1 2 3 4 5 |
[root@localhost ~]# cat /proc/filesystems #查看当前内核编译有哪些文件系统模块支持哪些文件系统 [root@localhost ~]# mkfs.vfat /dev/sda1 #创建fat文件系统 [root@localhost ~]# mkswap /dev/sda1 #创建swap分区 [root@localhost ~]# mkfs -t ext4 /dev/sda1 /dev/sda2 #为设备创建ext3文件系统 [root@localhost ~]# mkfs.ext4 /dev/sda1 /dev/sda2 #为设备创建ext3文件系统 |
创建分区时会显示以下信息,下面介绍一下其主要的含义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
mke2fs 1.3 Filesystem label= //卷标名称 OS type:Linux block size:4096 //默认块大小 fragment size:4096 245990 inodes, 488090 //blocks有多少个inode和多少个块 24403 blocks(5.00%) reserved for the super //user预留给超级管理员做修复用的空间为5%太多可以自行手动设置给大小 first data block=0 maximum filesystem blocks=503301873 15 block groups //多少个块组 32768 blocks per group,32768 framents per group //每个块组有多少个数据块 16352 inodes per group //每个块组有多少个inode;大概每两个块8k一个inode superblock backups stored on blocks:32768 98304 163840 229376 294912 //超级块组分别存放在哪些磁盘块上了 writing inode tables:done //done表示已经写完inode表 creating journal(4096blocks):done //表示已经创建日志完成 writing superblocks and filesystem accounting information:done This filesystem will be automatically checked every 23 mounts or 180 days whichever comes first. Use tune2fs –c or –I to override //创建完文件系统之后当挂载次数超过23次或180天之后就会自动检查一下文件系统使用tune2fs –c 或–i可以调整 ……… |
1 2 3 4 5 6 7 8 9 10 11 |
[root@localhost ~]# blkid /dev/sda1 #用于查看设备属性如UUID统一全局标识符,文件系统,卷标; [root@localhost ~]# e2label /dev/sda1 LABELNAME #查看或设定卷标; [root@localhost ~]# tune2fs [OPTIONS] /dev/sda1 #调整文件系统相关属性; -j #不损害原有数据,将ext2升级为ext3 -L LABEL #设定或修改卷标 -m # #调整预留百分比 -r # #指定预留块数而不是百分比 -o #设定默认挂载选项如acl -c # #用来指定挂载次数达到#次后在进行自检0或-1表示关闭自检 -i # #用来指定挂载使用多少天以后进行自检0或-1表示关闭自检(数据块要注意) -l #显示超级块中的详细信息 |
1 |
[root@localhost ~]# dumpe2fs /dev/sda5 #显示文件系统的详细信息比tune2fs –l更详细 |
五、修复文件系统
fsck:文件系统修复命令,fsck不仅可以对文件系统进行扫描,还能修正文件系统的一些问题;注意的是fsck扫描文件系统时一定要在单用户模式、修复模式或把设备umount后进行。如果扫描正常运行中的系统会造成系统文件损坏
1 2 3 4 5 6 7 |
[root@localhost ~]# fsck [OPTIONS] /dev/sda1 [OPTIONS] -t #指定文件系统类型 -a #自动修复文件系统 -c #检查是否存在算坏的区块 -d #详细显示命令执行过程 -y #关闭互动模式 |
esfsck:专用于修复ext系列文件系统RHEL5.0系列
1 2 3 4 5 |
[root@localhost ~]# e2fsck [OPTIONS] /dev/sda1 [OPTIONS] -f #强制检查文件系统 -a #修复文件系统 -p #修复文件系统 |
六、挂载分区相关命令
在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂载(mount)。使用 mount 命令将一个文件系统附着到当前文件系统层次结构中(根)。在执行挂装时,要提供文件系统类型、文件系统和一个挂装点。根文件系统被挂载到根目录下“/”上后,在根目录下就有根文件系统的各个目录,文件:/bin /sbin /mnt等,再将其他分区挂接到/mnt目录上,/mnt目录下就有这个分区的各个目录,文件。
mount:挂载指定分区到挂载点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[root@localhost ~]# mount [OPTIONS] /PATH [OPTIONS] -a #挂载/etc/fstab中定义的所有文件系统 -n #挂载设备时不把信息写入/etc/mtab文件中;默认都会写入到/etc/mtab中 -t #指定挂载设备的文件系统类型默认mount会调用blkid命令获取对应文件类型 -r #挂载文件系统为只读 -w #挂载文件系统为读写 -o,noasync #指定额外的挂载选项也即指定的文件系统指定的属性 async #异步写入默认就是异步 atime #开启访问时间戳(每一次访问都会更改atime从硬盘上降低系统性能) noatime #取消访问时间戳 auto #允许使用-a defaults #如果没有指挂载选项就是默认rw,suid,dev,auto,nouser,async dev #允许把当前文件系统中的设备文件作为其他设备的入口访问 nodev #关闭 nosuid #关闭允许使用suid;默认可以使用 exec #允许这个文件系统上有执行权限的文件运行起来 noexec #关闭 _netdev #允许挂载网络文件系统时找不到就跳过;默认找不到就开不了机 ower #允许普通用户挂载这个设备文件系统的 remount #重新挂载当前文件系统 |
1 2 3 4 5 6 7 8 |
[root@localhost ~]# mount -o loop /mnt/rhel6.iso /media #挂载iso镜像 [root@localhost ~]# mount -t cifs -o username=administration //IP/c$ /mnt #挂载windows共享文件 [root@localhost ~]# umount /挂载点 #卸载文件系统(卸载注意事项:挂载的设备没有被进程使用) [root@localhost ~]# mount #显示当前系统上已挂载的设备信息以及权限;读取文件是/etc/mtab文件信息 |
mount挂载都是临时生效的当Linux机器重启时,它会读取/etc/fstab文件然后根据文件中的信息来进行挂载。所以当我们给一个磁盘分区、格式化之后只有写入/etc/fstab文件中以后才可以永久生效。
/etc/fstab文件的格式如下:
1 2 3 4 5 6 7 |
*挂载设备* *挂载点* *文件系统类型* *挂载选项* *是否备份* *是否检测文件系统* /dev/sda1 /point ext4 defaults 0 0 /dev/sda2 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 |
在/etc/fstab文件中格式分为以上6个字段;前三个字段很好理解分别是挂载的设备、要挂在的点、和文件系统的类型。
挂载选项字段一般写的是defaults表示不给定-o选项时的行为
是否备份是指是否使用dump命令备份,0表示不做,1表示每天备份
是否检测文件系统是指是否使用fsck命令检查备份,0表示不检查,1代表最早检查(一般只有根是1),2也表示要检查只是比1晚些(除了根之外的一般都使用这个)
fuser:验证进程正在使用的文件或套接字文件
1 2 3 |
[root@localhost ~]# fuser [OPTION] /mnt -v #查看某文件上正在运行的进程 -km #终止正在访问此挂载点的所有进程 |
df:显示磁盘文件系统的使用情况
1 2 3 4 5 |
[root@localhost ~]# df [OPTION] -h #做单位换算 -i #查看inode使用情况 -P #整行显示 -a #显示全部 |
需要知道一下 df 命令的统计机制,df 是通过查看文件系统磁盘块分配图得出总块数与剩余块数。这要从程序写文件的方式来谈起了,简单来说,一个进程要向一个文件里面写东西,那么会得到一个 pointer,然后向指针指向的文件(磁盘区域)写入。假如由于某些原因(也可能人为)被指向的文件被删除了,但是( write call)并不知道文件是否还在,就还会继续向里面写,不管文件是否存在,磁盘块还是被写操作使用。所以,这部分正在被写入数据的磁盘块也会被 df 命令所统计。
但 du 命令则不同,du 会把指定目录下所有文件、目录、目录下的文件都进行统计,然后累加得到的值。也就是说 du 命令是建立在文件系统能看到的的确确是有这样一些文件的基础上的。也就是说我们能在文件系统里面看到的文件才会被 du 统计。如果说由于某些原因(也可能人为)文件被删除了,由于文件没有了,所以 du 统计不到写入的这些磁盘块,但是因为写的进程还在,磁盘空间没有被释放,所以 df 却能统计到,所以可能会出现 df 统计的结果比 du 大很多。
在生产环境有一个很常见的案例,比如你的应用启动,在不停往一个日志文件中写入日志,这个时候由于磁盘空间不足,你手动将该日志文件删除了。此时 du 显示的结果会把日志大小减去,而 df 则仍会包含该日志的大小(实际上仍引用了该文件的句柄)。如果没有 du 与 df 的知识,那么此时你应该就进入懵逼状态了。
正确的做法是,如果要删除某个应用正在往里面写内容的日志的文件,不要直接用 rm -rf,而是要:echo “” > log。那么此时两者统计的大小应该相同了。那么如何找出被程序引用着的已经删除的文件,也很简单,使用 lsof 命令即可。lsof 命令是用来查看正在被打开的文件。如果正在被打开的文件被 rm -fr 了,那么就有一个 deleted 表示,所以直接过滤 deleted 标识的文件就可以找到了,比如 lsof | grep deleted 命令。然后找到对应应用程序的进程号 kill 掉就可以释放磁盘空间了,但是需要评估一下 kill 的风险。