linux
(一)磁盘结构
文件系统是创建在磁盘上,因此,想搞清楚文件系统首先要了解磁盘结构。
机械硬盘主要由磁盘盘面、主轴、磁头、传送轴组成
当存取数据时,主轴转动到指定位置,然后传送轴前后移动使磁头达到指定磁道上的指定扇区,然后读取数据。
机械硬盘转速一般都是7200r/min,高速旋转,所以避免晃动和磕碰磁盘。
下图为磁道扇区示意图。硬盘磁道密度非常高,通常一面有上千条磁道,但相邻磁道并不是紧挨着的,这是因为磁化单元相隔太近会相互影响。
扇区大小为512byte,是磁盘最小存储单位。
柱面:具有相同编号的磁道就是一个柱面
每个磁道上的扇区数目并不是相等的,如下图所示
位于磁盘表明的磁头上分别有一个读线圈和写线圈。磁盘在旋转,磁介质相对磁头做匀速运动,切割磁感线,从而在线圈中产生感应电流,根据磁盘表面剩磁状态的不同,线圈中产生不同方向的电流,对应着一个比特位0或1.
(二)磁盘分区
磁盘分区就是对一块磁盘进行人为的分割,分区信息写到MBR或者GPT中。每一个分区我们可以规划不同的扇区大小、不同的文件格式,甚至可以装不同的操作系统。
对磁盘分区是非常有必要的。一块磁盘,我们可以对他进行分区,各个分区我们可以使用不同的文件格式进行格式化。
分区的好处:
1只用一个分区,若遇到系统需要重装或者分区需要格式化等,原有的重要文件不能再本硬盘保存,而若提前进行合理分区,则用户数据不会受到影响。
2读取频繁的分区和其他分区分开,把磁盘损伤控制在一个集中的区域。
3分区后数据集中在某个磁柱区段,存取效率高
1 分区表
分区表主要有两种,MBR分区表和GPT分区表
1.1 MBR(Master Boot Record)
主引导记录MBR,存储在磁盘第一个扇区里面,它包含了开机管理程序和分区表,共512byte。其中446byte是开机管理程序,64byte是分区表。
该分区表是以磁柱为分区界限。即分区的最小单位为磁柱。
64byte分区表,每个分区使用16byte,即只能记录4个分区。如下所示
假设上面图中硬盘装置名为/dev/sda。则这四个分区分别是:
/dev/sda1、/dev/sda2、/dev/sda3、/dev/sda4
我们称这4个分区为主分区。
为了突破只能4个分区的限制,我们使用扩展分区,使用除第一个扇区之外的额外的扇区来记录分区信息,如下图所示
P1为主分区,
P2为扩展分区,扩展分区又分区出来5个分区槽,这5个由扩展分区继续切出来的分区槽我们称之为逻辑分区。上图分区槽在linux系统中的装置文件名分别是
P1:/dev/sda1
P2:/dev/sda2
L1:/dev/sda5
L2:/dev/sda6
L3:/dev/sda7
L4:/dev/sda8
L5:/dev/sda9
注意:扩展分区只能有一个。
总结:
1主分区与扩展分区最多只能有4个
2扩展分区只能有一个
3逻辑分区是由扩展分区持续切割出来的分区
4主分区和逻辑分区能够被格式化,扩展分区不能格式化
1.2 GPT(GUID partition table)
GPT将磁盘以LBA(Logical Block Address逻辑区块地址)来处理,每一个LBA为512byte。
GPT使用34个LBA区块来记录分区信息。
LBA0就对应着磁盘的第一个扇区,不过和MBR不同,LBA0中使用446byte存储开机管理程序,另外64byte存储特殊标志,用来表示此磁盘为GPT格式。
LAB1:存储GPT表头记录。
LBA2-LBA33:这些LBA每个都可以记录4个分区记录,所以总共可以有128个分区记录
2 lsblk查看分区
Name:设备名
MAJ:MIN:主要/次要设备代码。内核通过这个代码区分设备
TYPE:disk(磁盘),part(分区槽)
3 blkid
查看文件系统或设备的uuid
4 parted查看分区表类型、分区信息
Model:磁盘厂商/模块名称
Disk:磁盘总容量
Sector:扇区大小
Parted Table:分区表类型,msdos就是MBR
最下面是分区数据
Number 1表示/dev/sda1,文件系统类型为ext2
Number 2表示/dev/sda2
5 磁盘阵列RAID
RAID(Redundant Arrays of Inexpensive Disks)。RAID可以通过相关技术,把多个较小的磁盘整合成一个较大的磁盘
5.1 RAID 0
数据被切割成小片,均匀分布到各个小磁盘上。这种方式磁盘效率最高,但是只要有一块磁盘损坏,该文件将损坏
5.2 RAID 1
镜像模式
5.3 RAID 5
RAID 5可以理解为是RAID 0和RAID 1的折中方案。RAID5具有和RAID 0相近似的数据读取速度,只是多了一个奇偶校验信息,写入数据的速度比对单个磁盘进行写入操作稍慢。同时由于多个数据对应一个奇偶校验信息,RAID 5的磁盘空间利用率要比RAID 1高,存储成本相对较低,是运用较多的一种解决方案
(三)CMOS和BIOS
1 CMOS
MOS管(Metal Oxide Semiconductor金属氧化物半导体),分为P沟道MOS和N沟道MOS。
MOS集成电路特点:制造工艺比较简单、成品率较高、功耗低、组成的逻辑电路比较简单,集成度高、抗干扰能力强,特别适合于大规模集成电路。
CMOS(Complementary Metal Oxide Semiconductor互补金属氧化物半导体)。NMOS和PMOS两种管子组成的互补MOS电路,即CMOS电路,下图是CMOS反相器
除了CMOS反相器,还有CMOS与或非门电路。
CMOS具有功耗低、工作电压范围宽、抗干扰等特点。
在电脑主板上,CMOS的作用是一块可读写的RAM芯片,用于存储当前硬件配置以及操作人员的一些设置,由主板上的纽扣电池供电。
2 BIOS(Basic Input Output System)
基本I/O系统,是一组固化到主板上的程序,存储在ROM中。
当我们按启动按钮时,CPU通电,会主动执行BIOS程序。BIOS会依据使用者的设定取得能够开机的硬盘,然后到该硬盘的第一个扇区的MBR位置读取开机管理程序。此时BIOS使命结束,接下来是开机管理程序的工作了。接下来开机管理程序加载kernel文件,此时开机管理程序使命结束,接下来是kernel启动,也就是操作系统的启动。
(四)CPU周期和微指令
1 振荡周期、机器周期、指令周期
振荡周期:为CPU提供振荡源的周期。一般CPU外面会外接一个石英振荡电路,产生振荡脉冲。
状态周期:状态周期为振荡周期的二分频。
机器周期:也叫CPU周期。完成一个基本操作所需要的的时间称为机器周期。不同CPU的机器周期定义不同,比如80C51单片机规定一个机器周期包含6个状态周期,分别是S1,S2,S3,S4,S5,S6。为什么是6个状态周期呢?这完全是CPU设计的规定,51单片机规定一个机器周期就是6个状态周期。
指令周期:CPU执行一条指令所需要的的时间。一个指令周期通常含有1-4个机器周期。
2 微指令集
一个机器周期(CPU周期)对应一个机器指令(RISC精简指令集,对于CISC复杂指令集几个机器周期对应一个机器指令)。
一个状态周期对应一个微指令。
所有微指令的集合称为CPU的微指令集
CPU的微指令存储在CPU内部。
2.1 微指令的格式
一条微指令包含两部分:操作码和地址码
例如:某一微指令长度为32位,
00000010000001000000000100000110
操作码长度8位00000010表示减法操作,地址码长度也为8位,后面为3个地址码。
当CPU收到这个指令时,先取出它的前8位操作码,分析得知是减法操作,然后到内存地址00000100处取出被减数,到00000001处取出减数,送到ALU中进行减法运算,然后把结果送到00000110处。(注意,此处为了说明过程,描述上有先后顺序,其实微指令是在一个状态周期完成的,取指令,取操作数,写计算结果是同步完成的,因为cpu、内存都是硬件,他们之间都是使用布线连接,在一个节拍到达后,其硬件上都是高低电平,ALU本质上是由众多门电路组成的组合逻辑电路,输入的同时即得到输出,计算结果也是ALU输出管脚的高低电平,ALU输出管脚的高低电平瞬间到达内存地址00000110处,所以说微指令是原子性的)
3 机器指令的困难
我们和cpu打交道,需要使用机器指令,但是机器指令对于人类来说简直是天书,更别说纷繁复杂的IO设备了,而且写出来的机器指令不具备可移植性。
因此我们需要使用高阶语言(汇编,C)写人类能够理解的程序,经过编译,编译成机器指令供CPU执行,这就是操作系统。
(五)GNU
GNU(GNU`s Not Unix)。GNU是一个计划或者一个运动,它的目的是搭建一个类似Unix的操作系统,这个操作系统完全免费,可以自由流通。
在GNU计划下,开发出大量的操作系统软件,比如gcc和glibc等。但GNU缺少操作系统内核。
后来Linus开发出来了Linux系统。Linux只是一个系统内核,系统启动之后使用的仍然是gcc和bash等软件。
大家突然发现,这个Linux内核不正是GNU计划缺的么。于是合在一起打包发布叫GNU/Linux。然后大家念着念着省掉了前半部分,变成了Linux系统。实际上Centos,Redhat等Linux发行版中内核只占了很小的一部分容量。
(六)文件系统
一块新的磁盘我们首先以柱面为单位进行分区,分区完的磁盘还需要格式化才能被操作系统所识别,格式化的过程就是创建文件系统的过程。Linux基础的文件系统为Ext2系统。
Linux中所有数据都是以文件的形式呈现,所以整个linux系统最重要的地方就是这个目录树。
Linux系统使用的是目录树架构,但是我们的文件数据其实是放在磁盘分区槽当中的,文件系统与目录树的关系是通过挂载实现的。
目录树上不仅可以挂载本地文件系统,还可以挂载NFS。NFS可以使用购买的网络硬盘,也可以使用局域网上的其他机器上的目录。
1 挂载
所谓挂载就是利用一个目录当成进入点,将磁盘分区槽的数据放在该目录下,也就是说进入该目录就可以读取该分区槽的意思。
1.1 开机挂载
我们可以编辑这两个文件,实现开机挂载/etc/fstab /etc/mtab
1.2 loop挂载
普通挂载我们可以把块设备挂载到文件系统的目录中,loop挂载可以把归档文件挂载到文件系统的目录中。但是要注意的是,该归档文件必须是linux可以识别的文件系统,比如ios文件,它是CD上用的文件系统,linux是认识的,但是像jar,tar,zip这样的文件只是一种压缩格式,本身不是文件系统,即使通过loop mount挂载上去,直接访问它也读不出什么数据。
1.2.1 挂载iso文件
这个挂载没有成功,可能iso文件有误,后面再看原因
1.2.2 大文件loop挂载
当我们在安装系统进行分区时,我们只有一个根分区,后来我们想建立另外一个分区,但是已经没有多余的容量进行额外的分区了,这时我们可以制作一个大文件,然后将这个文件挂载,感觉上我们又多了一个分区槽。
使用dd命令创建大文件
挂载
2 文件种类
1 文本文件
2 二进制文件
linux当中的可执行文件(sh除外),比如cat、date这些命令文件。
3 目录文件
4 链接
5 设备文件
与系统周边及存储等相关的文件,通常放在/dev目录下
3 文件系统的inode、block、superblock
标准的Linux文件系统Ext2,是一种索引式的文件系统,包含了superblock,inode和block。
superblock:记录文件系统的整体信息,包括inode/block总量、使用量、剩余量,以及文件系统格式与相关信息。
inode:记录文件的属性,一个文件占用一个inode
block:实际记录文件的内容,若文件太大,会占用多个block
文件系统最前面的Boot Sector是启动扇区,这个启动扇区可以安装开机管理程序,这种方式可以使我们将不同的开机管理程序安装到不同文件系统最前面,而不用覆盖整个磁盘唯一的MBR。
3.1 datablock
datablock是用来放数据的地方,一般block大小设置为4K。格式化时,block大小就固定了,且每个block都有编号,以方便inode记录。
block的大小和编号在格式化后就不能再改变了
每个block最多只能放置1个文件的数据
如果文件数据大于block大小,则一个文件会占用多个block
3.2 inode
inode记录的内容包括:
文件拥有者和群组
文件大小
文件创建时间ctime
文件最近一次读取时间atime
文件最近一次修改时间mtime
文件权限,rwx,SUID,SGID,SBIT
指向datablock的指针
inode的特点:
每个inode大小为128byte
每个文件占用1个inode
3.3 superblock
superblock是记录整个filesystem相关信息的地方,包括
block与inode总量
未使用与已使用的block/inode
block与inode大小
filesystem挂载时间
superblock大小为1024byte
3.4 block bitmap和inode bitmap
block bitmap记录了所有block是否被使用的情况
inode bitmap记录了所有inode是否被使用的情况
3.5 文件存取过程
假设我们要新增一个文件,文件系统的操作步骤是:
1先确定用户对当前目录是否有w与x权限,有才能新增
2根据inode bitmap找到没有使用的inode号码,并将新文件的权限/属性写入这个inode
3根据block bitmap找到没有使用的block号码,并将实际的数据写入block中,且更新inode所在block指向保存数据的block
4将刚刚写入的inode与block数据同步到inode bitmap和block bitmap,并更新superblock
缺点:以上步骤如果中间突然出现断电的情况,将会出现数据不一致的情况。
3.6 日志式文件系统
为了解决ext2存在可能会发生的数据不一致性的情况,ext2的升级版ext3/4支持日志。
日志式文件系统会单独分出来一些磁盘容量记录日志,当系统要写入一个文件时,会先在日志记录区块中记录某个文件准备要写入的信息;写入数据;完成写入数据后在日志记录区块中完成该文件的记录。
3.7 文件系统是异步的
当系统加载一个文件到内存后,如果该文件没有被修改过,则设定内存区段的文件为clean。但是当内存中的文件被修改,则设定内存区段的文件为Dirty。系统会不定时的刷脏到硬盘(sync命令)。
4 文件系统容量
4.1 df
列出文件系统的整体磁盘使用量
-h人类易于阅读的格式显示
-T文件系统类型
-a所有,包括基于内存的文件系统,并不占用磁盘
-i以inode数量来显示
单独目录文件系统使用情况
4.2 du
du -h 列出目录大小
du -ah 列出目录和文件的大小
du –sh 列出某一目录下的文件和目录的大小,包括子目录
5 链接
5.1 硬链接
创建一个硬链接
[root@localhost ~]# ln /etc/crontab .
查看他们的inode编号
我们发现,他们的inode编号一样。因为一个文件对应一个inode,所以这两个是同一个文件。
如果/etc/crontab删除,读取/root/crontab不受影响
在inode区块中,1是/root的inode编号,2是/etc的inode编号,在两者的block中存储了crontab的inode编号为663660,这个inode编号指向crontab文件的实际block。
5.2 软链接
创建软链接
[root@localhost ~]# ln -s /etc/crontab crontab2
查看他们的inode编号
软链接就是创建一个独立的文件crontab2,而这个文件访问实际上是访问的crontab
如果crontab删除,我们再读取crontab2时会报错。
(七)壳程序
我们都是通过程序和操作系统沟通,比如我们linux启动之后默认的bash界面,就是一个供用户和内核交互的程序,这就是大名鼎鼎的bash。这是一种壳程序。
刚开始登录时的bash进程
再启动两个bash,然后查看进程
我们可以看到进程ID 7035创建了7308,然后7308又创建了7317.
Exit用于退出bash程序
1 有多少shells
/etc/shells文件中列出来了操作系统支持的常规shell程序
[root@localhost ~]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash [root@localhost ~]#
从这里我们可知,系统中支持两种shell,默认的bash和sh(其实sh是bash的软链接,严格来说只是一个东西,都是bash)
2 /sbin/nologin特殊的shell
当我们查看/etc/passwd时,我们会发现有很多特殊的shell
这种配置的用户,表示这个用户不能使用/bin/bash和/bin/sh来登录系统。但是该用户可以使用特定的系统资源。比如打印作业由lp这个账号管理,www服务由apache这个账户管理,他们都可以进行系统程序的工作,但是他们无法使用bash和sh登录
3 bash内建命令
Bash内建命令是指bash自身提供的命令,而不是bash外其他程序提供的命令。
因为我们登陆系统之后,会默认给我们一个bash程序和内核交互,bash内建命令相当于直接调用bash的一个内置函数,当然速度会快。而非内建命令执行时会触发磁盘I/O,还需fork出一个单独的进程来执行,执行完后再退出。
我们使用type查看命令属性。
比如上图,cd是内建命令,java不是。
我们查看ls,会发现,默认执行的ls是ls --color=auto的别名。显示会有颜色区分
而/usr/bin/ls显示没有颜色区分。
4 bash中的变量
我们在bash中,可以定义变量
并且我们可以将该变量变为环境变量,使用export aaa
5 shell脚本
shell脚本就是使用shell的功能写的程序,这个程序将一些shell语法或指令写在里面。而且这个程序可以使用sh或bash执行。
shell脚本并不强求以.sh结尾,但是大家习惯这样写。
除了sh或者bash可以执行shell脚本,source程序也可以执行shell脚本。比如我们使用source /etc/bashrc导入环境变量,其实/etc/bashrc就是shell脚本,我们使用source程序执行这个脚本。
sh或bash执行和source执行脚本的异同:
sh xxx.sh
source xxx.sh
也就是说,source程序执行shell脚本会在当前shell中执行这些脚本。这也是为什么我们使用source来使环境变量生效。
./方式执行shell脚本
./需要执行权限,使用脚本文件中第一行#!指定的shell(解释器)来执行命令(譬如常见的/bin/bash),不指定系统会调用默认shell程序。sh不需要执行权限,是使用sh这个shell执行命令,是个软链接,它可能是一个任意的shell,通常默认是bash
(八)环境变量
上面我们介绍了bash这个程序,并且知道bash中可以定义变量。其中环境变量也数据bash中的变量。本质上普通变量和环境变量没有区别,之所以叫环境变量,是因为我们对这些变量有一些特殊操作:在开启一个新的bash时会定义和加载一次环境变量。
1 env和export
env和export命令会列出系统中所有的环境变量
2 set
set命令可以查看所有变量,包括环境变量和用户自定义变量
3 export
export作用是自定义变量转成环境变量
如果我们自定义的变量,我们希望它能在子进程中使用,我们必须使用[export 变量名]方式把它变为一个环境变量,它才能在子进程中被使用。
export导出的环境变量只能在本bash中使用,如果退出bash,则环境变量失效
4 环境变量配置文件
为什么我们一进入bash,我们就会得到一堆环境变量呢?原因是系统中有一些环境变量配置文件,当我们进入bash时,首先会加载这些配置文件中的环境变量。
要注意的是,我们使用export导出的环境变量,在退出bash后会失效,如果我们希望保留这些配置的话,一定要写入环境变量配置文件才行。
环境变量配置文件主要有两类:
/etc/profile,全局配置文件
~/.bash_profile或~/.bash_login或~/.profile,个人配置文件
5 source
该命令用于读入环境变量配置文件。
比如我修改了~/.bashrc,不需要注销,立即执行source ~/.bashrc就可以将刚刚最新设置的内容读进当前的bash中。
6 一些比较重要的环境变量
$
$也是一个变量,表示当前bash的进程ID,我们使用echo $$查看
$?
?也是一个环境变量,其含义是上一个指令执行的结果,成功0,失败非0
$PATH
PATH变量中定义的命令,我们可以在任何路径下执行。
比如ls命令
。
(九)系统语义环境locale
1 locale –a
查看系统支持多少语系
2 locale
查看当前语系环境
上面列出的这些编码,我们可以逐一设置,都可以修改。
当只设置LANG和LC_ALL时,其他变量会默认使用这两个变量。LANG表示主语言环境,LC_ALL表示整体语系环境。
这些语系环境变量在/etc/locale.conf中定义
3 临时改变语系环境
当我们在window下拷贝一个文件到linux时,由于编码可能不同,可能会造成乱码,如果我们想查看文件内容,又不想改变系统的环境变量,我们可以在本bash中临时改变语系环境
(十)文件权限
1 类型和权限
dr-xr-x---.
第一位:
d(目录)
l(链接)
b(设备文件里可供存储的接口设备)
c(设备文件串行端口设备,如键盘鼠标)
brw-rw----. 1 root disk 8, 0 Jul 31 11:25 sda brw-rw----. 1 root disk 8, 1 Jul 31 11:25 sda1 brw-rw----. 1 root disk 8, 2 Jul 31 11:25 sda2 crw-rw-rw-. 1 root tty 5, 0 Jul 31 11:25 tty crw--w----. 1 root tty 4, 0 Jul 31 11:25 tty0 crw--w----. 1 root tty 4, 1 Jul 31 16:40 tty1 crw--w----. 1 root tty 4, 10 Jul 31 11:25 tty10
文件或目录权限的含义
文件:
r:可读取此文件的内容
w:可以编辑文件内容
x:该文件具有可被系统执行的权限
目录:
目录主要存储文件名列表
r:表示具有读取目录结构列表的权限,比如我们可以用ls这个命令将该目录的内容列出来
w:表示具有异动该目录结构列表的权限,比如建立新文件、删除目录下的文件、修改目录下文件名、移动目录下文件的位置
x:表示具有进入该目录成为工作目录的的权限,比如使用cd命令进入该目录成为工作目录。
2 修改权限
修改群组: chgrp
修改所有者: chown
修改权限: chmod
chmod 770 aaa
chmod +x aaa
u(user),g(group),o(other),a(all)
chmod u=rwx,go=rx .bashrc
chmod a-x .bashrc
3 文件默认权限umask
[root@localhost ~]# umask 0022 [root@localhost ~]# umask -S u=rwx,g=rx,o=rx [root@localhost ~]#
对于root用户来说,umask默认是0022,第一位表示特殊权限,后三位表示user,group,other的权限,但是要注意的是umask是默认要拿掉的权限。即我们创建一个目录时,默认拿掉022权限,也就是创建后的目录权限为user=rwx,group=rx,other=rx,w被拿掉了。(2对应的二进制010,即rwx=010,即剔除w权限)
3.1 修改默认权限
[root@localhost ~]# umask 002 [root@localhost ~]# touch test1 [root@localhost ~]# mkdir test2 [root@localhost ~]# ll -d test[12] -rw-rw-r--. 1 root root 0 Aug 1 09:26 test1 drwxrwxr-x. 2 root root 4096 Aug 1 09:26 test2 [root@localhost ~]#
4 文件隐藏属性
4.1 chattr配置文件隐藏属性
+新增属性,-移除属性,=设定属性
[root@localhost tmp]# chattr +i attrtest [root@localhost tmp]# rm attrtest rm: remove regular empty file ‘attrtest’? y rm: cannot remove ‘attrtest’: Operation not permitted [root@localhost tmp]#
i属性表示文件不能被删除、改名、设定链接、修改。
4.2 lsattr显示隐藏属性
5 特殊权限SUID,SGID,SBIT
5.1 SUID(Set UID)
/usr/bin/passwd就具有SUID权限。
SUID权限可以让执行者在执行期间拥有root权限。
比如一个普通用户,可以执行passwd修改自己的密码,执行该命令后,密码保存在/etc/shadow这个文件中。所有用户的密码都保存在这个文件中。我们查看一下这个文件的权限
这个文件只有root用户能够修改。
所以一个普通用户修改其自身密码的过程是:
1执行passwd,该命令有SUID权限,所以普通用户执行命令期间权限提升为root
2修改/etc/shadow
3普通用户root权限撤销。
5.2 SGID(Set GID)
执行者在执行过程中将会获得该程序群组的支持
5.3 SBIT(Sticky Bit)
(十一)FHS-Linux目录
Filesystem Hierarchy Standard (FHS)
/bin:系统有很多放置执行文件的目录,但/bin 比较特殊。因为/bin 放置的是在单人维护模式下还能够被操作的指令。在/bin底下的指令可以被 root与一般账号所使用,主要有: cat, chmod, chown, date, mv, mkdir,cp, bash 等等常用的指令。
/boot:这个目录主要在放置开机会使用到的文件,包括 Linux 核心文件以及开机选单与开机所需配置文件等等。 Linux kernel 常用的档名为:vmlinuz,如果使用的是 grub2 这个开机管理程序, 则还会存在/boot/grub2/这个目录喔。
/dev:在 Linux 系统上,任何装置与接口设备都是以文件的型态存在于这个目录当中的。 你只要透过存取这个目录底下的某个文件,就等于存取某个装置啰~ 比要重要的文件有/dev/null, /dev/zero, /dev/tty,/dev/loop*, /dev/sd*等等。
/etc:系统主要的配置文件几乎都放置在这个目录内,例如人员的账号密码文件、 各种服务的启始档等等。一般来说,这个目录下的各文件属性是可以让一般使用者查阅的, 但是只有 root 有权力修改。FHS建议不要放置可执行文件(binary)在这个目录中喔。比较重要的文件有:/etc/modprobe.d/, /etc/passwd,/etc/fstab, /etc/issue 等等。。
/mnt:如果妳想要暂时挂载某些额外的装置,一般建议妳可以放置到这个目录中。 在古早时候,这个目录的用途与/media 相同啦!只是有了/media 之后,这个目录就用来暂时挂载用了。
/opt:这个是给第三方协力软件放置的目录。什么是第三方协力软件啊? 举例来说,KDE 这个桌面管理系统是一个独立的计划,不过他可以安装到 Linux 系统中,因此 KDE 的软件就建议放置到此目录下了。 另外,如果妳想要自行安装额外的软件(非原本的 distribution 提供的),那么也能够将你的软件安装到这里来。 不过,以前的 Linux 系统中,我们还是习惯放置在/usr/local 目录下呢。
/run:早期的 FHS 规定系统开机后所产生的各项信息应该要放置到 /var/run 目录下,新版的 FHS 则规范到/run 底下。 由于 /run 可以使用内存来仿真,因此效能上会好很多。
/sbin:Linux 有非常多指令是用来设定系统环境的,这些指令只有 root 才能够利用来『设定』系统,其他用户最多只能用来『查询』而已。放在/sbin 底下的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。 至于某些服务器软件程序,一般则放置到/usr/sbin/当中。至于本机自行安装的软件所产生的系统执行文件(system binary),则放置到/usr/local/sbin/当中了。常见的指令包括: fdisk, fsck,ifconfig, mkfs 等等。
/home:家目录。
/root:系统管理员(root)的家目录。之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时, 该目录就能够拥有 root 的家目录,所以我们会希望 root 的家目录与根目录放置在同一个分区槽中。
/proc:这个目录本身是一个『虚拟文件系统(virtual filesystem)』喔!他放置的数据都是在内存当中, 例如系统核心、行程信息(process)、周边装置的状态及网络状态等等。因为这个目录下的数据都是在内存当中, 所以本身不占任何硬盘空间啊!比较重要的文件例如:/proc/cpuinfo, /proc/dma, /proc/interrupts,/proc/ioports, /proc/net/* 等等。
/usr/bin:所有一般用户能够使用的指令都放在这里!目前新的 CentOS 7 已经将全部的用户指令放置于此,而使用连结档的方式将 /bin 连结至此! 也就是说, /usr/bin 与 /bin 是一模一样了!另外,FHS要求在此目录下不应该有子目录!。
/usr/lib:基本上,与 /lib 功能相同,所以 /lib 就是链接到此目录中的!。
/usr/local:系统管理员在本机自行安装自己下载的软件(非 distribution 默认提供者),建议安装到此目录, 这样会比较便于管理。举例来说,你的 distribution 提供的软件较旧,你想安装较新的软件但又不想移除旧版, 此时你可以将新版软件安装于/usr/local/目录下,可与原先的旧版软件有分别啦! 你可以自行到/usr/local 去看看,该目录下也是具有 bin, etc, include, lib...的次目录喔!
/usr/sbin:非系统正常运作所需要的系统指令。最常见的就是某些网络服务器软件的服务指令(daemon)啰!不过基本功能与 /sbin 也差不多, 因此目前 /sbin 就是链接到此目录中的
/var/lib:程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。 举例来说,MySQL 的数据库放置到/var/lib/mysql/而 rpm 的数据库则放到/var/lib/rpm 去!
/var/log:重要到不行!这是登录文件放置的目录!里面比较重要的文件如/var/log/messages, /var/log/wtmp(记录登入者的信息)等!
/var/run:某些程序或者是服务启动后,会将他们的 PID 放置在这个目录下喔!至于 PID 的意义我们会在后续章节提到的。 与 /run 相同,这个目录链接到 /run 去了!
(十二)数据流重导向
标准输入:stdin,代码0,符号<
标准输出:stdout,代码1,符号>
标准错误输出:stderr,代码2,符号2>
默认情况下,标准输出和标准错误输出都是屏幕。但是我们可以使用>或2>输出到文件。
注意:>表示覆盖方式输出,>>表示累加方式输出
(十三)管道
比如ls /etc | less
表示ls /etc本来要输出到屏幕,但是通过管道命令,ls的结果被less接收,而不是输出到屏幕。
(十四)账号管理
1 /etc/passwd
每一行是一个账号,除了root账号外,还有一些系统账号,如bin、daemon。
每一行用:分割,共7个部分,分别是
[账户名称:密码:UID:GID:说明:home目录:shell]
2 /etc/shadow
每一行是一个账号
每一行用:分割,共9个字段,分别是
[账号名称:密码:最近修改密码日期:密码不可修改天数:密码需要修改天数:密码变更前告警天数:密码过期后账号宽限天数:账号失效日期:保留]
3 /etc/group
[组名:组密码:GID:此群组支持的账号名称]
4 su
su用于身份切换
su root和su - root区别
su root方式切换root账号,读取环境变量的方式是使用non-login shell,这种方式登录后,只会读取~/.bashrc这个文件,并把这个文件中的shell脚本执行一遍,这样这个文件中的变量就加载到系统中,成为环境变量。
因为non-login shell只会读取这一个文件,所以,其他配置文件中的变量不会加载进来,也就是说,通过su root方式切换root账户,很多环境变量还是上一个普通用户的环境变量。比如下图:
su - root切换root账号,读取环境变量的方式是使用login shell,也就是使用完整登录bash的方式读取配置文件,会重新加载一遍环境变量
5 sudo
当我们使用普通账号,但是我们希望不切换到root账户,也能够以root身份执行某一指令,这种情况下我们可以使用sudo。
若想让普通用户具有sudo权限,首先必须root给这个普通用户授权才行,授权方式就是编辑/etc/sudoers这个文件。
以sshd的身份在/tmp下创建一个名为mysshd的文件
注意,因为我们没法切换到sshd用户下面执行命令,我们使用以上方式则可以创建具有sshd权限的文件,有时这种方式很有用哦
以admin的身份创建~admin/www/index.html,并向其中写入内容
此处使用了sh -c "脚本"的方式执行shell脚本
一般我们不使用vi /etc/sudoers方式修改sudoers文件,而是使用visudo命令
下面是编辑页面
我们可以修改使普通用户可以执行任何命令,或者使某个群组可以执行任何命令(默认是wheel组)
我么还可以设定普通用户只能替root执行某一命令
比如,上图,注释去掉,我们可以设定单个用户或者群组只具有执行某一命令的权限。
6 tty
linux默认为我们提供了6个终端,分别是tty1-tty6。使用ctrl+alt+F[1-6]切换不同终端
pts是远程登录终端(比如ssh登录的终端)
使用who查看在线用户并且可以显示登录终端
7 w,who查询在线用户
8 ulimit限额管理
ulimit可以控制用户可以使用的系统资源大小(磁盘空间、CPU时间、内存限额等等)
ulimit -a列出当前账户的所有限额
ulimit -f设置可以创建的最大文件
ulimit -u设置最大进程数
ulimit -l设置最大内存
9 screen
Screen是Linux下的一款远程会话管理工具,可以在多个进程之间多路复用一个物理终端的全屏窗口管理器
1 screen 所有的命令参数
[root@xxx ~]# screen --help Use: screen [-opts] [cmd [args]] or: screen -r [host.tty] Options: -4 Resolve hostnames only to IPv4 addresses. -6 Resolve hostnames only to IPv6 addresses. -a Force all capabilities into each window's termcap. -A -[r|R] Adapt all windows to the new display width & height. -c file Read configuration file instead of '.screenrc'. -d (-r) Detach the elsewhere running screen (and reattach here). -dmS name Start as daemon: Screen session in detached mode. -D (-r) Detach and logout remote (and reattach here). -D -RR Do whatever is needed to get a screen session. -e xy Change command characters. -f Flow control on, -fn = off, -fa = auto. -h lines Set the size of the scrollback history buffer. -i Interrupt output sooner when flow control is on. -l Login mode on (update /var/run/utmp), -ln = off. -ls [match] or -list Do nothing, just list our SockDir [on possible matches]. -L Turn on output logging. -m ignore $STY variable, do create a new screen session. -O Choose optimal output rather than exact vt100 emulation. -p window Preselect the named window if it exists. -q Quiet startup. Exits with non-zero return code if unsuccessful. -Q Commands will send the response to the stdout of the querying process. -r [session] Reattach to a detached screen process. -R Reattach if possible, otherwise start a new session. -s shell Shell to execute rather than $SHELL. -S sockname Name this session <pid>.sockname instead of <pid>.<tty>.<host>. -t title Set title. (window's name). -T term Use term as $TERM for windows, rather than "screen". -U Tell screen to use UTF-8 encoding. -v Print "Screen version 4.01.00devel (GNU) 2-May-06". -wipe [match] Do nothing, just clean up SockDir [on possible matches]. -x Attach to a not detached screen. (Multi display mode). -X Execute <cmd> as a screen command in the specified session.
2 查看session会话列表
[root@16s1 ~]# screen -list There are screens on: 29614.szj (Detached) 29436.pts-1.16s1 (Detached) 2 Sockets in /var/run/screen/S-root.
3 创建一个session会话
[root@xxx~]# screen
或者
[root@xxx~]# screen -S szj
两者的区别是,带-S参数时,会指定会话的名字,而不是用默认名字
4 登陆会话
[root@16s1 ~]# screen -r szj
[root@16s1 ~]# screen -x szj
两者的区别是,-r登陆一个detached的会话,-x登陆一个会话(不论该会话是attached的还是detached的)
5 踢下已登陆的会话
[root@16s1 ~]# screen -d szj [29614.szj detached.]
该命令将会把其他用户或者其他bash中登陆的会话强行终止。
6 退出当前会话
ctrl+a+d
7 关闭一个会话
登陆会话状态下,执行exit命令(和退出bash的命令一样)
或者screen -S szj -X quit
(十五)系统日志/var/log
1 /var/log/messages
包含整体系统信息,包括系统启动日志、mail、cron等。
2 /var/log/secure
和登录有关的信息可以在此处查看。
(十六)进程管理
1 top
第三行,按数字1切换不同CPU查看
第四五行为内存使用情况。
按M根据%MEM排序,按P则根据%CPU排序
VIRT:进程创建时申请的内存,代码段+数据段+引用的库
RES:resident,常驻内存。进程当前所使用的内存,包括进程自己的内存和共享库内存
SHR:shared,共享的内存
计算某个进程所占的物理内存大小公式:RES – SHR
按f可编辑显示列,上下箭头键移动,空格键选中,esc退出编辑
2 free观察内存使用情况
后面跟参数-b/k/m分别表示以byte/kb/mb显示
total表示总内存,used表示已使用,free表示剩余,buff/cache表示已缓存,available表示可用内存
为了提升速度,内存更倾向于被用尽,所以之前读取过的内容放到buff/cache中。
当新进程需要内存时,如果free不够,则buff/cache将会释放部分内存供新进程使用,这也是为什么available>free的原因
total=uesd+free+buff/cache,比如下面:1019797504=473788416+169934848+376074240
3 netstat查看网络状态
netstat用于查看网络状态、路由表、网卡信息等内容
直接执行netstat,会打印出两部分内容
Active Internet connections-活动网络连接
Proto:协议类型
Receive-Q:接收队列,一般是0,如果非0则表示网络IO忙,有数据未接收完。
Send-Q:发送队列,一般是0
Local Address:本地地址和端口
Foreign Address:外部地址和端口
State:状态
Active UNIX domain sockets-活动Unix域套接字
Proto:协议类型
RefCnt:连接到套接字上的进程号
Type:显示套接字类型
State:状态
I-node:节点
Path:连接到套接字的进程路径名
netstat -at:列出所有tcp端口
netstat -au:列出所有udp端口
netstat -l:显示所有监听端口
netstat -lt:显示所有tcp监听端口
netstat -s:显示统计信息
netstat -anp:显示所有,只显示ip不显示域名,显示pid和进程名字
netstat -rn:显示路由表
netstat -i:显示网卡信息
4 /proc/*
内存中的数据都会写入这个路径下面
目录对应进程ID,表示该进程在内存中的数据
文件对应整个Linux系统参数
5 jobs
jobs查看背景中的任务
ctrl+z 将当前任务放到背景中并暂停
fg 背景中的任务拿到前景
bg %3,使背景中的任务3在背景下运行
(十七)系统服务
1 systemctl管理系统服务
systemctl status mysqld
systemctl start mysqld
systemctl stop mysqld
systemctl enable mysqld设置开机启动
systemctl disable mysqld关闭开机启动
(十八)函数库
函数库是指各个软件调用的函数存储的地方。分为动态函数库和静态函数库
1 静态函数库
静态库扩展名一般为.a,编译的时候会直接整合到执行程序之中,所以静态函数库编译的文件会比较大。但是独立性比较好。
2 动态函数库
动态库扩展名为.so,一般存储在/lib和/lib64中。程序引用动态函数库时,只是引用了一个链接,真正执行的时候调用的是/lib或/lib64下的程序。所以使用动态函数库编译的程序会小很多。
linux各个发行版本倾向于使用动态库。
3 把动态库载入内存
有时候为了提高程序执行速度,需要将部分动态库放到内存中。
编辑/etc/ld.so.conf配置文件把需要放入内存中的动态库路径配置进去
比如当我们安装了mysql,mysql相关的动态库将会配置到这里面。
执行ldconfig把/etc/ld.so.conf配置加载到内存
4 ldd 解析动态库依赖
如果我们想知道某安装程序使用了哪些动态库,可以使用ldd指令
(十九)源码安装和rpm、yum安装
1 源码安装
一般软件源码会以tar.gz的方式提供给我们。以nginx为例
我们下载了nginx的tar.gz,解压之后,会有个configure可执行文件。这个文件里面是一些shell脚本,用于侦测Linux系统环境,生成makefile文件。
我们执行./configure,会生成makefile文件。该makefile文件中定义了编译步骤
执行make clean,会清理当前目录下的目标文件(源码可能被编译过,之前编译过生成的目标文件需要先清除一下)
执行make,会根据makefile的步骤进行编译,生成目标文件。然后进行链接,生成可执行文件,该可执行文件在当前目录下
执行make install,会把上一步生成的可执行文件拷贝到预设的安装路径下面。至此安装完毕
2 rpm
rpm安装
上面介绍的是源码安装,rpm安装方式则是二进制安装。
当一个软件发布的时候,一般软件提供商会依据不同的操作系统平台预先编译好,放到一个.rpm文件中,该文件携带一个依赖列表和已编译好的文件。
当我们使用rpm安装时,首先会检查这个依赖列表,和当前Linux系统对比,看是否已经存在这些依赖,如果存在则拷贝已编译好的文件到当前Linux系统,如果不存在这些依赖,则停止。
具体rpm命令举例
假设我们要安装rp-pppoe-3.11-5.el7.x86_64.rpm,并且已经有该软件的光盘,则首先我们将光盘挂载到文件系统,比如挂载到/mnt下面。
测试此软件是否有相依性:rpm -ivh /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm --test
然后执行命令安装
rpm -ivh /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm //i表示install,v表示显示安装细节,h表示显示安装进度
安装完成后,会把安装信息写到/var/lib/rpm/这个目录下的数据库文件中,以便用于日后的依赖查询、更新和卸载。
卸载光盘umount
rpm查询
查询已安装软件:rpm -qa
查询某个软件是否安装:rpm -q 软件名
列出某个软件的information
列出某软件的配置文件
列出某命令是哪个软件提供的
由于rpm文件常常会安装/更新/卸载,某些动作可能会导致RPM数据库/var/lib/rpm/内的文件破损,所以有时可以重建一下数据库
3 yum
上述rpm安装方式,有一个缺点,就是软件依赖问题。yum可以解决这个问题。
首先,目前yum有很多yum服务器(yum源),这些服务器上存放了所有的已编译好的软件。当我们使用yum安装的时候,首先读取.rpm文件中的软件依赖,然后到/var/lib/rpm/数据库中查询是否已经安装这个依赖,如果未安装,则自动去yum源下载并安装此依赖。
yum配置信息都在/etc/yum.repos.d/路径下,该路径下存放了repo文件,是软件的配置文件。每一个.repo文件对应一个软件的配置细节,比如文件从哪里下载。
该路径下的.repo文件都是已经安装过的软件的配置文件,如果某一个配置文件出现在这,说明对应的软件已经安装过。
yum list |less,列出yum服务器上提供的所有软件名称,输出结果分两部分:已安装软件和可安装软件,如下图
yum list pam* 列出pam开头的软件
检查是否有更新
yum check-update
yum install 安装某一软件
yum remove 卸载某一软件
yum安装过程中的依赖缓存路径:/var/cache/yum/x86_64/7/。当由于网络问题,某一软件下载不下来导致安装失败时,我们可以在别处拷贝下载失败的依赖到该路径下,重新yum安装即可。