Linux文件系统简介一(磁盘分区、开机过程、目录结构、文件权限、文件扩展名、目录管理)
阅读原文时间:2023年07月10日阅读:1

Linux:就是一组软件,一套操作系统=核心+系统呼叫接口层。

操作系统 = 核心(内核) + 系统呼叫(接口)

操作系统其实也是一组程序,重点在于管理计算机的所有活动以及驱动系统中的所有硬件。

初识操作系统,我们从一张图片开始:

核心:即是我们通常所说的操作系统内核,其主要负责整个计算机系统相关的资源分配与管理,可归纳为以下几大核心功能

  • 程序管理:程序资源分配及调度执行等管理。
  • 内存管理:内存的控制与使用。
  • 文件系统管理:文件格式支持,数据输入/输出等等。
  • 硬件驱动管理:驱动硬件供使用这是内核的主要工作,目前都支持【可加载模块】方式管理硬件。

系统呼叫接口:方便程序开发者可以轻易透过与内核的沟通,使用硬件资源。

冯诺依曼提出的计算机基本工作原理:

  1. 用二进制形式表示数据和指令;
  2. 采用存储程序方式执行;
  3. 计算机由算数逻辑运算器、控制器、存储器、输入设备和输出设备5大部分组成。[运控存入出]

CPU的组成:运算器+高速缓冲存储器

实体计算机内部结构:

上图是Intel生产的典型的x86架构主板。

1.BIOS:写入到主板上的一个软件程序,BIOS在开机的时候,计算机系统会主动执行的第一个程序。BIOS会去分析计算机里面有哪些存储设备,比如:以硬盘为例,BIOS会依据使用者的设定去取得能够开机的硬盘,并且到该硬盘里面去读取第一个扇区的MBR位置。BIOS工作结束,MBR内的开机管理程序开始工作。

2.MBR存放的内容:放置最基本的开机管理程序。MBR的目的:是在加载(load)核心档案,这个开始管理程序是系统提供的,所以去读取核心档案,核心档案开始工作,开机管理程序结束。

3.开机管理程序(boot loader):一支可读取核心档案来执行的软件。

  • 提供选单:用户可以通过选择不同的开机项目,多重引导,即安装不同的系统。
  • 载入核心档案:直接指向开机的程序区段来开始操作系统。
  • 转交给其他loader:将开机管理功能转交给其他loader负责。

4.核心档案:开始操作系统的功能…

CMOS:记录各项硬件参数且嵌入在主板上的存储器。

  台式机与笔记本开机过程有些许差异,但主要过程大致相同:按下开机键 –> EC检测到开机键(高低电平变化)-> CPU上电完成并获得控制权 -> 读取BIOS及CMOS中参数完成系统所有设备上电和自检 -> CPU根据BIOS设置的顺序找到第一个可开机设备,读取其第一个扇区MBR所在的位置 -> CPU运行扇区MBR中的开机管理程序(boot loader),boot loader程序则根据分区表找到可启动分区并加载其中的系统内核(核心档案) -> 完成开机。

开机过程,可通过流程图如下:

红色字体是需求我们留意的,其中涉及到这样几个概念或者实体:第一个扇区、boot loader、分区表及系统内核。

开机管理示意图如下:MBR提供2个选单,建议一般先安装windows[安装程序会主动覆盖掉MBR以及自己所在分割槽的启动扇区]在安装linux[因为linux可以进行选择将开机管理程序安装在MBR或各别分割槽的启动扇区].

  由于机械硬盘更形象,因此这里以机械硬盘来介绍上述的概念。当下固态在逐步成为主流,其与机械硬盘最大的区别在于工作原理:固态硬盘是以半导体状态做记忆介质,机械硬盘是以磁作为记忆介质。

 

硬盘容量=磁头数*磁轨数*扇区数*扇区大小(512Bytes)

=读取头*上下总共n圈磁轨的数量*一圈扇区口的数量*扇区口的大小(512Bytes)

硬盘的数据存储在一个个的盘片上,每个盘片由多个同心圆磁轨组成,每个磁轨又由多个扇区组成。扇区是数据存储的基本单位,人为规定每个扇区大小为512Bytes。硬盘可以有多个盘片,每个盘片上相同的磁轨组成了磁柱,而磁柱是分区的基本单位。

磁盘的组成主要有磁盘盘、机械手臂、磁盘读取头与主轴马达。数据写入是在磁盘盘上面,磁盘盘上面又可细分出扇区(sector)与磁柱(Cylinder)。扇区大小默认是512bytes。磁盘盘如下:

磁盘的扇区并不是都一样重要,最重要的是磁盘的第一个扇区,因为它记录了整颗磁盘的重要信息,主要有以下两个重要信息:

  1. MBR(Master Boot Record)主要启动记录区,大小446Bytes,用于安装开机管理程序;
  2. 分割表(partition table),记录整颗硬盘的分割状态,64Bytes。

