存储结构与磁盘划分

文件系统层次化标准(FHS,file system hierarchy standard)
        在windows操作系统中,要找到一个文件需要先进入该文件所在的磁盘分区(如C:\等   C:\ZSX\zsx.txt),然后在进入该分区下的一个具体目录,最终找到这个文件。在Linux操作系统中,一切文件都是从根目录(/)开始的(根目录/为第一级),然后按照FHS文件系统层次化标准采用树形结构来存放文件,以及定义了常用目录的用途。/root:root管理员的家目录(超级用户),系统用户是不需要有家目录的,因为系统用户的默认终端为/sbin/nologin,其不需要登陆到系统,只是负责Linux系统的一些服务配置。 /dev:以文件形式存放任何设备与接口,设备文件。   /etc:配置文件(passwd、shadow。Linux系统的一切都是文件,配置一个服务就是在修改该服务所对应的配置文件)      /home:用户家目录(普通用户)   /tmp:任何人都可以使用的共享临时目录   /boot:开机时需要的文件(驱动程序、引导文件等)   /var:经常发生变化的文件,如:数据库、日志文件等    /lib:系统的函数库文件   /usr:用户自己安装的程序文件     /mnt 与 /media :设备文件的挂载目录,自动挂载为/media  手动挂载一般为/mnt /bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin、/usr/local/sbin:各种命令文件(二进制文件),bin目录内部都是开机时候不需要的命令(文件),sbin目录内部为开机时候需要的命令(文件)。 绝度路径与相对路径。路径指的是如何定位到某个文件。绝对路径指的是从根目录/开始写起的文件或目录名称,而相对路径指的是相对于当前路径的写法。

物理设备的命令规则
        系统内核中的udev设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等。另外,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev目录下的设备文件。 SCSI/SATA/U盘:/dev/sd[a-p]   软驱:/dev/fd[0-1]   打印机:/dev/lp[0-15]  光驱:/dev/cdrom   鼠标:/dev/mouse   磁带机:/dev/st0 或 /dev/ht0  
        硬盘设备都会是以“/dev/sd”开头的。而一台主机上可以有多块硬盘,因此系统采用a~p来代表16块不同的硬盘(默认从a开始分配),而且硬盘的分区编号也很有讲究:主分区或扩展分区的编号从1开始,到4结束;逻辑分区从编号5开始。(扩展分区最多只能有一个) 注意:sda3只能表示是编号为3的分区,而不能判断sda设备上已经存在了3个分区。 即,扩展分区与主分区的编号只要符合为1-4之间的任意一个就可以了。
        /dev/sda并不一定就表示主板上第一个插槽上的存储设备, /dev目录中sda设备之所以是a,并不是由插槽决定的,而是由系统内核的识别顺序来决定的,而恰巧很多主板的插槽顺序就是系统内核的识别顺序,因此才会被命名为/dev/sda。大家以后在使用iSCSI网络存储设备时就会发现,明明主板上第二个插槽是空着的,但系统却能识别到/dev/sdb这个设备就是这个道理。
        /dev/sda5的含义:/dev/目录中保存的应当是设备文件;其次,sd表示是存储设备;然后,a表示系统中同类接口中第一个被识别到的设备,最后,5表示这个设备是一个逻辑分区。一言以蔽之,“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为5的逻辑分区的设备文件”。
        主分区、扩展分区和逻辑分区的概念。硬盘设备是由大量的扇区(sectors)组成的,每个扇区的容量为512字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用446字节,分区表为64字节,结束符占用2字节;其中分区表中每记录一个分区信息就需要16字节,这样一来最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区。如果一个物理磁盘需要划分为大于4个的逻辑磁盘(分区或卷),则需要抽出其中的一个主分区(16个字节)来作为扩展分分区,扩展分区里面都是包含指向逻辑分区的指针。扩展分区其实并不是一个真正的分区,而更像是一个占用16字节分区表空间的指针(一个指向另外一个分区的指针)。因此,扩展分区实际上并不能储存文件,能够储存文件(写入实际内容)的是主分区和逻辑分区。扩展分区本质上为指针,指向另一个扇区。另一个扇区则为逻辑分区(16x32=512,一个扇区最多可以记录32个逻辑分区的信息)。可以自己指定分区的大小,即格式化后形成的文件系统的大小。

