centos挂载新硬盘
CentOS新硬盘分区并挂载
[root@HASlave001 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_hamaster001-lv_root 18G 9.0G 8.1G 53% / tmpfs 1.9G 72K 1.9G 1% /dev/shm /dev/sda1 477M 67M 385M 15% /boot
注意:fdisk无法处理大于2TB的以上的磁盘分区,如果磁盘分区大于2TB则需要使用parted来进行分区
尝试使用fdisk分区:

分区并挂载新硬盘
1 查看分区前的device分布
[root@HASlave001 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom sdb 8:16 0 4T 0 disk sda 8:0 0 20G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 19.5G 0 part ├─vg_hamaster001-lv_root (dm-0) 253:0 0 17.6G 0 lvm / └─vg_hamaster001-lv_swap (dm-1) 253:1 0 2G 0 lvm [SWAP]
2 开始使用parted分区
[root@HASlave001 ~]# parted /dev/sdb
GNU Parted 2.1 使用 /dev/sdb Welcome to GNU Parted! Type 'help' to view a list of commands. 2.1 新建标签 (parted) mklabel 2.2 2T以上硬盘分区表使用GPT格式 新的磁盘标签类型? gpt 2.3 新建分区 (parted) mkpart 2.3.1 输入分区名称 分区名称? []? sdb1 2.3.2 输入文件系统类型 文件系统类型? [ext2]? ext3 2.3.3 输入分区起始点和终止点(可以用3T或百分比格式) 起始点? 0 结束点? 100% 警告: The resulting partition is not properly aligned for best performance. 忽略/Ignore/放弃/Cancel? Ignore 2.4 查看分区信息 (parted) print Model: VMware Virtual disk (scsi) Disk /dev/sdb: 4398GB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name 标志 1 17.4kB 4398GB 4398GB sdb1 2.5 推出 (parted) quit 信息: You may need to update /etc/fstab.
3 格式化分区
[root@HASlave001 ~]# mkfs.ext3 /dev/sdb1
mke2fs 1.41.12 (17-May-2010) Discarding device blocks: 完成 文件系统标签= 操作系统:Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 268435456 inodes, 1073741815 blocks 53687090 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=4294967296 32768 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848, 512000000, 550731776, 644972544 正在写入inode表: 完成 Creating journal (32768 blocks): 完成 Writing superblocks and filesystem accounting information: 完成 This filesystem will be automatically checked every 20 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
4 查看新的device信息
[root@HASlave001 ~]# df -h
Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_hamaster001-lv_root 18G 9.0G 8.1G 53% / tmpfs 1.9G 80K 1.9G 1% /dev/shm /dev/sda1 477M 67M 385M 15% /boot [root@HASlave001 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom sdb 8:16 0 4T 0 disk └─sdb1 8:17 0 4T 0 part sda 8:0 0 20G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 19.5G 0 part ├─vg_hamaster001-lv_root (dm-0) 253:0 0 17.6G 0 lvm / └─vg_hamaster001-lv_swap (dm-1) 253:1 0 2G 0 lvm [SWAP]
5 创建挂载点
[root@HASlave001 ~]# cd ..
[root@HASlave001 /]# ls
bin dev home lib64 media mnt opt root selinux sys usr boot etc lib lost+found misc net proc sbin srv tmp var
[root@HASlave001 /]# mkdir sdb1
[root@HASlave001 /]# ls
bin dev home lib64 media mnt opt root sdb1 srv tmp var boot etc lib lost+found misc net proc sbin selinux sys usr
6 挂载硬盘
[root@HASlave001 /]# mount /dev/sdb1 /sdb1
[root@HASlave001 /]# cd sdb1/
[root@HASlave001 sdb1]# cd ~
[root@HASlave001 ~]# df -h
Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_hamaster001-lv_root 18G 9.0G 8.1G 53% / /dev/sda1 477M 67M 385M 15% /boot
7 设置开机自动挂载
[root@HASlave001 ~]# vi /etc/fstab
[root@HASlave001 ~]# [root@HASlave001 ~]# cat /etc/fstab
# # /etc/fstab # Created by anaconda on Mon Sep 28 01:57:10 2020 # # 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 # /dev/mapper/vg_hamaster001-lv_root / ext4 defaults 1 1 UUID=49c2b7b9-4238-4592-ad5c-80b239ea6b1e /boot ext4 defaults 1 2 /dev/mapper/vg_hamaster001-lv_swap 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/sdb1 /sdb1 ext3 defaults 1 2
8 (可以不做)重启查看效果
[root@HASlave001 ~]# reboot
[root@HASlave001 ~]# Broadcast message from root@HASlave001 (/dev/pts/0) at 17:41 ... The system is going down for reboot NOW!
[root@HASlave001 ~]# df -h
Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_hamaster001-lv_root 18G 9.0G 8.1G 53% / tmpfs 1.9G 72K 1.9G 1% /dev/shm /dev/sda1 477M 67M 385M 15% /boot /dev/sdb1 4.0T 195M 3.8T 1% /sdb1
【以下内容转载自[(带你真正认识Linux 系统结构)](带你真正认识Linux 系统结构 | 《Linux就该这么学》 (linuxprobe.com))】
3. linux 文件系统
文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT2、 EXT3、 FAT、 FAT32、 VFAT和ISO9660。
3.1 文件类型
Linux下面的文件类型主要有:
1) 普通文件:C语言元代码、SHELL脚本、二进制的可执行文件等。分为纯文本和二进制。
2) 目录文件:目录,存储文件的唯一地方。
3) 链接文件:指向同一个文件或目录的的文件。
4) 设备文件:与系统外设相关的,通常在/dev下面。分为块设备和字符设备。
5)管道(FIFO)文件: 提供进程之间通信的一种方式
6)套接字(socket) 文件: 该文件类型与网络通信有关
可以通过ls –l, file, stat几个命令来查看文件的类型等相关信息。
3.2 Linux目录
文件结构是文件存放在磁盘等存贮设备上的组织方法。主要体现在对文件和目录的组织上;
目录提供了管理文件的一个方便而有效的途径。
Linux使用标准的目录结构,在安装的时候,安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式,并指定了每个目录的作用和其中的文件类型。
完整的目录树可划分为小的部分,这些小部分又可以单独存放在自己的磁盘或分区上。这样,相对稳定的部分和经常变化的部分可单独存放在不同的分区中,从而方便备份或系统管理。目录树的主要部分有 root、/usr、/var、/home 等。这样的布局可方便在 Linux 计算机之间共享文件系统的某些部分。
Linux采用的是树型结构。最上层是根目录,其他的所有目录都是从根目录出发而生成的。
微软的DOS和windows也是采用树型结构,但是在DOS和windows中这样的树型结构的根是磁盘分区的盘符,有几个分区就有几个树型结构,他们之间的关系是并列的。最顶部的是不同的磁盘(分区),如:C,D,E,F等。
但是在linux中,无论操作系统管理几个磁盘分区,这样的目录树只有一个。从结构上讲,各个磁盘分区上的树型目录不一定是并列的。
3.3 Linux磁盘分区
主分区,扩展分区和逻辑分区:
linux分区不同于windows,硬盘和硬盘分区在Linux都表示为设备.
硬盘分区一共有三种:主分区,扩展分区和逻辑分区。
硬盘的分区主要分为主分区(Primary Partion)和扩展分区(Extension Partion)两种,主分区和扩展分区的数目之和不能大于四个。
主分区(Primary Partion):可以马上被使用但不能再分区。
扩展分区(Extension Partion):必须再进行分区后才能使用,也就是说它必须还要进行二次分区。
逻辑分区((Logical Partion)):由扩展分区建立起来的分区,逻辑分区没有数量上限制。
扩展分区只不过是逻辑分区的“容器”,实际上只有主分区和逻辑分区进行数据存储。
Linux下硬盘分区的标识
硬盘分区的标识一般使用/dev/hd[a-z]X或者/dev/sd[a-z]X来标识,其中[a-z]代表硬盘号,X代表硬盘内的分区号。
整块硬盘分区的块号标识:Linux下用hda、hdb、sda、sdb 等来标识不同的硬盘;
其中:
IDE接口硬盘:表示为/dev/hda1、/dev/hdb …;
SCSI 接口的硬盘、SATA接口的硬盘表示为/dev/sda、/dev/sdb … … ;
硬盘内的分区:如果X的值是1到4,表示硬盘的主分区(包含扩展分区);逻辑分区从是从5开始的,比如/dev/hda5肯定是逻辑分区了;
例如:
用hda1、hda2、 hda5、hda6 来标识不同的分区。其中,字母a代表第一块硬盘,b代表第二块硬盘,依次类推。而数字1 代表一块硬盘的第一个分区、2 代表第二个分区,依次类推。1 到4 对应的是主分区(Primary Partition)或扩展分区(Extension Partition)。从5开始,对应的都是硬盘的逻辑分区(Logical Partition)。一块硬盘即使只有一个主分区,逻辑分区也是从5开始编号的,这点应特别注意。
总结:一个硬盘分区首先要确认在哪个硬盘,然后再确认它所在硬盘内的哪个分区。
对于/dev/hda 类似的表示方法,也并不寞生吧;我们在Linux通过fdisk -l 就可以查到硬盘是/dev/hda还是/dev/hdb;
[root@localhost ~]# fdisk -l Disk /dev/hda: 80.0 GB, 80026361856 bytes 255 heads, 63 sectors/track, 9729 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 970 7791493+ 7 HPFS/NTFS /dev/hda2 971 9729 70356667+ 5 Extended /dev/hda5 971 2915 15623181 b W95 FAT32 /dev/hda6 2916 4131 9767488+ 83 linux /dev/hda7 4132 5590 11719386 83 linux /dev/hda8 5591 6806 9767488+ 83 linux /dev/hda9 6807 9657 22900626 83 linux /dev/hda10 9658 9729 578308+ 82 linux swap / Solaris
请注意第一行, Disk /dev/hda: 80.0 GB, 80026361856 bytes ,这个就是表示机器中只有一个硬盘设备/dev/hda ,体积大小为 80.0G;下面的就是硬盘的分区,每个分区都有详细的信息,在这里不详细说了;
Linux下磁盘分区和目录的关系如下:
– 任何一个分区都必须挂载到某个目录上。
– 目录是逻辑上的区分。分区是物理上的区分。
– 磁盘Linux分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作。
– 根目录是所有Linux的文件和目录所在的地方,需要挂载上一个磁盘分区。
3.4 linux主要目录的功用。
/bin 二进制可执行命令
/dev 设备特殊文件
/etc 系统管理和配置文件
/etc/rc.d 启动的配置文件和脚本
/home 用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示
/lib 标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件
/sbin 系统管理命令,这里存放的是系统管理员使用的管理程序
/tmp 公用的临时文件存储点
/root 系统管理员的主目录(呵呵,特权阶级)
/mnt 系统提供这个目录是让用户临时挂载其他的文件系统。
/lost+found 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里
/proc 虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
/var 某些大文件的溢出区,比方说各种服务的日志文件
/usr 最庞大的目录,要用到的应用程序和文件几乎都在这个目录。其中包含:
/usr/X11R6 存放X window的目录
/usr/bin 众多的应用程序
/usr/sbin 超级用户的一些管理程序
/usr/doc linux文档
/usr/include linux下开发和编译应用程序所需要的头文件
/usr/lib 常用的动态链接库和软件包的配置文件
/usr/man 帮助文档
/usr/src 源代码,linux内核的源代码就放在/usr/src/linux里
/usr/local/bin 本地增加的命令
/usr/local/lib 本地增加的库
3.5 linux文件系统
文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。一个操作系统的运行离不开对文件的操作,因此必然要拥有并维护自己的文件系统。
1.文件系统类型:
ext2 : 早期linux中常用的文件系统 ext3 : ext2的升级版,带日志功能 RAMFS : 内存文件系统,速度很快 NFS : 网络文件系统,由SUN发明,主要用于远程文件共享 MS-DOS : MS-DOS文件系统 VFAT : Windows 95/98 操作系统采用的文件系统 FAT : Windows XP 操作系统采用的文件系统 NTFS: Windows NT/XP 操作系统采用的文件系统 HPFS : OS/2 操作系统采用的文件系统 PROC : 虚拟的进程文件系统 ISO9660 : 大部分光盘所采用的文件系统 ufsSun : OS 所采用的文件系统 NCPFS : Novell 服务器所采用的文件系统 SMBFS : Samba 的共享文件系统 XFS : 由SGI开发的先进的日志文件系统,支持超大容量文件 JFS :IBM的AIX使用的日志文件系统 ReiserFS : 基于平衡树结构的文件系统 udf: 可擦写的数据光盘文件系统
2.文件系统特性:
磁盘分区完毕后还需要进行格式化(format),之后操作系统才能够使用这个分区。 格式化的目的是能使操作系统可以使用的文件系统格式(即我们上面提到文件系统类型).
每种操作系统能够使用的文件系统并不相同. 如windows 98 以前的微软操作系统主要利用的文件系统是 FAT (或 FAT16),windows 2000 以后的版本有所谓的 NTFS 文件系统,至于 Linux 的正统文件系统则为 Ext2 (Linux second extended file system, ext2fs)这一个。此外,在默认的情况下,windows 操作系统是不会认识 Linux 的 Ext2 的。
传统的磁盘与文件系统之应用中,一个分区就是只能够被格式化成为一个文件系统,所以我们可以说一个 filesystem 就是一个 partition。但是由于新技术的利用,例如我们常听到的LVM与软件磁盘阵列(software raid), 这些技术可以将一个分区格式化为多个文件系统(例如LVM),也能够将多个分区合成一个文件系统(LVM, RAID)! 所以说,目前我们在格式化时已经不再说成针对 partition 来格式化了, 通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分区喔!
那么文件系统是如何运行的呢?这与操作系统的文件数据有关。较新的操作系统的文件数据除了文件实际内容外, 通常含有非常多的属性,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。
对于一个磁盘分区来说,在被指定为相应的文件系统后,整个分区被分为 1024,2048 和 4096 字节大小的块。根据块使用的不同,可分为:
超级块(Superblock): 这是整个文件系统的第一块空间。包括整个文件系统的基本信息,如块大小,inode/block的总量、使用量、剩余量,指向空间 inode 和数据块的指针等相关信息。
inode块(文件索引节点) : 文件系统索引,记录文件的属性。它是文件系统的最基本单元,是文件系统连接任何子目录、任何文件的桥梁。每个子目录和文件只有唯一的一个 inode 块。它包含了文件系统中文件的基本属性(文件的长度、创建及修改时间、权限、所属关系)、存放数据的位置等相关信息. 在 Linux 下可以通过 “ls -li” 命令查看文件的 inode 信息。硬连接和源文件具有相同的 inode 。
数据块(Block) :实际记录文件的内容,若文件太大时,会占用多个block。为了提高目录访问效率,Linux还提供了表达路径与inode对应关系的dentry结构。它描述了路径信息并连接到节点inode,它包括各种目录信息,还指向了inode和超级块。
就像一本书有封面、目录和正文一样。在文件系统中,超级块就相当于封面,从封面可以得知这本书的基本信息; inode 块相当于目录,从目录可以得知各章节内容的位置;而数据块则相当于书的正文,记录着具体内容。
Linux正统的文件系统(如ext2、3等)将硬盘分区时会划分出超级块、inode Table区块和data block数据区域。一个文件由一个超级块、inode和数据区域块组成。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。
我们将 inode与block区块用图解来说明一下,如下图所示,文件系统先格式化出inode与block的区块,假设某一个文件的属性与权限数据是放置到 inode 4号(下图较小方格内),而这个inode记录了文件数据的实际放置点为 2, 7, 13, 15 这四个 block 号码,此时我们的操作系统就能够据此来排列磁盘的阅读顺序,可以一口气将四个 block 内容读出来! 那么数据的读取就如同下图中的箭头所指定的模样了。
这种数据存取的方法我们称为索引式文件系统(indexed allocation)。那有没有其他的惯用文件系统可以比较一下啊? 有的,那就是我们惯用的闪盘(闪存),闪盘使用的文件系统一般为 FAT 格式。FAT 这种格式的文件系统并没有 inode 存在,所以 FAT 没有办法将这个文件的所有 block 在一开始就读取出来。每个 block 号码都记录在前一个 block 当中, 其读取方式有点像下图所示:
上图中我们假设文件的数据依序写入1->7->4->15号这四个 block 号码中, 但这个文件系统没有办法一口气就知道四个 block 的号码,他得要一个一个的将 block 读出后,才会知道下一个 block 在何处。 如果同一个文件数据写入的 block 分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有的数据, 因此磁盘就会多转好几圈才能完整的读取到这个文件的内容!
常常会听到所谓的“碎片整理”吧? 需要碎片整理的原因就是文件写入的 block 太过于离散了,此时文件读取的效能将会变的很差所致。 这个时候可以透过碎片整理将同一个文件所属的 blocks 汇整在一起,这样数据的读取会比较容易啊! 想当然,FAT 的文件系统需要经常的碎片整理一下,那么 Ext2 是否需要磁盘重整呢?
由于 Ext2 是索引式文件系统,基本上不太需要常常进行碎片整理的。但是如果文件系统使用太久, 常常删除/编辑/新增文件时,那么还是可能会造成文件数据太过于离散的问题,此时或许会需要进行重整一下的。 不过,老实说,鸟哥倒是没有在 Linux 操作系统上面进行过 Ext2/Ext3 文件系统的碎片整理说!似乎不太需要啦!
可以用ln命令对一个已经存在的文件再建立一个新的连接,而不复制文件的内容。连接有软连接和硬连接之分,软连接又叫符号连接。它们各自的特点是:
硬连接:原文件名和连接文件名都指向相同的物理地址。目录不能有硬连接;硬连接不能跨越文件系统(不能跨越不同的分区)文件在磁盘中只有一个拷贝,节省硬盘空间;
由于删除文件要在同一个索引节点属于唯一的连接时才能成功,因此可以防止不必要的误删除。
符号连接:用ln -s命令建立文件的符号连接符号连接是linux特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径名。类似windows下的快捷方式。
可以删除原有的文件而保存连接文件,没有防止误删除功能。
这一段的的内容过于抽象,又是节点又是数组的,我已经尽量通俗再通俗了,又不好加例子作演示。大家如果还是云里雾里的话,我也没有什么办法了,只有先记住,日后在实际应用中慢慢体会、理解了。这也是我学习的一个方法吧。
3.6 文件系统在内核中的表示
内核数据结构
Linux内核的VFS子系统可以图示如下:
文件与IO: 每个进程在PCB(Process Control Block)中都保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针,现在我们明确一下:已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体。
在file结构体中维护File Status Flag(file结构体的成员f_flags)和当前读写位置(file结构体的成员f_pos)。在上图中,进程1和进程2都打开同一文件,但是对应不同的file结构体,因此可以有不同的File Status Flag和读写位置。file结构体中比较重要的成员还有f_count,表示引用计数(Reference Count),后面我们会讲到,dup、fork等系统调用会导致多个文件描述符指向同一个file结构体,例如有fd1和fd2都引用同一个file结构体,那么它的引用计数就是2,当close(fd1)时并不会释放file结构体,而只是把引用计数减到1,如果再close(fd2),引用计数就会减到0同时释放file结构体,这才真的关闭了文件。
每个file结构体都指向一个file_operations结构体,这个结构体的成员都是函数指针,指向实现各种文件操作的内核函数。比如在用户程序中read一个文件描述符,read通过系统调用进入内核,然后找到这个文件描述符所指向的file结构体,找到file结构体所指向的file_operations结构体,调用它的read成员所指向的内核函数以完成用户请求。在用户程序中调用lseek、read、write、ioctl、open等函数,最终都由内核调用file_operations的各成员所指向的内核函数完成用户请求。
file_operations结构体中的release成员用于完成用户程序的close请求,之所以叫release而不叫close是因为它不一定真的关闭文件,而是减少引用计数,只有引用计数减到0才关闭文件。对于同一个文件系统上打开的常规文件来说,read、write等文件操作的步骤和方法应该是一样的,调用的函数应该是相同的,所以图中的三个打开文件的file结构体指向同一个file_operations结构体。如果打开一个字符设备文件,那么它的read、write操作肯定和常规文件不一样,不是读写磁盘的数据块而是读写硬件设备,所以file结构体应该指向不同的file_operations结构体,其中的各种文件操作函数由该设备的驱动程序实现。
每个file结构体都有一个指向dentry结构体的指针,“dentry”是directory entry(目录项)的缩写。我们传给open、stat等函数的参数的是一个路径,例如/home/akaedu/a,需要根据路径找到文件的inode。为了减少读盘次数,内核缓存了目录的树状结构,称为dentry cache,其中每个节点是一个dentry结构体,只要沿着路径各部分的dentry搜索即可,从根目录/找到home目录,然后找到akaedu目录,然后找到文件a。dentry cache只保存最近访问过的目录项,如果要找的目录项在cache中没有,就要从磁盘读到内存中。
每个dentry结构体都有一个指针指向inode结构体。inode结构体保存着从磁盘inode读上来的信息。在上图的例子中,有两个dentry,分别表示/home/akaedu/a和/home/akaedu/b,它们都指向同一个inode,说明这两个文件互为硬链接。inode结构体中保存着从磁盘分区的inode读上来信息,例如所有者、文件大小、文件类型和权限位等。每个inode结构体都有一个指向inode_operations结构体的指针,后者也是一组函数指针指向一些完成文件目录操作的内核函数。
和file_operations不同,inode_operations所指向的不是针对某一个文件进行操作的函数,而是影响文件和目录布局的函数,例如添加删除文件和目录、跟踪符号链接等等,属于同一文件系统的各inode结构体可以指向同一个inode_operations结构体。
inode结构体有一个指向super_block结构体的指针。super_block结构体保存着从磁盘分区的超级块读上来的信息,例如文件系统类型、块大小等。super_block结构体的s_root成员是一个指向dentry的指针,表示这个文件系统的根目录被mount到哪里,在上图的例子中这个分区被mount到/home目录下。
file、dentry、inode、super_block这几个结构体组成了VFS的核心概念。对于ext2文件系统来说,在磁盘存储布局上也有inode和超级块的概念,所以很容易和VFS中的概念建立对应关系。而另外一些文件系统格式来自非UNIX系统(例如Windows的FAT32、NTFS),可能没有inode或超级块这样的概念,但为了能mount到Linux系统,也只好在驱动程序中硬凑一下,在Linux下看FAT32和NTFS分区会发现权限位是错的,所有文件都是rwxrwxrwx,因为它们本来就没有inode和权限位的概念,这是硬凑出来的。
3.7 挂载文件系统
linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。这里所说的“按一定方式”就是指的挂载。
将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为挂载。把该子目录称为挂载点.
例如要读取硬盘中的一个格式化好的分区、光盘或软件等设备时,必须先把这些设备对应到某个目录上,而这个目录就称为“挂载点(mount point)”,这样才可以读取这些设备。 挂载后将物理分区细节屏蔽掉,用户只有统一的逻辑概念。所有的东西都是文件。
注意:
1、挂载点必须是一个目录。
2、一个分区挂载在一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用。
对于其他操作系统建立的文件系统的挂载也是这样。但是需要理解的是:光盘、软盘、其他操作系统使用的文件系统的格式与linux使用的文件系统格式是不一样的。光盘是ISO9660;软盘是fat16或ext2;windows NT是fat16、NTFS;windows98是fat16、fat32;windows2000和windowsXP是fat16、fat32、 NTFS。挂载前要了解linux是否支持所要挂载的文件系统格式。
挂载时使用mount命令,其格式:mount [-参数] [设备名称] [挂载点]
其中常用的参数有:
-t 指定设备的文件系统类型(什么提到的文件类型)
-o 指定挂载文件系统时的选项。有些也可用在/etc/fstab中。常用的有
codepage=XXX 代码页 iocharset=XXX 字符集 ro 以只读方式挂载 rw 以读写方式挂载 nouser 使一般用户无法挂载 user 可以让一般用户挂载设备
例如:
1. 挂载windows的文件系统:
1)首先我们使用sudo fdisk -l查看挂载的设备,例如最下面有:/dev/hda5
2)mkdir创建一个目录,这里的目录是作为挂在目录,就是你要把E盘挂到这个目录下:mk /mnt/winc
3)windows和linux使用的不是一个文件系统,一般情况下linux不挂载windows文件系统,所以要你手动mount:
# mount -t vfat /dev/hda5 /mnt/winc ( -t vfat指出这里的文件系统fat32)
现在就可以进入/mnt/winc等目录读写这些文件了。
2.挂载光盘:# mk /mnt/cdrom
# mount -t iso9660 /dev/cdrom /mnt/cdrom (关盘的名字一般都是cdrom,这条命令一般都通用)
3.虚拟机共享文件夹:例如在VirtualBox下,主机是Windows,Ubuntu是Guest。共分三步:
1). 首先要安装虚拟电脑工具包:
在VirtualBox的菜单里选择”设备”->”安装虚拟电脑工具包”,你会发现在Ubuntu桌面上多出一个光盘图标,这张光盘默认被自动加载到了文件夹/media/cdom0,而且/cdrom自动指向这个文件夹。默认设置下文件管理器会自动打开这张光盘,可以看到里面有个”VBoxLinuxAdditions.run”文件。打开一个命令行终端,依次输入”cd /cdrom”和”sudo sh ./VBoxLinuxAdditions.run”,不含双引号,开始安装工具包。安装完毕,会用英文提示要重启Ubuntu,建议立刻重启。重启后,比较明显的变化是鼠标是共享模式,并且剪贴板也和Windows共享了。如果有这些变化,说明虚拟电脑工具包已经装成功。
2). 下一步设置共享文件夹。
在共享文件夹设置窗口中,单击右侧的”添加一个共享文件夹”,路径选择你想要共享的Windows文件夹,共享名任取一个自己喜欢的,比如”myshare”,选项read-only是指是否只允许ubuntu读这个文件夹,请根据需要选择这个选项。
3). 在ubuntu下挂载这个共享文件夹:sudo mount -t vboxsf myshare /media/share
其中”myshare”是之前取的共享文件夹的名字,”/media/share”是要挂载到的目标文件.
3.8 自动挂载windows分区
每次开机访问windows分区都要运行mount命令显然太烦琐,为什么访问其他的linux分区不用使用mount命令呢?
其实,每次开机时,linux自动将需要挂载的linux分区挂载上了。那么我们是不是可以设定让linux在启动的时候也挂载我们希望挂载的分区,如windows分区,以实现文件系统的自动挂载呢?
这是完全可以的。在/etc目录下有个fstab文件,它里面列出了linux开机时自动挂载的文件系统的列表。我的/etc/fstab文件如下:
/dev/hda2 / ext3 defaults 1 1 /dev/hda1 /boot ext3 defaults 1 2 none /dev/pts devpts gid=5,mode=620 0 0 none /proc proc defaults 0 0 none /dev/shm tmpfs defaults 0 0 /dev/hda3 swap swap defaults 0 0 /dev/cdrom /mnt/cdrom iso9660 noauto,codepage=936,iocharset=gb2312 0 0 /dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0 /dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0 /dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0
在/etc/fstab文件里,第一列是挂载的文件系统的设备名,第二列是挂载点,第三列是挂载的文件系统类型,第四列是挂载的选项,选项间用逗号分隔。第五六列不知道是什么意思,还望高手指点。
在最后两行是我手工添加的windows下的C;D盘,加了codepage=936和iocharset=cp936参数以支持中文文件名。参数defaults实际上包含了一组默认参数:
rw 以可读写模式挂载
suid 开启用户ID和群组ID设置位
dev 可解读文件系统上的字符或区块设备
exec 可执行二进制文件
auto 自动挂载
nouser 使一般用户无法挂载
async 以非同步方式执行文件系统的输入输出操作
大家可以看到在这个列表里,光驱和软驱是不自动挂载的,参数设置为noauto。(如果你非要设成自动挂载,你要确保每次开机时你的光驱和软驱里都要有盘,呵呵。)
3.9 软连接、硬链接
可以用ln命令对一个已经存在的文件再建立一个新的连接,而不复制文件的内容。连接有软连接和硬连接之分,软连接又叫符号连接。它们各自的特点是:
硬连接:是给文件一个副本,原文件名和连接文件名都指向相同的物理地址。目录不能有硬连接;硬连接不能跨越文件系统(不能跨越不同的分区)文件在磁盘中只有一个拷贝,节省硬盘空间;
修改其中一个,与其连接的文件同时被修改。如果删除其中任意一个其余的文件将不受影响。
由于删除文件要在同一个索引节点属于唯一的连接时才能成功,因此可以防止不必要的误删除。
符号连接(软连接):用ln -s命令建立文件的符号连接符号连接是linux特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径名。类似windows下的快捷方式。
当然删除这个连接,也不会影响到源文件,但对连接文件的使用、引用都是直接调用源文件的。
具体关系可以看下图:
从图上可以看出硬链接和软链接的区别:
1:硬链接原文件和新文件的inode编号一致。而软链接不一样。
2:对原文件删除,会导致软链接不可用,而硬链接不受影响。
3:对原文件的修改,软、硬链接文件内容也一样的修改,因为都是指向同一个文件内容的。
3.10 文件目录管理命令
磁盘和文件空间 :fdisk df du
文件目录与管理: cd pwd mkdir rmdir ls cp rm mv
查看文件内容 cat、tac、more、less、head 、tail
文件目录与权限 :chmod chown chgrp umask
文件查找:which、whereis、locate、find、find
【以下内容转载自(CentOS7 查看硬盘情况)】
- lsblk 查看分区和磁盘
- df -h 查看空间使用情况
- fdisk -l 分区工具查看分区信息
- cfdisk /dev/sda 查看分区
- blkid 查看硬盘label(别名)
- du -sh ./* 统计当前目录各文件夹大小
- free -h 查看内存大小
- cat /proc/cpuinfo| grep "cpu cores"| uniq 查看cpu核心数
- cat /proc/cpuinfo| grep "physical id"|uniq| wc -l 查看物理cpu个数
- cat /proc/cpuinfo| grep "processor"| wc -l 查看逻辑cpu的个数
- netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}' 查看当前网络连接情况
若非特意注明,本博客内容整理自互联网/课堂(部分来源已给出),仅供个人学习使用,不用于任何商业用途。如果认为可能请侵犯到您的权益,请联系以删除。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理