文章目录

管理员需知:

文件系统多大,超级块和GDT位置,备份是否足够,分了多少磁盘块,是否产生磁盘碎片,是否需要修复。
inode数,块数,片(fragment)数,

12.磁盘及文件系统

磁盘属于io设备
扇区大小一般512B
一个文件可能存储于多个盘面(柱面cylinder)

硬盘设备的设备文件名


  • IDE,ATA:hd
  • SATA:sd
  • SCSI:sd
  • USB:sd

次设备号一般用a、b、c…

IDE一般两个口
第一个口:主(/dev/hda),从(/dev/hdb)。
第二个口:主(/dev/hdc),从(/dev/hdd)。

12.1 格式化

  • 低级格式化:划分磁道
  • 高级格式化:分区partition,创建独立的文件系统

磁盘分区也是按柱面进行的,磁针读写方便。
磁盘性能指标:平均寻道时间,转速等

笔记本:5400转/min(rpm)
台式:7200转/min

转得快,发热也大,盘芯是真空的,不能有灰尘。

外道效率高,频繁访问的数据应放在外道,比如C盘。

分区有两阶段:

  1. 存储元数据(meta data)
  2. 存储数据块(block)

硬盘分区三主一扩展,扩展分区之下还有逻辑分区,它们也有编号。

  • hda1-4:主分区,扩展分区(1-4不确定)
  • hda5开始为逻辑分区

硬盘分区

块、位图、inode

块位图bitmap,可加速查找空闲块。0位表示空闲。

inode位图和块位图:
每个文件都需要条目(inode,即index node索引节点),它存储了ls -l等属性,不存储文件名,而且也需要位图。它要指向文件块,分为直接和间接指向,数量和文件大小有关,fat32规定文件最大4G.

目录也是文件,实际是路径映射表,也需要磁盘块(dentry,目录项)。
每一行格式为:inode,record\_len,name\_len,file\_type,name
eg.
21-12-1-2-.\0\0\0
22-12-2-2-…\0\0
34-12-4-2-sbin

一个块属于一个文件,可有不同路径(inode)。

常用块大小:1k,2k,4k
页大小通常4k

为了位图尽可能小,先将块划分块组。
一个分区有多大取决于inode位图和块位图大小。

磁盘空间结构
boot block – block group 0 – block group1 --…-- block group n

每个块组(block group)结构如下
super block – GDT – Block Bitmap – Inode Bitmap – Inode Table – Data Blocks

  • 超级块(super block):记录分区全局信息,如创建了多少块组,每组多少块,块大小,空闲/引用磁盘块,空闲/引用inode。 它有多个备份,但也不是每个块组都有,默认块组0的超级块为主超级块,其余为备份块。一个损坏后找下一个,或者手动命令修复。
  • 块组描述符(GDT):记录块组的名称,起始块,结束块。
一般有5%的块预留给超级用户,以备分区满后管理员修复工作还有多余空间可用。

硬盘相关命令

du  #显示指定的目录或文件所占用的磁盘空间。
    -s # 整个目录大小
    -h --human-readable

df   #显示目前在Linux系统上的文件系统的磁盘使用情况统计
    -P #posix显示
    -i #显示inode信息
    
mknod  #创建设备文件
#设备文件主要目的是作为设备的访问入口,要确保设备号和设备关联,并被内核识别。
#识别后,发往设备文件的内容都会发往设备。
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
mknod -m 640 mydev1 c 666 1

fdisk -l
#  查看识别了几块硬盘
#  start和end是指柱面(cylinder)
fdisk -l /dev/sda

创建分区

有剩余柱面和分区编号就可以创建分区
若已经有3个主分区,则只能创建扩展分区,否则剩余空间必须给第4个主分区。

fdisk /dev/sda  #打开交互界面
   p   #print the partition table
   n   #add a new partition
   d   #delete a partition
   w   #write table to disk and exit
   q   #quit without saving changes
   t   #change a partition type