4.1 磁盘分区

文件系统的最小单位:开始磁柱和结束磁柱,也是分割槽的最小单位。利用参考对照磁柱号码的方式进行处理。

分割表所在的64Bytes容量中,总共分为四组记录区,每组记录区记录了该区段(分区)的启始与结束的磁柱号码。

仅有主分区磁盘分区,磁盘分区表的作用示意图:

假设该磁盘只有400个磁柱,共分割成为四个分割槽,第四个分割槽起始位置是从301开始,400号磁柱的范围。

从windaow角度:第一个到第四个分割槽的代码应该是C,D,E,F。当你的资料写入F槽时,你的数据会被写入这颗磁盘的301~400磁柱之间。

//假设上面的硬盘装置文件名
/dev/hda
//四个分割槽在linux系统中的装置文件名,重点是档案名后面会再接一个数字,数字与分割槽所在的位置有关
p1:/dev/hda1
p2:/dev/hda2
p3:/dev/hda3
p4:/dev/hda4

引入扩展分区磁盘分区,磁盘分区表的作用示意图:****

硬盘的四个分割记录仅使用了两个,P1为主要分割,P2则为扩展分区。

注意,引入扩展分区的目的:使用额外的扇区来记录分割信息,扩展分区本身并不能被拿来格式化。需要将扩展分区的分区段继续分割后(分割后的分区成为逻辑分区)才能进一步格式化。

//假设上面的硬盘装置文件名
/dev/hda
//分割槽在linux系统中的装置文件名。P开始的分区保留3和4,L开头的逻辑分区的装置名称从5开始。
p1:/dev/hda1[主分区]
p2:/dev/hda2
L1:/dev/hda5
L2:/dev/hda6
L3:/dev/hda7
L4:/dev/hda8
L5:/dev/hda9
//缺少/dev/hda3、/dev/hda4的原因:前面4个号码都是保留给Primary或Extended。Extened分区本身并不能进行进行结构化。

总结:

  1. 主要分区与扩展分区最多有四个(硬盘的限制)。
  2. 扩展分区最多只能有一个。
  3. 逻辑分区是由扩展分区切割出来的分割槽。
  4. 能够被格式化,作为数据存取的分区只有主要分区和逻辑分区,扩展分区无法格式化。
  5. 逻辑分区的数量根据操作系统而定,比如linux:IDE硬盘最多有59个逻辑分区(5-63号),SATA硬盘则有11个逻辑分区(5-15号)。

4.2 加载系统

  加载系统主要用到第一颗可启动设备的第一个扇区的MBR位置。MBR里面放置的就是最基本的开机管理程序(boot loader),它的作用就是加载操作系统内核。Boot loader有3项基本任务:

  • 提供选单:当有多重引导时,可同用户选择不同的开机项目;
  • 载入系统内核:指向可开机的程序区段来开始操作系统;
  • 转交其他loader:将开机管理功能转交其他loader负责------能实现多重引导的根本。

PS:如果电脑安装多系统,需要先安装windows系统,在安装linux系统。

  在Linux系统中,所有数据都是以文件[档案的形态]形式呈现,因此整个Linux系统最重要的地方就在于目录树架构。所谓目录树架构就是以根目录为主,然后向下呈树形分支状的目录结构,因此目录树架构最重要的就是根目录,在Linux中以一条斜线/表示。目录树的呈现方式如下图所示:

所有的文件都是由根目录(/)来的,而次目录之下还能够有其他的数据存在。比如上图长方形表示目录,波浪形为文件。

至于系统有哪些目录,以及各种目录放置哪些数据,为了规范这些东西,于是就有了所谓的FHS(Filesystem Hierachy tandard)。FHS是根据过去的经验一直再持续的改版的,FHS依据文件系统使用的频繁与否与是否允许使用者随便更动,而将目录定义成为四种交付作用的形态:

  • 可分享的:可以分享给其他系统挂载使用功能的目录,所以包括执行文件与用户的邮件等数据,是能够分享给网络上其他主机挂载用的目录。
  • 不可分享的:自己机器上面运作的装置档案或者是程序有关的socket档案等,只与机器本身有关,不适合分享给其他主机。
  • 不变的:数据不会经常变动,比如:函式库、文件说明文件、系统管理员所管理的主机服务配置文件等等
  • 可变动的:经常改变的数据,例如登录文件、一般用户可自动收受的新闻组等。

事实上,FHS针对目录树架构仅定义出三层目录下应该放置的数据:

  • /(根目录) : 与系统开机、回复、备份相关;
  • /usr(unix software resource) : 与软件安装/执行相关;
  • /var(variable): 与系统运行过程有关。包括快取(cache)、log日志(log file)以及某些软件运作所产生的档案, 包括程序档案(lock file, run file).