磁盘的格式化和文件系统
        磁盘的格式化分为低级格式化和高级格式化。低级格式化完成将一个磁盘划分为多个扇区的操作,每个扇区能够储存512个字节的信息。在磁盘低级格式化完成后,一般要对磁盘进行分区(分区就是卷)。在逻辑上,每个分区就是一个独立的逻辑磁盘。每个分区的起始扇区和大小都记录在磁盘0扇区的的分区表中。在这个分区表中必须有一个分区被标记成活动的(即引导块),以保证能够从硬盘引导系统。在真正可以使用磁盘前,还需要对磁盘进行一次高级格式化,即设置一个引导块、空闲存储管理、根目录和一个空文件系统,同时在分区表中标记该分区所使用的文件系统。
        对于一块新的硬盘存储设备,需要先分区,然后再格式化文件系统,最后才能挂载并正常使用。格式化形成的文件系统格式有Ext2、Ext3、Ext4与XFS等。如果硬件储存设备(即每一个分区)没有进行格式化,则Linux系统无法得知怎么在其上写入数据,因此在对存储设备进行分区后还必须进行格式化处理。(在windows中,硬盘被划分为4个逻辑分区,每一个分区都格式化为NTFS文件系统,并挂载到C:\ D:\ E:\ F:\目录上,因此系统在读取硬盘上的数据时,先根据0扇区的分区表,找到相关分区的信息和位置,然后进入该分区,进一步寻找相关文件的FCB,从而找到具体的文件)。例如对硬盘sda分区后形成的sda1进行格式化后,才能对其进行写入数据,至于文件系统的概念,则详见操作系统的学习笔记(FAT、NTFS等文件系统)。

虚拟文件系统VFS
        计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构(用户不用管该文件系统具体是什么格式的文件系统),Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。
        硬件设备的挂载。只有在分区、格式化后,对硬件设备(文件系统)进行挂载后,才能通过进入与其挂载的目录对硬盘进行读写等操作,即进入该目录,就可以读取该硬盘的数据了。

磁盘的分区与挂载
        当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载”,其目的是让用户可以通过该目录来使用该硬件设备。                                                                                                                                              mount命令  用于挂载文件系统,其格式:mount [参数]  文件系统路径名称(分区)  挂载目录  
       -t 指定该分区文件系统的格式(可以不指定,linux系统自己能识别)  -a 挂载所有在/etc/fstab中定义的文件系统
       mount –a   //挂载所有在/etc/fstab中定义的文件系统,执行后自动检查/etc/fstab文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。  mount  /dev/sdb2  /backup  将分区/dev/sdb2挂载到目录/backup上  注意:系统在重启后该挂载就会失效,需要每次开机后都手动挂载一下。如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填
写格式(“设备文件 挂载目录 格式类型 权限选项 是否备份  是否自检”)写入到/etc/fstab文件中。如下:  
                    /dev/sdb2   /backup    ext4    defaults  0   0