# n之后指定结束柱面时可以+10G指定大小,但因为以柱面为单位,所以有误差。
# 扩展分区只是指针,不能直接使用,还需要再次n,创建逻辑分区。

# 创建完分区后,执行partprobe命令(redhat6还有partx命令)
parprobe [/dev/sda]  
#    inform the OS of partition table changes.

filesystem label(卷标):分区的名字。重新开机后不怕分区次序打乱。

12.3 MBR

MBR(master/main boot record):位于0盘面0磁道0扇区的512Bytes,不属于任何系统,是全局的。

它划分为三部分:

  1. 446Bytes:BootLoader
  2. 64Bytes:3个主分区*16 Bytes + 1个扩展分区
  3. Magic Number:2 Bytes,标记MBR是否有效
如果执行echo "hello" >> /dev/sda
则开头的mbr会被覆盖

12.4 文件

创建文件(如/tmp/text)的过程:

  1. 扫描inode位图找一空闲inode及对应块,建立条目[inode,text]
  2. 再扫描块位图,分配数据块。

删除文件过程:

  1. 删除条目
  2. inode位图和块位图标记为0。

所以数据可以恢复。文件粉碎机原理是覆盖数据块。

复制文件慢;剪切数据只需要转移目录项,更快,前提是同一分区,因为路径不能跨分区引用;跨分区剪切则是在目标区新建,原分区删除。

链接文件

硬链接即多个路径指向同一inode

  • 只针对文件,目录不能创建,避免死循环。
  • 不能跨文件系统
  • 目录默认有2个硬链接,因为路径下有个.目录

软链接即路径指向另一路径(字符串,大小为字符个数)

  • 可用于目录
  • 可跨文件系统
  • 不会增加被链接文件的链接次数
  • 大小为字符个数

ls -l第二个字段为硬链接次数,等于0时才真正无法访问
ls -i显示inode号

ln src dest命令,创建硬链接
ln -s src dest命令,创建软链接

12.5 文件系统

文件系统属于内核功能;管理程序属于用户进程。

fs列举:
fat32(vfat),ntfs,iso9660,cifs,ext2/3/4,xfs,reiserfs,jfs
nfs,ocfs2,gfs,swap

cat /proc/filesystems显示系统支持的fs
(/proc有很多内核相关信息)
学会内核管理后可以自己添加

vfs

不同文件系统的内核接口是不同的,一般各种文件系统上再加一层软件提供同一接口用于system call,开发程序就不需要考虑兼容性了。
中间这一层就是virtual filesystem(vfs),它让linux支持多种fs(沙漏模型)。

关键词:

ring0-3,用户空间,用户模式,内核空间,内核模式。

大多数进程运行在用户空间,没有特权。

ext系统

ext3又称为日志文件系统(journal file system)
日志是磁盘空间的第三个独立区域(另外两个是数据区和元数据区)。

存储文件步骤

  1. 先把inode存到日志区(而不是元数据区),然后存数据;
  2. 这时如果损坏(断点),只需检查日志区有哪些文件需要修复;
  3. 存完后,将inode从日志区移回元数据区。

相对ext2加快了数据修复速度。缺点是多一次io操作。

mount

挂载:将新的文件系统关联至当前根文件系统。
卸载:将某文件系统与当前根文件系统的关联关系移除。

device可以是:

  • 设备文件:/dev/sda5
  • 卷标:LABEL=""
  • UUID:UUID=""

mount-point(目录)要求:

  • 没有被其它进程使用
  • 目录事先存在
  • 目录中的文件会暂时隐藏

挂载完成后,要通过挂载点访问对应文件系统上的文件。
新建的文件系统都会有lost+found目录

# mount [device mount-point]
# 无参执行mount会显示当前已挂载设备及挂载点。
mount /dev/sda5 /mnt/test/

# 卸载
umount [ device | mount-point ]
# 卸载时,设备不能有进程使用。