目录树的特性:

  • 目录的起始点为根目录(/,root)
  • 每一个目录不止能使用本地端的partition的文件系统,也可以使用网络上的filesystem。比如:利用Networdk File System(NFS)服务器挂载某特定目录等。
  • 每一个档案在此目录树中的文件名(包含完整路径)都是独一无二的。

目录树架构示意图如下:

绝对路径与相对路径:

  • 绝对路径:由根目录(/)开始写起的文件名或目录名称,例如/home/dmtsai/.bashrc。
  • 相对路径:./home/dmtsai或../../home/dmtsai/等等,反正开头不是/就属于相对路径的写法。

// 其中.表示当前的目录: ./
//当前目录所在位置:/var/spool/mail;需求:进入/var/spool/log目录
cd ./log
//..表示上一层目录: ../
//当前所在目录:/var/spool/mail/目录;需求:进入/var/spool/scron/目录
cd /var/spool/mail
cd ../cron 

FHS官方文档可参看: http://www.pathname.com/fhs

  截止目前,我们知道整个Linux系统使用的是目录树架构,但是我们的文档数据其实是放置磁盘分区中,所以现在的问题是“如何结合目录树架构与磁盘分区内的数据?”答案是“挂载(mount)”。

  挂载:就是利用一个目录当成进入点,将磁盘分区中的数据放置在该目录下;换种说法就是,进入该目录就可以读取到相应分区内的数据。将目录与分区映射这个动作就叫“挂载”,进入点的目录就叫挂载点。

目录树与分割区之间的相关性:

  假设我的硬盘分为2个区,分区1是挂载到根目录,分区2则是挂载到/home这个目录。比如我的数据放在/home内的次目录下时,数据是放在分区2的,如果不是放在/home低下的目录,那么数据就会被放置在分区1了。

常见的挂载点与磁盘分区的规划:

  1. 初次接触Linux: 分割为/及swap两个分区即可;
  2. 建议分区方式:/, /boot, /var, /usr, /home, swap;
  3. 根据服务器具体用途分区;

# df -T //查看已挂载的分区和相应的文件系统类型

  在介绍文件与目录权限之前,简要解释一下拥有者,群组,及非本群组外其他人三个概念,并结合ll命令查看文件权限及目录权限。

场景:linux是多人多任务的系统,可能常常会有多人同时使用这部主机来进行工作的情况,因此产生文件拥有者角色。

文件的拥有者、群组以及其他人的示意图:

  比如以王三毛为例,王三毛这个文件属于文件的拥有者、他属于王大毛这个群组,而张小猪对于王三毛来说,则只是一个其他人others。

  linux用户身份与群组记录的档案:所有的系统上的账号与一般身份使用者,还有那个root的相关信息,都是记录在/etc/passwd这个档案,个人密码记录在etc/shadow这个档案下,linux所有的组名都记录在/etc/group内。用户及用户组常用管理命令可参考:

eg1:
cat /etc/passwd //查看账号信息
cat /etc/group //查看用户组信息
cat /etc/shadow //查看用户密码信息

用户相关操作

新增用户
useradd UserName
在运行上面命令后,一般需要用passwd UserName来进行秘密设置
删除用户
userdel UserName
修改用户
usermod UserName

用户组相关操作

与用户联系非常紧密的还有用户组的概念,与用户组相关的命令常见如下:
新增用户组
groupadd GroupName
删除用户组
groupdel GroupName
修改用户组
groupmod GroupName

https://blog.51cto.com/taoismli/1977864

  有了上述用户、用户组及权限概念之后,再来了解一下权限之于文档及目录的意义.

权限对档案的重要性:档案是实际含有数据的地方,包括一般文本文件、数据库内容文件、二进制可执行文件(binary program)等等。权限于文档的意义:

  • r (read):可读取此一档案的实际内容,如读取文本文件的文字内容等;
  • w (write):可以编辑、新增或者是修改该档案的内容(但不含删除该档案);
  • x (execute):该档案具有可以被系统执行的权限。

权限对目录的重要性:目录主要的内容是记录文件名列表,文件名与目录有强烈的关联。

  • r (read):表示具有读取目彔结构列表的权限,所以当你具有读取(r)一个目彔的权限时,表示你可以查询该目彔下的文件名数据。 所以你就可以利用 ls 这个指令将该目彔的内容列表显示出来!

  • w (write):表示具有移动该目彔结构列表的权限,也就是底下这些权限:x (execute):代表的是用户能否进入该目彔成为工作目彔。

  • 建立新的文档与目彔;

  • 删除已经存在的文档与目彔(无论该文档的权限为何!);

  • 更名文档与目录;

  • 移动该目彔内的文档、目彔位置;

