磁盘与文件系统
一、磁盘物理结构
1. 磁盘 :由一个个盘片构成 , 从盘片的结构上看 , 图中的一圈圈灰色同心圆为一条条磁道 , 从圆心向外画直线 , 可以将磁道划分为若干个弧段 , 每一个磁道上一个弧段被称为一个扇区 , 扇区是磁盘的最小组成单元 , 通常是512字节 。
2.
2. 磁盘分区: 指定分割区域起始与结束磁柱
3. 磁盘分区是告诉操作系统 , 磁盘在此分割区域内 。 例如A磁柱到B磁柱之间的区块 , 如此一来 , 操作系统灸能够知道他可以指定区块进行文件读写查询操作 。
4. 格式化: 因为每种操作系统所设定的文件属性\权限 , 以及存放数据的格式不同 , 所以使用硬盘之前需要进行格式化 。
二、 文件系统
- Ext2\Ext3\Ext4的区别
- 这三个都是文件系统格式
- Linux kernel自2.6.28开始正式支持新的文件系统Ext4
- Ext4是Ext3的改进版 , 修改了Ext3中部分重要的数据结构 。
- Ext3相比于Ext3而言 , 只是增加了一个日志系统而已 。 Ext4可以提供更佳的性能和可靠性 ,还有更为丰富的功能 , 更大的文件系统和文件 。
- 较之Ext3所支持的最大16TB文件系统和最大2TB文件 , Ext4分别支持1EB(1048576TB 1EB = 1024PB 1PB = 1024TB)的文件系统和16TB的文件 。
- Ext3只支持32000个子目录 ,而Ext4支持无限数量的子目录 。
- Extents(区段)
- Ext3采用间接块映射 , 当操作大文件时 , 效率极其低下 , 比如一个100MB的文件 , 在Ext3中要建立25600个数据块(每个数据块为4kb)的映射表 。在Ext3中 , 每个物理块都要一个逻辑结构与之相对应。
- Ext4引入了Extents的概念 。 提高效率 。 每个Extents为一组连续的数据块 , 理想情况下 , 上述文件则只需要一个Extent来记录映射挂关系 。
- 多块分配
- 当写入数据到Ext3文件系统中时 , Ext3的数据块分配器每次只能分配一个4kb的块 , 写一个100MB的文件就要调用25600次数据块 , 而Ext4的多块分配器支持一次调用分配多个数据块 。
- 延迟分配
- Ext3的数据块分配策略是尽快分配 。 而Ext4的分配策略是尽可能的延迟分配 。 知道文件在catch中 写完才开始分配数据块写入磁盘 。
- 如此能优化整个文件的数据块分配 , 显著提升性能 。
- 快速fsck(文件系统检查)
- 老的fsck会很慢 , 因为他要检查所有的inode
- Ext4给每个组的inode表中过他们 , 而只是去检查那些在用的inode添加了 一份未使用的inode的列表 , 执行fsck就可以跳。
- 日志校验
- 日志是最常用的部分,也极易导致磁盘硬件故障 , 而从损坏的日志中 恢复数据会导致更多的数据损坏 。
- Ext4的日志校验功能可以很方便的判断日志数据是否损坏 , 将过去两阶段日志机制合并成一段 , 提高性能 。
- 两阶段日志提交:
- 文件系统将准备执行的事务的具体内容写入日志
- 文件系统进行操作
- 操作成功之后, 将事务的具体内容从日志中删除 。
- 无日志(Nojournaling)模式
- Ext4允许关闭日志 , 以便某些有特殊需求的用户可以借此进一步提升性能 。
- 在线碎片管理
- Ext4支持在线碎片整理 , 并提供e4defrag工具进行个别文件或整个文件系统的碎片整理 。
- inode相关特性
- Ext4支持更大的inode , 较之Ext3默认的inode大小128字节 , Ext4为了在inode中容纳更多的扩展特性(如纳秒时间戳或inode版本) , 默认inode大小为256字节
- 持久预分配
- P2P软件为了 保证下载文件有足够的空间存放 , 常常会预先创建一个与下载文件相同的空文件 , 以免未来的数小时或 数天之内磁盘空间不足导致下载失败。 Ext4在文件系统层面实现了持久预分配并提供相应的API , 比应用软件自己实现更有效率。
swap介绍
- 使用磁盘存储 , 内存不够而”溢出”的内容 。
- 当系统的物理内存不够用的时候 , 就需要将物理内存中的一部分空间释放出来 , 以供当前运行的程序使用。
- 最容易成为被释放的对象 : 一些很长时间没有操作的程序 。 一些被释放的空间被临时保存在Swap空间中 。 等到那些被换出的程序要继续运行时 , 再从Swap中恢复保存的数据到内存中 。
- 一般来说可以按照如下规则设置Swap大小:
- 4G的物理内存 , SWAP设置为内存的2倍 。
- 4G-8G的物理内存 , SWAP设置为内存相同大小
- 8G-64G的物理内存 , SWAP设置为8G
- 64G-256G的物理内存 , SWAP设置为16G
系统什么时候会使用swap?
实际上并不是等所有的物理内存全部消耗完之后 , 才去使用swap空间
[root@localhost ~]# cat /proc/sys/vm/swappiness 60 默认值是60 。 swappiness = 0时表示最大限度的使用物理内存 , 然后才是swap空间 , swappiness = 100 时 表示积极使用swap空间 , 并且把内存上的数据及时搬运到swap空间
修改swap参数:
临时性修改
[root@localhost ~]#sysctl vm.swappiness = 10 vm.swappiness = 10 [root@localhost ~]# cat /proc/sys/vm/swappiness 10 这里已经做了修改 , 但是重启系统之后又会变成60 。
永久修改
在/etc/sysctl.conf文件中添加如下参数 : vm.swappiness = 10 操作: [root@localhost ~]# vim /etc/sysctl.conf 按i 写入vm.swappiness = 10 按esc 输入wq(保存并退出)回车
swap开启与关闭
开启 swapon -a 关闭 swapoff -a
三、文件系统的操作
挂载点
- 每个文件系统都有独立的 inode/block/superblock等信息 , 这个文件系统要能够链接到目录树才能被我们使用 。 将文件系统和目录树结合的动作称为挂载 。
- 挂载点一定是目录 , 此目录为文件系统的入口 。
- mount命令 : 将设备挂载到某个目录
- mount常用参数
- -t : 指定设备的文件系统类型
- Ext4 linux目前常用的文件系统
- nfs 网络文件系统
- iso9660 CD-ROM光盘标准文件系统
- auto 自动检测文件系统
- -o 指定挂载文件系统时的选项
- ro 以只读的方式挂载
- rw 以读写方式挂载
- -t : 指定设备的文件系统类型
- umount :卸载目录或是挂载点
实例:
[outman02@bogon tj]$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 8.6G 2.5G 5.7G 31% / tmpfs 491M 228K 491M 1% /dev/shm /dev/sda1 291M 34M 242M 13% /boot [outman02@bogon tj]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom sda 8:0 0 10G 0 disk ├─sda1 8:1 0 300M 0 part /boot ├─sda2 8:2 0 8.7G 0 part / └─sda3 8:3 0 1G 0 part [SWAP] [outman02@bogon tj]$ su Password: [root@bogon tj]# mount /dev/sda1 /tj/udisk mount: mount point /tj/udisk does not exist [root@bogon tj]# mount /dev/sda1 outman02/tj/udisk mount: mount point outman02/tj/udisk does not exist [root@bogon tj]# ll total 12 drwxr-xr-x. 2 root root 4096 Nov 2 06:02 a drwxr-xr-x. 2 root root 4096 Nov 2 06:02 b drwxr-xr-x. 2 root root 4096 Nov 4 23:53 udisk [root@bogon tj]# mount /dev/sda1 /udisk mount: mount point /udisk does not exist [root@bogon tj]# mount /dev/sda1 udisk [root@bogon tj]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom sda 8:0 0 10G 0 disk ├─sda1 8:1 0 300M 0 part /boot ├─sda2 8:2 0 8.7G 0 part / └─sda3 8:3 0 1G 0 part [SWAP] [root@bogon tj]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 8.6G 2.5G 5.7G 31% / tmpfs 491M 228K 491M 1% /dev/shm /dev/sda1 291M 34M 242M 13% /boot /dev/sda1 291M 34M 242M 13% /home/outman02/tj/udisk **如果挂载后查看U盘内容出现乱码** [root@bogon tj]# locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL= [root@bogon tj]# man mount [root@bogon tj]# mount -o iocharset=utf-8 /dev/sda1 /home/outman02/tj/udisk
- /etc/fstab文件:开机一道的时候自动挂载到Linux的文件系统 。
df :列出文件系统整体磁盘使用情况
- -a : 列出所有文件系统
- -k : 以Bytes对的容量显示文件系统
- -m : 以MBytes的容量显示文件系统
- -h : GBytes、MBytes、KByte等格式自行显示
-i : 以inode数量显示
[root@bogon tj]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 8985528 2600612 5928468 31% / tmpfs 502204 228 501976 1% /dev/shm /dev/sda1 297485 34642 247483 13% /boot /dev/sda1 297485 34642 247483 13% /home/outman02/tj/udisk [root@bogon tj]# df -a Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 8985528 2600612 5928468 31% / proc 0 0 0 - /proc sysfs 0 0 0 - /sys devpts 0 0 0 - /dev/pts tmpfs 502204 228 501976 1% /dev/shm /dev/sda1 297485 34642 247483 13% /boot none 0 0 0 - /proc/sys/fs/binfmt_misc vmware-vmblock 0 0 0 - /var/run/vmblock-fuse /dev/sda1 297485 34642 247483 13% /home/outman02/tj/udisk [root@bogon tj]# df -k Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 8985528 2600628 5928452 31% / tmpfs 502204 228 501976 1% /dev/shm /dev/sda1 297485 34642 247483 13% /boot /dev/sda1 297485 34642 247483 13% /home/outman02/tj/udisk [root@bogon tj]# df -m Filesystem 1M-blocks Used Available Use% Mounted on /dev/sda2 8775 2540 5790 31% / tmpfs 491 1 491 1% /dev/shm /dev/sda1 291 34 242 13% /boot /dev/sda1 291 34 242 13% /home/outman02/tj/udisk [root@bogon tj]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 8.6G 2.5G 5.7G 31% / tmpfs 491M 228K 491M 1% /dev/shm /dev/sda1 291M 34M 242M 13% /boot /dev/sda1 291M 34M 242M 13% /home/outman02/tj/udisk
du : 文件系统的磁盘使用量或是目录使用量
- -a : 列出所有文件的目录容量
- -h : 以人们易读的格式(G/M)显示
- -s : 列出总量 , 而不列出每个个别目录占用容量
- -k : 以Bytes列出容量显示
-m : 以MBytes列出容量显示
[root@bogon tj]# du 251 ./udisk/efi/EFI/redhat 24439 . [root@bogon tj]# du -a 3 ./udisk/grub/splash.xpm.gz 16 ./udisk/grub/reiserfs_stage1_5 2 ./udisk/grub/device.map 1 ./udisk/grub/menu.lst 276 ./udisk/grub 24427 ./udisk 4 ./a 4 ./b 24439 . [root@bogon tj]# du -h 13K ./udisk/lost+found 276K ./udisk/grub 24M ./udisk 24M . [root@bogon tj]# du -s 24439 . [root@bogon tj]# du -k 24427 ./udisk 4 ./a 4 ./b 24439 . [root@bogon tj]# du -m 1 ./udisk/efi/EFI/redhat 1 ./b 24 .
dumpe2fs : 观察文件系统
dumpe2fs [options]
-h : 仅列出superblock的数据 , 不会列出其他区段的内容
[root@localhost ~]#dummpe2fs -h /dev/sda1