mount
       -a, --all
              #Mount all filesystems (of  the  given  types)  mentioned  in  /etc/fstab
       -n, --no-mtab
              #Mount  without writing in /etc/mtab.默认会将挂在的设备信息保存至该文件。
       -t, type #不指定时会使用blkid获取类型。
       -r, --read-only
             # Mount the filesystem read-only. 
       -w, --rw, --read-write
             # Mount the filesystem read/write.
       -o  #指定额外的挂载选项,即文件系统启用的属性。可以多选项(-o remount,ro mount-point)
           async  # 异步
           sync   # 同步
           #关于异步同步
           # 对于io请求,先内存操作再读写硬盘,则是异步;内存操作同时保存入硬盘,则是同步。
           # 同步安全,但慢。一般都是异步。
           atime/noatime  #是否更新时间戳(io影响性能)
           auto  # Can be mounted with the -a option.
           defaults     # Use the default options: rw, suid, dev,  exec,  auto,  nouser,  and async.
           dev    #  Interpret character or block special devices on the filesystem.
           exec/noexec  #  Permit execution of binaries.
           _netdev
                       # The filesystem resides on a device  that  requires  network  access
                 #  (used to prevent the system from attempting to mount these filesys‐
                       #      tems until the network has been enabled on the system).
           owner  
                     #Allow  an ordinary user to mount the filesystem if that user is the
                    #  owner of the device. 
           remount
           ro   #read-only
           suid  #对于外来设备一定要nosuid

若另一用户正访问设备,则无法umount,此时可以fuser -v /挂载点 查看谁正在访问。
执行fuser -km /mount-point杀死正访问挂载点的所有进程,然后umount

创建文件系统相关命令

mkfs [options] [-t fstype] [fs-options] device [size]

mkfs -t ext2 /dev/sda5
mkfs -t ext3
# mkfs还有别名
# mkfs.ext3     mkfs.fat      mkfs.ntfs     mkfs.ext4
# mkfs -t ext2 相当于 mkfs.ext2
# mkfs -t fat32 相当于mkfs.vfat


#专门管理ext系列文件的命令
mke2fs
    -j: journal options,直接创建ext3
    -b: block-size,1024/2048/4096(默认)
    -L: volume-label,指定卷标
    -m N:reserved-blocks-percentage,超级用户预留百分比
    -i: bytes-per-inode,给定值应为块大小的2^n倍,默认8192
    -N: number-of-inodes
    -F:Force  mke2fs  to create a filesystem
    -E extended-options:Set extended options for  the  filesystem


e2label    # Change the label on an ext2/ext3/ext4 filesystem
e2label device [ new-label ]

tune2fs [options] device  # adjust tunable filesystem parameters on ext2/ext3/ext4 filesys‐tems
    -j  数据无损地将ext2升级为ext3(升级可以,降级不可以)
    -L  volume-name
    -m  同mke2fs
    -r  reserved-blocks-count
    -o  [^]mount-option[,...]:设置默认挂载选项,常用acl
    -c  max-mount-counts
    -C  mount-count:挂载多少次后自检,0或-1表示关闭该功能。
    -i  interval-between-checks[d|m|w]:自检间隔天/月/周数,0或-1表示关闭该功能。
    -l  List the contents of the filesystem superblock
    -h  只显示超级块信息。
# 除了tune2fs,dumpe2fs命令也能显示文件系统信息
tune2fs -c # or -i  修改自检期限(挂载次数或天数)
# free blocks字段如果是离散的,说明出现了碎片。
    
blkid /dev/sda  # 查看设备属性
     #- locate/print block device attributes(UUID,FSTYPE,LABEL)
#UUID:统一的全局标识符,足够长的系统随机数,用于标识磁盘设备。



fsck   #check and repair a Linux filesystem。即手动检查。
    -t FSTYPE
    -a:自动修复,检出错后不询问。