//在目录/tmp中建立一个名为testing的目录,该目录权限为744且目录拥有者为root.
//在testing目录下建立一个空的文件,文件名为:testing
//建立目录可用mkdir
cd /tmp //切换工作目录到/tmp
mkdir testing //建立新目录
chmod 744 testing //变更权限
touch testing/testing //建立空的文件
chmod 600 testing/testing //变更权限
su -vbird //切换身份成为vbird

linux文件属性的示意图:

档案的类型与权限之内容:[档案类型][档案拥有者之权限][档案所属群组之权限][其他人之权限]。其中每三个分别代表[可读][可写][可执行][无权限]

//查看档案的指令[权限][连结][拥有者][群组][档案容量][修改日期][文件名]
//ls:list,显示档案的文件名与相关属性,-al 则表示列出所有的档案详细的权限与属性(包含隐藏文件,就是文件名第一个字符为.)
[wendy@cs010 ~]$ ls -al
total 352
drwxr-xr-x 17 wendy wendy 4096 Apr 22 14:47 .
drwxr-xr-x. 3 root root 4096 Mar 19 2019 ..
drwxrwxr-x 4 wendy wendy 4096 Feb 28 15:06 logs

drwxrwxr-x
//档案的类型与权限之内容:[档案类型][档案拥有者之权限][档案所属群组之权限][其他人之权限]。其中每三个分别代表[r可读][w可写][x可执行][-无权限]
//d第一个字符代表这个档案是【目录、档案或链接文件等等】。
//d:表示目录,-:表示档案,l:连结档(link file),b:表示装置文件里面的可供储存的接口设备(可随机存取装置);c:表示装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
//man ls 或info ls

//chgrp:改变文件所属群组
//chown:改变文件拥有者
//chmod:改变文件的权限,SUID,SGID,SBIT等等的特性

//改变所属群组,chgrp,[-R]表示进行递归(recursive)的持续变更,chgrp [-R] dirname/filename
chgrp users install.log //改变install.log的所属群组为users.
ls -l

//改变文件拥有者,chown,[-R]账号名称 文件或目录
//chown [-R] 账号名称:组名 文件或目录,[-R]表示进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更
chown bin install.log //改变install.log的拥有者为bin这个账号
ls -l

chown root:root install.log //将install.log的拥有者与群组改回为root.
ls -l

//chmod,改变权限,chmod [-R] xyz文件或目录,xyz:刚刚提到的数字类型的权限属性,为rwx属性数值的相加。-R:进行递归(recursive)的持续变更,亦即连同次目录下的所有档案都会变更
//权限的设定有2种,分别可以使用数字或者是符号来进行权限的变更:数字类型改变文件权限和符号类型改变档案权限

//数字类型改变文件权限、r:4 w:2 x:1,每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数则是:
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0

//符号类型改变文件权限,user、group、others三种身份,由u、g、o代表,a表示all。读写权限可写成r,w,x。
chmod 777 .bashrc
ls -al .bashrc

linux档案扩展名:

  • *.sh:脚本或批处理文件(scripts),因为批处理文件为使用shell写成的,所以扩展名就变成.sh;
  • *Z,*.tar,*.tar.gz,*.zip,*.tgz:经过打包的压缩文件;
  • *.html,*.hph:网页相关档案,分别代表HTML语法与PHP语法的网页档案。.html的档案可使用网页浏览器来直接开启,至于.php的档案,则可透过client端的浏览器来server端浏览,以得到运算后的网页。

linux档案长度限制:使用预设的Ext2/Ext3文件系统时,针对档案的档名长度限制。

  • 单一档案或目录的最大容许文件名为255个字符。
  • 包含完整路径名称及目录(/)之完整档名为4096个字符。

linux文件名的限制:

  • 避免使用特殊字符:* ? > < ; & ! [ ] | \ ' " ` ( ) { }。

  • ls: 列出目录

  • cd:切换目录

  • pwd:显示目前的目录

  • mkdir:创建一个新的目录

  • rmdir:删除一个空的目录

  • cp: 复制文件或目录

  • rm: 移除文件或目录

  • mv: 移动文件与目录,或修改文件与目录的名称

查看具体的指标,使用命令:man ls

10.1 目录相关的操作

//特殊目录
. 表示此层目录
..表示上一层目录

  • 表示【目前用户身份】所在的home目录
    ~表示 account这个用户的home目录(account是个账号名称)

//目录处理指令,cd 表示change directory,变换工作目录的指令
cd 表示变换目录,cd [相对路径或绝对路径]
pwd 表示显示当前目录
mkdir 表示建立新的目录
rmdir 表示删除空的目录

//pwd 显示目录所在的目录 pwd [-P] 表示显示出真正的完整路径,而非使用链接(link)路径。pwd:Print Working Directory
pwd //显示当前路径