权限选项: 若设置为defaults,则默认权限为:rw,suid,dev,exec,auto,nouser,async
是否备份:若为1,则开机后使用dump进行磁盘备份,为0则不备份
是否自检:若为1,则开机后进行磁盘自检,为0不自检。
umount命令  用于撤销已经挂载的设备文件,格式:umount  设备路径名称/挂载目录名称    两者只需要选一个
即可。   如  umount /dev/sdb2
        对于如何在luniux系统中添加一块新的硬盘、对硬盘进行分区(fdisk命令)和对分区格式化为文件系统(mkfs命令)的详细操作可以参考有关教材。
         df -h 命令   用于查看挂载状态和硬盘使用量等信息。
         du -sh 命令 用来查看一个或多个文件占用了多大的硬盘空间。可以使用du -sh /*命令来查看在Linux系统根目录下所有一级目录分别占用的空间大小。du -sh /tmp/zsx1/*  //查看zsx1目录内所有文件的占用大小信息     du -sh /tmp/zsx1   //查看zsx1目录的占用大小信息

改变系统对换区的大小(SWAP交换分区)
        对换区在操作系统进行中级调度(中程调度)时、缺段缺页等情况时会使用到对换区,对换区仍然是硬盘中的一个分区,通常内存中不常用的数据临时放到对换区中,实现虚拟存储管理。free -m或-h命令可以查看内存的使用量信息,也可以看到对换区(SWAP)的大小和使用量信息。下面介绍增加交换分区容量的方法,设SWAP原来容量大小为2047MB,为其增加5GB,为7167MB。可以在任意一块硬盘中划出一个容量为5GB的分区,方法跟上面分区方法一样,设分区为/dev/sdb2。使用SWAP分区专用的格式化命令mkswap对该分区进行格式化:mkswap   /dev/sdb2     然后将其挂载: swapon   /dev/sdb2  //这里使用专用的swapon命令    然后可以使用free -m  命令查看SWAP分区大小的变化。  最后将挂载信息写到/etc/fstab文件中:                                              /dev/sdb2   swap    swap    defaults  0    0

软硬方式链接(文件的共享)
        快捷方式就是指向原始文件的一个链接文件,可以让用户从不同的位置来访问原始的文件;原文件一旦被删除或剪切到其他地方后,会导致链接文件失效。在Linux系统中,存在硬链接和软链接两种文件。无论是硬链接还是软链接方式共享文件,文件本身只有一份,这与文件复制有着本质的区别。
        硬链接。共享该文件的每个文件有自己的FCB,其包含自己的文件名和指向索引结点的指针,它们的指针都指向同一个索引结点,即共享文件的索引结点。每添加一个硬链接,该文件的索引结点连接数就会增加1;而且只有当该文件的索引结点连接数为0时,才算彻底将它删除。不能跨分区对文件进行硬链接;也不能对目录文件进行硬链接。
        软链接(符号链接 symbolic link)。仅仅包含链接文件的路径名,因此可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows系统中的“快捷方式”具有一样的性质。既可以对目录进行软链接,也可以跨分区(跨文件系统)对文件进行软链接。
        ln命令   ln 目标文件 链接文件    硬链接
                      ln -s 目标文件 链接文件    软链接(符号链接)
ls -s /home/etc/zsx /tmp/zsx1   则zsx1链接文件其实就是一个路径名:/home/etc/zsx,其大小为13bytes,因为/home/etc/zsx只有13个字符。如下:
# ls -l guess.sh 
-rw-rwxr--+ 1 root root 558 Mar  4 23:19 guess.sh  //该文件设置有ACL,且指向该索引结点的指针只有一个,即硬链接只有自己
# ln -s guess.sh zhang.sh
# ls -l zhang.sh 
lrwxrwxrwx. 1 root root 8 Mar  8 02:16 zhang.sh -> guess.sh //该文件是软链接文件,且实际内容为/root/work/guess.h 即只是一个路径名,文件符号位l,且指向索引结点的指针为1,如果是硬链接文件,一定大于1.  但是执行bash zhang.sh的效果跟bash guess.h一样。 且原文件删除,该链接文件无效。字母l一定是软链接文件。                                                                                                            # ln guess.sh  zhang.sh   硬链接
# ls -l zhang.sh 
-rw-rwxr--+ 2 root root 558 Mar  4 23:19 zhang.sh
# ls -l guess.sh 
-rw-rwxr--+ 2 root root 558 Mar  4 23:19 guess.sh
可以看出两个文件的属性是一样的,因此它们的地位都是平等的,其中任意一个文件被删除对其它文件无影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/385468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中常用文件的含义

在Linux中配置了服务文件后,需要重启该服务,配置信息才会生效。 /etc/passwd 保存了系统中所有用户的信息,一旦用户的登陆终端设置为/sbin/nologin,则不再允许登录到系统 /etc/shadow与/etc/passwd均为用户信息文件 /…

64. 最小路径和

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 输入: [[1,3,1],[1,5,1],[4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。…

Linux本地yum源配置以及使用yum源安装各种应用程序

将软件包传送到Linux中后,挂载,然后配置yum软件仓库,最后就可以使用yum来安装相应的应用程序了。假设挂载目录为/tmp/ruanjianbao,则下面说明配置本地yum仓库的过程: (1)cd /etc/yum.repos.d/…

gcc与g++编译器

首先在Linux(RHEL7.0)上安装gcc:yum install gcc gcc-c -y 其中gcc-c是为了能够编译c源代码,即g。 gcc为Linux C/C下重要的编译环境,是GUN项目中符合ANSIC标准的编译系统, gcc可以编译C、C、Objective-C、Java、Fortran、Pascal…

【Leetcode | 49】230. 二叉搜索树中第K小的元素

给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。 示例 1: 输入: root [3,1,4,null,2], k 1 3 / \ 1 4 \ 2 输出: 1 示例 2: 输入…

gcc编译器的整个工作过程

gcc hello.c ./a.out 或者 gcc hello.c -o hello ./hello ./表示执行当前目录下的可执行程序或脚本程序。 首先gcc需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入“#include”语句所包含的内容;接着gcc会调用…

宏定义对调试代码的作用

以如下代码为例&#xff1a; //head.h #ifndef __HEAD_H__ #define __HEAD_H__#define NUM1 10 #define NUM2 20 #endif//sum.c #include <stdio.h> //直接在标准库中查找 #include "head.h" //先在工作目录中查找&#xff…

【第15章】多重继承

1. 虚基类介绍 多继承时很容易产生命名冲突&#xff0c;即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字&#xff0c;命名冲突依然有可能发生&#xff0c;比如非常经典的菱形继承层次。如下图所示&#xff1a; 类A派生出类B和类C&#xff0c;类D继承自类B和…

gcc编译器与g++编译器的区别

gcc与g编译器的程序文件分别为&#xff1a;/usr/bin/g和/usr/bin/gcc。 gcc 和 GCC 是两个不同的东西&#xff0c;GCC:GNU Compiler Collection(GUN 编译器集合)&#xff0c;它可以编译C、C、JAV、Fortran、Pascal、Object-C、Ada等语言。gcc是GCC中的GUN C Compiler&#xff0…

1. 排序算法

一、概述 假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持不变&#xff0c;即在原序列中&#xff0c;r[i]r[j]&#xff0c;且r[i]在r[j]之前&#xff0c;而在排序后的序列中&#xff0c;r[i]仍…

1036. 跟奥巴马一起编程(15)

美国总统奥巴马不仅呼吁所有人都学习编程&#xff0c;甚至以身作则编写代码&#xff0c;成为美国历史上首位编写计算机代码的总统。2014年底&#xff0c;为庆祝“计算机科学教育周”正式启动&#xff0c;奥巴马编写了很简单的计算机代码&#xff1a;在屏幕上画一个正方形。现在…

库文件与头文件

首先说明库文件与头文件在gcc中的具体使用方法&#xff0c;然后说明两者的区别与联系。 库文件即库函数&#xff0c;如printf和scanf函数。以libgtdf.so库文件为例&#xff08;库文件在命名时都以lib开头&#xff0c;因此使用-l选项去链接指定的库文件时可以省略lib三个字母&am…

gcc的常用参数

-c 编译成目标文件.o&#xff08;只编译不链接&#xff09; gcc -c hello.s -o hello.o -o 指出输出文件名&#xff0c;输出文件名跟在-o后面。如果不使用这一选项&#xff0c;则缺省的输出文件名为a.out。gcc hello.c -o hello.exe&#xff08;在Linux中该项后缀名无要求&a…

1027. 打印沙漏(20)

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 ************ *****所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中心对齐&#xff1b;相邻两行符号数差2&#xff1b;符号数先从大到小顺序递减…

【C++ Priemr | 15】构造函数与拷贝控制

继承的构造函数 1. 简介&#xff1a; 子类为完成基类初始化&#xff0c;在C11之前&#xff0c;需要在初始化列表调用基类的构造函数&#xff0c;从而完成构造函数的传递。如果基类拥有多个构造函数&#xff0c;那么子类也需要实现多个与基类构造函数对应的构造函数。 class …

C命令行参数

C命令行参数的作用是在执行程序时&#xff0c;可以将命令行的参数传值给C程序内部&#xff0c;这样就可以从外部控制程序&#xff0c;而不是在代码内对这些值进行硬编码。命令行参数是使用main函数来处理的&#xff0c;argc是指参数的个数&#xff0c;为int类型&#xff1b;arg…

剖析数组名、函数名(不是指针常量,更不是指针)

对于一个数组&#xff0c;如 int a[4]; 如果只是给出数组名a&#xff0c;编译器不知道该取该数组的第几个元素&#xff0c;因此编译器不会自动取值&#xff0c;而是返回该数组的首地址&#xff08;第一个元素的地址&#xff09;。其实&#xff0c;数组名a就是数组本身&#xf…

【C++ Priemr | 15】面向对象程序设计

类型准换与继承 为了支持c的多态性&#xff0c;才用了动态绑定和静态绑定。 需要理解四个名词&#xff1a; 对象的静态类型&#xff1a;对象在声明时采用的类型&#xff0c;是在编译期确定的。对象的动态类型&#xff1a;目前所指对象的类型&#xff0c;是在运行期决定的。对…

linux里source、. 、sh、bash、./有什么区别

转载&#xff1a;https://www.cnblogs.com/pcat/p/5467188.html 1.source a.sh source可以简写为“.”&#xff0c;即. a.sh 注意中间有空格&#xff0c;在当前shell内去读取、执行a.sh&#xff0c;而a.sh不需要有"执行权限"。 2.sh a.sh 和 bash a.sh 都是打开…

【C++ Priemr | 15】虚函数表剖析(三)

一、虚拟菱形继承 #include <iostream> using namespace std;class B { public:int _b; };class C1 :virtual public B { public:int _c1; };class C2 :virtual public B { public:int _c2; };class D :public C1, public C2 { public:int _d; };int main() {cout <&…