e2fsck  #check a Linux ext2/ext3/ext4 file system。
    -p:自动修复
    -f:强制检查

12.6 swap

os通过分时(timesharing)或多路复用(multiplex)分配资源

计算机3个重要组件的虚拟方法:
CPU:time slice
io设备:多路复用
memory(内存):虚拟地址

内存:x86(32bit)引入虚拟地址,也叫线性地址。每个进程都假设自己有4G内存可用,并不真实存在。这4G分为3G内存和1G内核。大多数进程只使用这3G的一小部分。这3G是分页的,物理内存是划分页框的(大小4K),进程会由3G里的页映射到页框。

如果物理内存页框已满,则会把硬盘模拟为内存并划分页框,把物理内存的最近最少使用页面转移进来(page out,swap in),消除映射关系。再次使用硬盘里的这些页面时,则会移回物理内存(page in,swap out),重新映射。这个过程叫做换进换出,硬盘的这些空间叫做交换空间。

交换空间允许内存过载使用(overcommit)。换进换出影响效率,只用于应急,但必不可少。
交换空间是一个单独的分区,叫做swap分区。该区仍然慢的话,可以再分一个。建议分在靠外的柱面上或使用SSD(但不比内存便宜…)。

swap used为0是最好的。linux和windows不同,windows可能开始就使用虚拟内存(不叫交换空间)。

free命令
    # Display amount of free and used memory in the system
可以查看物理内存和交换空间使用情况。
    -m  #以m为单位
#  注意used-buffer/cache和free+buffer/cache,缓冲和缓存都是为了提高os性能设置的,可以没有,即可以算入used,也可以算入free。

buffer和cache

buffer:缓冲,用于写入快,读取慢的情况。
cache:缓存,用于写入慢,读取快的情况。数据可重复使用。
空间不够用时,仍然是清理LRLU策略。

添加swap分区

# 1. 先新建分区
sudo fdisk /dev/sda
    # l命令查看,类型默认为linux(83H),swap为82H。
    # n新建分区
    # t转换为82(重点)

parprobe /dev/sda

# 2. 然后创建swap分区
mkswap命令
mkswap /dev/sda6
    -L LABEL
    
# 3. 挂载
#使用swapon命令,而不是使用mount命令
swapon /dev/sda6
swapoff /dev/sda6关闭

lookback

实在没有空间时,则创建一个回环设备lookback(使用软件模拟硬件)

# 1.制作镜像
cat /dev/cdrom > /test.iso
# 或者dd
dd if=/dev/zero of=/var/swapfile bs=1M count=1024
mkswap /var/swapfile
swapon /var/swapfile
free -m  #查看

#mount命令可以挂载iso镜像
wget REDHAT.iso
mount REDHAT.iso /media/ #然后会显示iso不是块设备
#所以需要附加选项-o loop(本地回环设备)
mount -o loop REDHAT.iso /media/
# 创建一个回环文件/var/swapfile,大小512MB,卷标为SWAP-FILE,且开机自启动。
dd if=/dev/zero of=/var/swapfile bs=1M count=512
mkswap LABEL=SWAP-FILE /var/swapfile
vim /etc/fstab
/var/swapfile swap swap defaults 0 0
#若要启动acl功能,则这样添加
/var/swapfile   swap   swap   defaults,acl   0 0

/etc/fstab

swapon -a启用所有/etc/fstab中的swap设备

/etc/fstab中的fs会在os初始化时自动挂载
字段为:
设备,挂载点,fs类型,挂载选项,转储(备份)频率(0:不备份),fs检测次序(只有根为1,0为不检查)

可以发现交换分区挂载点是swap,不是任何目录。

我们自己挂载的设备关机则卸载,想开机挂载则在/etc/fstab写入以下内容:
/dev/sda6 /mnt/test ext3 defaults 0 0

标签: linux, 分区, 磁盘, dev, mount, swap, 文件系统, inode

相关文章推荐

添加新评论,含*的栏目为必填