//mkdir(建立新目录);mkdir [-mp] 目录名称 -m表示配置文件的权限,直接设定,-p 表示将你所需要的目录递归建立起来.mk:make directory。
mkdir test //建立一个名为test的新目录
mkdir -p test1/test2/test3/test4 //自行建立多层目录

//rmdir(删除空目录):rmdir -p 目录名称
rmdir test //直接删除,如果test内有内容,无法进行删除
rmdir -p test1/test2/test3/test4 //递归删除,如果任何一级内有内容,无法进行删除

//$PATH,PATH这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)隔开,每个目录是由顺序之分的。
PATH="$PATH":/root // 表示/root加入到执行文件搜索路径PATH中

10.2 文件与目录管理

//ls:文件与目录的检视
ls -al ~ //将home目录下的所有文件列出来(含属性与隐藏文件);-l表示长串显示数据内容; -a 表示将隐藏档也一起列出来的数据内容

//cp:复制文件或目录,建立快捷方式。cp [-adfilprsu] 来源文件(source) 目标文件(destination),eg:cp [options] source1 source2 source3…directory
cp ~/.bashrc /tmp/bashrc //home目录下的.bashrc复制到/tmp下,并更名为bashrc
cp -i ~/.bashrc /tmp/bashrc // -i表示覆盖
cp -a ~/.bashrc /tmp/bashrc // -a表示将文件所有的特性一起复制
PS:[cp复制行为会复制执行者的属性与权限],所以会涉及到chmod权限的修改。

//rm:删除文件或目录,rm [-fir] 文件或目录。fir:force[忽略不存在的档案,不会出现警告讯息]、互动模式、递归删除
rmdir /tmp/etc //mv:移动文件、目录或更名。mv [-fiu] source destionation。fiu:force[强制覆盖]、已经存在的文件,就会询问是否覆盖、若目标文件已经存在,且source比较新,才会更新(update)
//eg:mv [options] source1 source2 source3 …directory[目录]。 mv test001 test2 //移动test001到test002的内容
eg:
[wendy@cs010 hbase-1.4.12]$ basename /opt/wendy/local local //取得路径的文件名
[wendy@cs010 hbase-1.4.12]$ dirname /opt/wendy/local /opt/haishu //取得路径的目录名称

10.3 文件内容查询

//直接查看文件内容:cat,tac,nl

  • cat 由第一行开始显示文件内容
  • tac 从最后一行开始显示,可以看出tac是cat的倒着写
  • nl 显示的时候,顺道输出行号!

//直接查看文件内容:cat,tac,nl[concatenate,]
//cat[-AbEnTv]
选项不参数:
-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号,连同空白行也会有行号,不 -b的选项不同;
-T :将 [tab] 按键以 ^I 显示出杢;
-v :列出一些看不出来的特殊字符
eg:
test.txt文件内容如下:

wendy001
wendy002

wendy003

[wendy@cs010 logs]$ cat test.txt
wendy001
wendy002

wendy003
[wendy@cs010 logs]$ cat -n test.txt
1 wendy001
2 wendy002
3
4 wendy003
[wendy@cs010 logs]$ cat -b test.txt
1 wendy001
2 wendy002

 3  wendy003  

[wendy@cs010 logs]$ cat -A test.txt
wendy001$
wendy002$
$
wendy003$

//tac(反向列式)
[wendy@cs010 logs]$ tac test.txt
wendy003

wendy002
wendy001

//nl(添加行号打印),nl[-bnw]档案,-b指定行号,主要有两种;列出行号表示的方法,主要有三种
选项不参数:
-b :指定行号指定的方式,主要有两种:
-b a :表示不管是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己字段的最右方显示,且不加 0 ;
-n rz :行号在自己字段的最右方显示,且加 0 ;
-w :行号字段的占用的位数。

[wendy@cs010 logs]$ nl test.txt
1 wendy001
2 wendy002

 3  wendy003  

[wendy@cs010 logs]$ nl -b a test.txt //[-b a]类似cat -n,无论是否为空行,同样列出行号
1 wendy001
2 wendy002
3
4 wendy003

[wendy@cs010 logs]$ nl -b a -n rz test.txt //[-n rz]表示行号在自己字段的最右方显示,且加0
000001 wendy001
000002 wendy002
000003
000004 wendy003

[wendy@cs010 logs]$ nl -b a -n rz -w 3 test.txt //[-w]表示行号字段的占用的位数
001 wendy001
002 wendy002
003
004 wendy003

//可翻页查看:more less

  • more 一页一页的显示文件内容
  • less与more类似,但是比more更好的是,可以往前翻页

//more(一页一页翻动)
空格键 (space):代表向下翻一页;
Enter :代表向下翻『一行』;
/字符串 :代表在这个显示的内容中,向下搜寻『字符串』这个关键词;
:f :立刻显示出文件名以及目前显示的行数;
q :代表立刻离开 more ,不再显示该文件内容。
b 或 [ctrl]-b :代表往回翻页,不过这动作叧对文件有用,对管线无用。
eg:
[wendy@cs010 logs]$ more test.txt
wendy001
wendy002

wendy003
//less(一页一页翻动)
空格键 :向下翻动一页;
[pagedown]:向下翻动一页;
[pageup] :向上翻动一页;
/字符串 :向下搜寻『字符串』的功能;
?字符串 :向上搜寻『字符串』的功能;
n :重复前一个搜寻 (与 / 或 ? 有关!)
N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
q :离开 less 这个程序;

eg:
[wendy@cs010 logs]$ less test.txt
wendy001
wendy002

wendy003

//资料截取
head 只看头几行
tail 只看尾巴几行

//资料截取 head
eg:
[wendy@cs010 logs]$ head -n 2 test.txt
wendy001
wendy002
[wendy@cs010 logs]$ head test.txt
wendy001
wendy002

wendy003
[wendy@cs010 logs]$ tail -n 1 test.txt
wendy003
[wendy@cs010 logs]$ tail -f test.txt
wendy001
wendy002

wendy003

//非纯文本档
od 以二进制的方式读取文件内容!
//修改文件时间与建置新档
touch

//touch [-acdmt] 档案,选项与参数
-a :仅修订 access time;
-c :仅修改文件的时间,若该文件不存在则不建立新文件;
-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
-m :仅修改 mtime ;
-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYMMDDhhmm]

10.4 文件与目录的默认权限与隐藏权限

  • 文件预设权限:umask
  • 文件隐藏属性:chattr,lsattr
  • 文件特殊权限:SUID,SGID,SBIT,权限设定
  • 观察文件类型:file

//档案预设权限,umask:指定目前用户在建立文件或目录时候的权限默认值.比如:002 user、group并没有被拿掉任何权限,others的权限被拿掉了2(r:4,w:2,x:1)
[wendy@cs010 logs]$ umask -S
u=rwx,g=rwx,o=rx
[haishu@cs010 logs]$ umask
0002

eg:
//umask 为 003 ,所以拿掉的权限为wx,因此:
文件:(-rw-rw-rw-) - (--wx) = -rw-rw-r--
目录:(drwxrwxrwx) - (--wx) = drwxrwxr--

//隐藏文件属性chattr(配置文件隐藏属性),chattr [+-=][ASacdistu]文件或目录名称
选项与参数:

  • :增加某一个特殊参数,其他原本存在参数则不动。
  • :移除某一个特殊参数,其他原本存在参数则不动。
    = :设定一定,且仅有后面接的参数

a :设定a之后,这个档案将只能增加数据,而不能删除也不能修改数据,只有root
才能设定这个属性。
c :这个属性设定之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存。
i :一个文件不能被删除、改名、设定连结此属性。

//显示文件隐藏属性lsattr,lsattr [-adR] 文件或目录
选项与参数:
-a :将隐藏文件的属性进行显示;
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;
-R :连同子目录的数据也一并列出来

eg:
chattr +ajj test
lsattr test

档案特殊权限

SUID有这样的限制与功能:

  • SUID 权限仅对二进制程序(binary program)有效;
  • 执行者对于该程序需要具有 x 的可执行权限;
  • 本权限仅在执行该程序的过程中有效 (run-time);
  • 执行者将具有该程序拥有者 (owner) 的权限

Set GID

  • SGID 对二进制程序有用;
  • 程序执行者对亍该程序来说,需具备 x 的权限;
  • 执行者在执行的过程中将会获得该程序群组的支持!

//观察文件类型:file
file 目录名或文件 

10.5 指令与文件的搜索

  • 脚本文件名的搜索:which
  • 文件名的搜索:whereis,locate,find

//which(寻找执行档),-a 表示将所有由PATH目录中可以找到的指令均列出,而不止第一个被找到的指令名称
which ifconfig

//文件名的搜索,whereis [-bmsu] 文件或目录名
选项与参数:
-b :只找 binary 格式的文件
-m :只找在说明文件 manual 路径下的文件
-s :叧找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件
whereis ifconfig

eg:
[wendy@cs011 local]$ whereis ifconfig
ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[wendy@cs011 local]$ which ifconfig
/usr/sbin/ifconfig

11.1 认识EXT2 文件系统

文件系统特性

  • 磁盘分区后需要进行格式化,原因:操作系统设定的文件属性/权限不同,为了存放这些档案所需的数据,分区需要进行格式化,以适应文件系统格式。比如windows主要用的是FAT/NTFS,linux主要是Ext2.
  • 一个分区 格式化 一个文件系统

Ext2文件系统的内容

主要包含6部分:boot sector[启动扇区]、superblock、inode bitmap、block bitmap、inode table、data block。

  • boot sector:启动扇区,可以安装开机管理程序。
  • superblock:超级区块,记录此filesystem的整体信息,包括block/inode的总量、使用量、剩余量,以及文件系统的格式与相关信息等。
  • inode:记录文件的属性/权限等数据,其他重要项目为:每个inode大小均固定为128bytes,每个文件都仅会占用一个inode而已,因此文件系统能够建立的文件数量与inode的数量有关,每个inode基于一个block号码要花掉4bytes.
    • inode table(inode 表格):文件的存取模式(r/w/e),文件的拥有者与群组(owner/group),文件的容量,文件建立或状态改变的时间(ctime),最近一次读取的时间(atime),最近修改的时间)(mtime),定义文件特性的标识(flag),如SetUID,文件真正内容的指向(pointer)。
    • inode bitmap:inode对照表,记录使用与未使用的inode号码。
  • block:记录文件的实际数据,若文件太大时,会占用多个block。目录的block则在记录目录底下文件名与其inode号码的对照表。
    • data block:资料区块,用来放置文件内容数据地方,ext2系统支持的block大小有1K,2K,4K三种。在格式化时block的大小就固定了,且每个block都有编号,以方便inode的记录。
    • block bitmap:区块对照表,记录使用与未使用的block号码。删除数据时,block bitmap当中相对应到该block号码的标志修改为未使用中。
  • 日志式文件系统:多出一块记录区,随时记载文件系统的主要活动,可加快系统复原时间。

PS:inode table与data block称为数据存放区域,superblock、block bitmap、inode bitmap等区段称为metadata[中介资料]。

linux的正统文件系统为Ext2,Ext2文件系统的数据存取为“索引式”文件系统,该文件系统内的信息主要有:superblock、inode、block.每个inode与block都有编号,每个文件都会占用一个inode,inode内则有文件数据放置的block号码。ext2 文件系统示意图:

inode结构示意图:

inode/block资料存取示意图:数据存取的方式是“索引式”文件系统,文件系统格式化出inode与block的区块,假设某一个文件的属性与权限数据放在inode 4号,inode记录了文件数据放在2、7、13、15这4个block号码,就可以根据此来排列磁盘的阅读顺序,可以一口气将四个block内容读出来。

“索引式文件系统”数据存取如下:

“FAT文件系统”数据存取方式如下:文件的数据依序写入1 -> 7 -> 4 -> 15号这4个block号码中,但是文件系统没有办法一口气知道是个block号码。

目录:在ext2文件系统建立一个目录时,ext2会分配一个inode与至少一块block给该目录。

目录占用的block记录的数据示意图:

文件:ext2建立一个一般文件时,会分配一个inode与相对于该文件大小的block数量给该文件。

目录树的读取:透过挂载的信息可以找到挂载点的inode号码,此时能够得到根目录的inode内容,并已经该inode读取根目录的block内的文件名数据,在一层一层的往下读到正确的文件名。

11.2 文件系统的简单操作

磁盘与目录的容量:df,du

//磁盘的整体数据放在superblock区域中,但是每个个别文件的容量则在inode当中记载的。
//df:列出文件系统的整体磁盘使用量,df [-ahikHTm][目录或文件名]
-a:列出所有的文件系统,包括系统特有的/proc等文件系统
-k:以KBytes的容量显示各文件系统
-m:以MBytes的容量显示各文件系统
-i : 不使用硬盘容量,而以inode的数量来显示
-h: 以易读的方式进行显示
eg:
[wendy@cs011 ~]$ df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda2 2.3M 1.4M 912K 61% /
devtmpfs 2.0M 393 2.0M 1% /dev
tmpfs 2.0M 2 2.0M 1% /dev/shm
tmpfs 2.0M 638 2.0M 1% /run
tmpfs 2.0M 16 2.0M 1% /sys/fs/cgroup
/dev/vdb1 500M 1.9M 499M 1% /opt
tmpfs 2.0M 1 2.0M 1% /run/user/1000

//du:评估文件系统的磁盘使用量(常用在推估目录所占容量),du [-ahskm] 文件或目录名称
-a:列出所有的文件与目录容量,因为默认仅统计目录底下的文件数量。
-h:易读的方式进行显示
-s:列出总量,不列出各目录占用容量

eg:
[wendy@cs011 reading-system]$ du
1656736 ./log
1759460 .
[wendy@cs011 reading-system]$ du -h
1.6G ./log
1.7G .
[wendy@cs011 reading-system]$ du -s
1759460 .
[wendy@cs011 reading-system]$ du -sh
1.7G .

实体链接与符号链接:ln

linux底下的链接有种方式:一种是类似windows快捷方式功能,快速链接到文件或目录,另一种是透过文件系统的inode连结来产生新档名,这种称为实体链接。

  • Hard Link:实体链接,硬式连结或实际连结。每个文件都会占用一个inode,文件内容由inode的记录来指向。如果要读取该文件,先要经过目录记录的文件名来指向到正确的inode号码才能进行读取。

实体链接的文件读取示意图:不能跨文件系统,不能link目录。

  • symbolic Link:符号链接,快捷方式。

符号链接的文件读取示意图:

//ln [-sf] 来源文件 目标文件
-s:符号链接,默认是硬链接
-f:如果目标文件存在时,就主动的将目标文件直接移除后再建立 

11.3 磁盘的分割、格式化、检验与挂载

磁盘的使用必需要经过:分割、格式化与挂载,3个指令如下:fdisk -> mkfs -> mount。

磁盘分区:fdisk、partprobe.

//fdisk [-l] 装置名称
-l : 输出后面接的装置所有的分区内容。

磁盘格式化:mkfs、make2fs.

//mkfs [-t 文件系统格式] 装置文件名
-t:可以接文件系统格式,例如ext3,ext2,vfat等
mkfs -t ext3 /dev/hdc6 // 制作的/dec/hdc6格式化为ext3 文件系统

//mkfs[tab][tab],按下2个tab键,会发现mkfs支持的文件格式有很多,其中还可以格式化为vfat。

//mke2fs [-b block 大小][-i block 大小][-L 标头][-cj]装置
-b:可以设定每个block的大小,目前支持1024,2048,4096 bytes三种
-i: 多少容量给予一个inode呢
-c:检查磁盘错误
-L:后面可以接标头名称(Label)
-j: mke2fs是ext2,加上-j后,会主动加入journal而成为ext3.

磁盘检验:fsck、badblocks.

//fsck [-t 文件系统][-ACay] 装置名称 ,用来检验文件系统是否出错
-t:如同mkfs一样,需要指定文件系统
fsck [tab][tab] //系统有多少文件系统支持的fsck软件。

//badblocks -[svw] 装置名称,用来检查硬盘或软件扇区有没有坏轨的指令,可以通过[mke2fs -c 装置文件名 ]在进行格式化时处理磁盘表面的读取测试。
-s:在屏幕上列出进度
-v:可以在屏幕上看到进度
-w:使用写入的方式来测试。
badblocks -sv /dev/hdc6

磁盘挂载与卸除:mount、unmount.

挂载点 = 目录,而这个目录是进入磁盘分区的入口。挂载前确定点如下:

  • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中。
  • 单一目录不应该重复挂载多个文件系统。
  • 要作为挂载点的目录,理论上都是空目录。

文件系统挂载到我们的linux系统上,就要使用mount。

//mount -a
//mount [-l]
//mount [-t 文件系统][-L Label名][-o 额外选项][-n]装置文件名 挂载点
-a:按配置文件/etc/fstab的数据将所有未挂载的磁盘都进行挂载
-l:输入mount会显示目前挂载的信息。
-n:默认会将实际挂载的情况时实时写入/etc/mtab中。
mkdir /mnt/hdc6
mount /dev/hdc6 /mnt/hdc6
df

/etc/filesystem:系统指定的测试挂载文件系统类型
/proc/filesystems:linux系统已经加载的文件系统类型
mount -l //查看已挂载的文件,包含各文件系统的Label名称

// unmount [-fn] 装置文件名或挂载点 ,将装置文件卸除
-f:强制卸除!可用在类似网络文件系统(NFS)无法读取到的情况下
-n:不更新 /etc/mtab情况下卸除
eg:
unmount /dev/hdc6 //用装置文件名来卸除
unmount /media/cdrom //用挂载点来卸除
unmount /mnt/flash //因为挂载点比较好记忆
unmount /dev/df0 //用装置文件名
unmount /mnt/home //一定要用挂载点,挂载的是目录

磁盘参数修订:mknod、e2label、tune2fs、hdparm.

11.4 设定开机挂载

开机挂载:/etc/fstab、/etc/mtab

特殊装置loop挂载(映象档不刻录就挂载使用)

11.5 内存置换空间(swap)之建置

使用实体分区建置swap

//实体分区建置swap
//1、分割:先使用fdisk在你的磁盘中分割出一个分割槽给系统作为swap.
//2、格式化:利用建立swap格式的[mkswap 装置文件名]就能格式化该分割槽称为swap格式
//3、使用:启动swap装置启动,方法:swapon 装置文件名
//4、观察,free指令查看内存用量

eg:
fdisk /dev/hdc
partprobe //核心更新分区表
mkswap /dev/hdc7
free

使用文件建置swap

swap使用上的限制