《鸟哥的LINUX私房菜_基础学习篇》笔记
现在有在线阅读版本了
计算机概论
计算机五大单元
主要分为三部分:输入单元、中央处理器(CPU)、输出单元
五大单元:输入单元、输出单元、CPU内部的控制单元、算术逻辑单元、内存。
CPU
种类
我们所使用的软件都要经过CPU内部的微指令集来完成才行。
指令集的设计分为两种设计理念,即两种主要的CPU种类:
- 精简指令集RISC
- 每个指令执行时间短,性能较佳,但要做复杂的事情需要多个指令完成。
- 常见CPU公司:Sun的SPARC系列,IBM的Power Architecture系列和ARM系列
- 常见于,学术大型工作站一般使用SPARC;品牌手机、导航系统、网络交换机、路由器等都是ARM,是目前世界上使用范围最广的CPU
- 复杂指令集CISC
- 指令数目多而且复杂,花费时间长,但每个指令可以处理复杂的工作。
- 常见有AMD、Intel、VIA等x86架构等CPU。x86架构CPU被大量用于个人计算机。
- x86名字的由来,是因为最早的那个Intel发展的CPU代号8086,后面又有80286,80386等,所以这种架构的CPU就称为x86架构。2003年后,Intel的x86架构CPU由8位升级到16、32位,后来AMD依次架构修改为64位CPU,为了区别两者,64位的个人计算机CPU统称为X86_64架构。
CPU频率
概念
CPU每秒钟可以进行的工作次数。
CPU频率位3.0GHz,表示CPU在一秒内可以进行3.0*10^9次工作,每次工作可以进行少数的指令运行。
外频与倍频
CPU与外部各组件速度不一致,很多数据都在CPU内处理,故开发商在CPU内再加上一个加速功能。
- 外频,CPU与外部组件进行数据传输/运算的速度
- 倍频,CPU内部用来加速工作性能的一个倍数
两者相乘才是CPU频率。
上面例子CPU频率3.0GHz,而外频是333MHz,那么倍频就是9倍。
32位与64位
总线宽度可以分为32/64bit。总线速度 = 总线传输速度(频率) * 总线宽度。
CPU每次能够处理的数据量称为字组大小,依据CPU的设计而有32位和64位。现在所称的计算机是32位或是64位主要是依据CPU解析字组大小而来。CPU每次能解析的数据量有限,因此内存传来的数据量就有所限制。
字组大小和总线宽度可以不同。
CPU等级
1993年左右,x86架构的CPU在intel的Pentium系列后设计不统一,出现i386、i586、i686等名词出现。
- 在Intel Pentium MMX与AMD K6年代的CPU统称为i586等级
- Intel Celeron与AMD Athlon(K7)年代之后的32位CPU称为i686等级
- 目前64位CPU则统称为x86_64等级。
内存
不论是软件程序还是数据,都必须要读如内存后CPU才能使用。
内存组件
个人PC中主要位动态随机访问内存(DRAM)。断电后数据消失,也称为挥发性内存。
通常内存越大表示系统越快,因为系统不用常常释放一些内存内部的数据。对服务器而言,内存的容量有时比CPU的速度还重要。
理论上,CPU与内存的外频应该要相同才好。
双通道设计
传统总线宽度仅为64位,为了加大这个宽度,可以将两个内存汇整在一起,则可以达到128位。数据可以同步写入/读出内存中,提升整体的频宽。
开启双通道的内存,容量和型号最好相同!
第二缓存
为了某些常用的程序或者数据可以放置到CPU内部而设计,那么CPU数据的读取就不需要通过北桥了。
第二缓存(L2 Cache)在CPU内部,故L2内存的速度必须要与CPU频率相同。DRAM无法到达,故使用SRAM。
常用计算单位
大小单位
1Byte = 8bit
速度单位
- CPU的运算速度常使用MHz或GHz
- 网络常使用Mbit/s,即每秒多少Mbit
接口设备
单有CPU也无法运作计算机,需要其他的接口设备才能实际运行。
主板
主板芯片组
- 负责将所有的设备连接在一起,让所有的设备能够进行协调与通信。主板上最重要的组件是主板芯片组。
- 芯片组通常分为两个桥接器来控制各组件的通信
- 北桥负责连接速度较快的CPU、内存与显卡等组件。北桥的总线称为系统总线,因为是内存传输的主要信道。
- 南桥负责连接速度较慢的周边接口,包括硬盘、USB、网卡等,**南桥的总线是输入输出总线(IO)**。
- 芯片组负责所有通信,所以也是一个可能会散发出高热量的组件。因此主板上面会发现一些外接的小风扇或者是散热片。
IO地址与IRQ中断信道
是主板芯片组和其他设备通信的具体通信方式。
- 每个设备都有自己的IO地址。一般不能有两个设备使用同一个IO地址(类比门牌号)
- 各设备可以通过IRQ中断通信信道来告知CPU该设备的工作情况,以方便CPU进行工作分配的任务。(类比**各个门牌连接到邮件中心CPU的专门路径。
CMOS与BIOS
- CMOS主要记录主板上面的重要参数,包括系统时间、CPU电压与频率、各项设备IO地址与IRQ等。由于记录这些数据需要花费店里,故主板上面才有电池。
- BIOS位写入到主板闪存或EEPROM的程序,他可以在开机的时候执行,以加载CMOS当中的参数,并尝试调用存储设备中的开机程序,进行一步进入操作系统。
存储设备
存储设备包括:硬盘、软盘、MO、CD、DVD、U盘等。其中最常见的是硬盘。
硬盘的物理组成
主要由很多的盘片、机械手臂、磁头与主轴马达组成。实际的数据写在具有磁性物质的盘片上。
盘片的数据
扇区:由同心圆以放射状的方式分割出磁盘的最小存储单位,每个扇区大小512bytes,这个值是固定的。
磁道:扇区组成的一个就是磁道。
柱面:在多磁盘上面,同一个磁道可以组成一个柱面,也是一般分割磁盘时的最小单位。
传输接口
IDE接口
SATA接口
排线较细小,有利于主机壳内部的散热与安装。
目前主流的个人计算机硬盘已经被SATA代替了。SATA-2传输速度可达300MB/s。
SCSI接口
用于工作站等级以上的硬盘传输接口。硬盘的控制器含有一块处理器。
一些参数
容量
缓冲存储器
硬盘还有一个缓冲存储器,将硬盘内常用的数据缓存起来。这个缓冲器越大越好。
转速
指主轴马达转动盘片的速度,影响读取数据性能。越高越好。
显示设备
概念
显卡又称VGA(Video Graphics Array)。每个图像显示的颜色都会占用内存,所以显卡上面有一个内存容量,它将影响到最终屏幕分辨率和色彩深度。
GPU
显卡厂商为了缓解CPU进行3D运算压力,直接在显卡上面嵌入一个3D加速的芯片,即GPU由来。
与CPU通信
通过北桥芯片与CPU、内存通信。
也是需要告诉运算的组件,所以数据的传输速度越快越好。显卡规格变化:PCI —》AGP —》PCI-Express(PCIe)。他们主要区别在数据传输的频宽。
网络设备
其他设备
PCI(e)适配卡
提供多个PCI(e)插槽给用户插入其他功能卡。
操作系统
提供一个开发软件的操作接口给工程师开发软件,通过接口即可驱动所有的硬件。
操作系统其实也是一组程序,这组程序的重点在于管理计算机的所有活动以及驱动系统中的所有硬件。
内核
让CPU开始判断逻辑与运算数值,让内存开始读取数据与程序代码,让硬盘开始被访问等。硬件的所有操作都必须通过操作系统完成。这就是操作系统内核的功能。
主要在于管控硬件与提供相关的能力,非常重要,因此内核程序所放置到内存当中的区块是受保护的,并且开机后就一直常驻内存。
内核通常包含一些功能:
- 提供系统调用接口
- 程序管理:CPU调度机制有较加快整体系统性能
- 内存管理
- 文件系统管理
- 设备驱动
系统调用
为了保护内核,并且而让程序员比较容易开发软件,因此操作系统除了内核程序之外,通常还会提供一整组开发接口,那就是系统调用。
驱动程序
操作系统提供一个开发接口给硬件开发商,让他们可以根据这个接口设计可以驱动他们硬件的驱动程序,安装后就可以在操作系统上驱动硬件设备。
Linux概览
提供了一个完整的操作系统当中最底层的硬件控制与资源管理的完整架构,是沿袭Unix良好的传统而来的(UNIX Like 系统),所以相当稳定并且功能强大,且可以在目前的个人计算机(x86系统)上面跑。
一些历史
UNIX
- 1973年,UNIX正式诞生,Ritchie等人以C语言写出第一个正式UNIX内核。
- 1977年,UNIX的重要分支BSD(Berkeley Software Distribution, Bill Joy也是Sun的创办者)诞生。
- 1984年,x86架构的Minix操作系统诞生。
- 1984年,Richard Mathew Stallman(史托曼)创建了GNU项目,目的是创建一个自由、开放的UNIX操作系统(Free UNIX)。1999年左右,创立自由软件基金会(Free Software Foundation, FSF)。1985年左右,为了避免GNU所开发的自由软件被其他人所利用而成为专利软件,与律师草拟了通用公共许可证(General Public License, GPL),称为CopyLeft(与专利软件的CopyRight相对)。
- 1988年,由MIT(麻省理工学院)成立了非营利性性质的XFree86(X Windows System + Free + x86)。后面在Linux的GUI发展中有贡献。
Linux
1991年,芬兰大学生Linus Torvalds,以bash,gcc(GNU C Complie, 一种c语言编译器)等工具写了一个小小的内核程序,且可以在386机器上面运行。
期间,为了使LInux程序软件可以兼容UNIX,所以开始参考POSIX规范修改Linux。POSIX是可携式操作系统接口(Portable Operating System Interface)缩写,重点在于规范内核与应用程序之间的接口,由IEEE发布的一项标准。UNIX即按照这个规范来设计的。
1994年,在广大网友合作下完成Linux的内核正式版Version 1.0。这一版本还有X Window System的支持。1996年完成2.0版本。
为了让用户能够接触到Linux,很多的商业公司和团体奖Linux Kernel(含tools)与可运行的软件集成起来,放到光盘或网络给用户安装。这个”Kernel + softwares + Tools”的可完全安装的系统,称为Linux distribution可完全安装套件。
distributions主要分为两大系统:
- 使用RPM安装软件的系统,如Red Hat, Fedora, SuSE等。
使用Debian等dpkg方式安装软件等系统,如Debian, Ubuntu, B2D等。
Linux特色
- 配置需求低廉
- 系统稳定
- 保密功能强
- 架构开放,开源,免费或少许费用
- 多任务、多用户
Linux文件
在Linux系统中,每个设备都被当成一个文件来对待。常见设备与对应Linux文件名如下:
几乎所有的硬件设备文件都在/dev
这个目录内。
系统通过文件的major与minor数值识别设备文件。常见硬盘的值如下:
Linux文件结构和磁盘挂载
- 文件结构
Linux使用目录树结构,以根目录(/)为主,然后向下呈现分枝状的目录结构的一种文件结构。
如何结合目录树的架构与磁盘内的数据,这个时候就牵扯到“挂载”(mount)问题。
磁盘挂载
利用一个目录当进入点,将磁盘分区的数据放置在该目录下,即进入该目录就可以读取该分区。这个操作成为挂载,进入点的目录成为挂载点。
如下图,当数据放置在/home内的各个目录时,数据放置在partition2分区;当数据放置在其他目录时,数据放置在partiton1目录。
Linux磁盘分区
磁盘分区文件
整块磁盘的第一个扇区特别重要,记录了整块磁盘的重要信息。主要有两个重要的信息:
- 主引导分区(Master Boot Record, MBR):可以安装引导加载程序的地方,有446bytes。
- 分区表(partition table):记录整块磁盘分区的状态,有64bytes。
分区表
分区的最小单位为柱面。分区是以柱面号码的方式记录,在分区表的64bytes中,总共分为四组记录区,每组及录取记录该区段的起始与结束的柱面号码。
分区表64bytes最多容纳四个分区,这四个分区被称为主(Primary)分区,若主分区被继续划分,则成为扩展(Extended)分区。
假设硬盘为/dev/hda,则四个区的文件名为如下,其中后面跟的数字,与该分区所在的位置有关。
- P1: /dev/hda1
- P2: /dev/hda2
- P3: /dev/hda3
- P4: /dev/hda4
扩展分区
Linux一块硬盘想分出不止四个分区,是可以的。既然第一个分区所在的分区表只能记录四条数据,那可以利用额外的扇区来记录更多的分区信息。
上图P1称为主分区,P2称为扩展分区,L[1-5]由P2继续切分而来称为逻辑分区(logical partition)。设备文件名如下。注意没有/dev/hda3和/dev/hda4。因为前四个号码都是留给Primary或者Extended用的
- P1: /dev/hda1
- P2: /dev/hda2
- L1: /dev/hda5
- L2: /dev/hda6
- L3: /dev/hda7
- L4: /dev/hda8
- L5: /dev/hda9
有几个注意点:
- 扩展分区最多只能有一个
- 能够被格式化后作为数据访问的分区为主分区和逻辑分区,扩展分区无法格式化
- 逻辑分区数量依操作系统不同,在Linux系统中,IDE硬盘最多59个逻辑分区(5-63号),SATA硬盘有11个逻辑分区(5号到15号)。
建议的磁盘规划
简单的分区方法
仅分出根目录与内存交换空间(/ 和 swap)。
swap内存交换空间的功能是:当有数据被存放在物理内存里面,但是这些数据又不是常被CPU所取用时,那么这些不常被使用的程序将会被丢到硬盘的swap交换空间中,而将快速的物理内存空间释放出来给真正需要的程序使用。
稍微麻烦
需要较大容量和读写频繁的目录,独立于根目录分区。常见容量大或读写频繁的目录:
- /
- /usr
- /home
- /var
- swap
Linux开机流程
正常开机
- BIOS,开机主动执行的程序,会识别第一个可开机的设备(硬盘)。
- MBR,第一个可开机设备的第一个扇区内的主引导分区块,内包含引导加载程序。
- 引导加载程序(Boot loader),读取内核文件
- 提供菜单:用户选择不同的开机选项,也是多重引导的重要功能。
- 载入内核文件:直接指向可开机的程序区段来开始操作系统
- 转交其他loader:将引导加载功能转交给其他loader负责。
- 内核文件,内核文件工作,开始操作系统的功能。
- 内核开始检测硬件与加载驱动程序
- 内核主动调用init进程,init进程取得run-level信息
- init执行
/etc/rc.d/rc.sysinit
文件来准备软件执行的操作环境 - init执行run-level的各个服务的启动
- inti执行
/etc/rc.d/rc.local
文件 - init执行终端机模拟程序
mingetty
来启动login进程,等待用户登录
BIOS
系统加载BIOS(Basic Input Output System)程序,来加载CMOS的信息,从而获得主机的各项硬件配置。包括:
- CPU与接口设备的通信频率
- 启动设备的查找顺序
- 硬盘的大小与类型
- 系统时间
- 总线信息
- 接口设备的IO地址
- IRQ信息等等
之后,BIOS继续进行开机自检、硬件检测的初始化、配置PnP(即插即用设备)、定义出可启动的设备顺序。后面就准备通过MBR开始读取启动设备的数据了。
MBR
在启动设备的第一扇区,里面包含可以处理内核文件加载问题的引导装载程序,Boot Loader。
BIOS是通过硬件的INT13中断功能读取MBR。
Boot Loader
每种操作系统都有自己的Boot Loader,在自己磁盘分区的引导扇区(boot sector)。在安装Winodows的时候,会默认将windows在引导扇区的boot loader拷贝一份并安装到系统的MBR;在安装Linux的时候,可以选择装,也可以不装。
通过boot Loader提供的菜单功能,选择内核文件进行加载,同时可以配合loader的控制权转交的功能实现多重引导。但是,Windows的loader默认不具有控制权转交的功能。所以,在多系统的时候,一定要先装Windows再装Linux。
在具体boot loader执行过程中分为两个阶段:
执行boot loader主程序
MBR通常仅安装了boot loader的最小主程序,并没有安装loader的相关配置文件
主程序加载配置文件
通过boot loader加载所有配置文件(一般在/boot下面)与相关的环境参数文件(文件系统定义与主要配置文件menu.lst)
现在常见的boot loader一般是grub,与grub有关的文件都放置到/boot/grub
中。
其中最重要的配置文件是menu.lst
文件。
加载内核检测硬件
Linux会将内核解压缩到内存中,并利用内核的功能,开始测试与驱动各个周边设备(存储设备、CPU、网卡、声卡等)。然后,内核重新检测一次硬件(不一定使用BIOS的硬件检测信息),此时,内核正式开始接管BIOS的工作。
内核文件被加载后,一般放置在/boot
目录下。在/boot/modules
内,有很多内核模块(可以想想成驱动程序,如USB、SATA等)可以供Linux内核动态加载,该目录一定和根目录放置在同一分区!启动过程中内核必须挂载根目录(此时,以只读方式挂载),这样才能内核模块提供加载驱动程序的功能。
若Linux安装在SATA里面,会出现这样的矛盾:
内核不认识SATA接口,需要加载SATA程序,不然没办法挂载根目录;
但是SATA驱动程序在
/boot/modules
里面,不挂载根目录,无法读取这个目录的驱动程序。这里,还有个虚拟文件系统(InitialRAM Disk,一般文件名为
/boot/initrd
)可以解决这个问题。它通过boot loader加载到内存解压缩后,在内存中仿真成一个根目录,来加载启动过程中需要的内核模块。等模块都载入完成后,帮助内核重新调用/sbin/init
来继续启动流程。如果是ext2/ext3文件系统的IDE接口的磁盘,则不需要
initrd
就可以直接被内核加载。
init进程
内核加载完成、硬件检测完成和驱动程序加载后,内核主动调用第一个进程/sbin/init
。主要的功能是准备软件执行的环境,包括:系统的主机名、网络设置、语系处理、文件系统格式及其它服务的启动。init
进程的配置文件为**/etc/inittab
**。
重要的配置项
run level
根据有无网络与有无X Window划分为7个等级,来规定系统使用不同的服务来启动。
- 0:halt,系统直接关机
- 1:single user mode,单用户维护模式,用在系统出问题时的维护
- 2:Multi user without NFS,多用户模式,但无NFS服务
- 3:Full multi user mode,完整含有网络功能的纯文本模式
- 4:unused,系统保留功能
- 5:X11,与run level3类型,但使用X Window模式加载
- 6:reboot,重新启动
/etc/inittab
文件结构配置语法:
[设置选项]:[run level]:[init的操作行为]:[命令选项]
设置选项。最多四个字符,代表init的工作选项
run level,可能会配置多个等级
init的操作行为,主要如下:
选项命令,即可以进行的一些script命令
init的处理流程
配置文件也是从上至下一行一行读取。
- 取得默认run level
- 使用
/etc/rc.d/rc.sysinit
进行系统初始化,它里面的脚本主要配置文件是/etc/sysconfig/*
- 如果此时run level是5,则加载
/etc/rc.d/rc5
- 设置好
[Ctrl]+[Alt]+[Del]
组合键 - 设置不断电系统的pf,pr两种机制
- 启动mingetty的6个终端机tty1~tty6
- 最终以
/etc/X11/perfdm -nodaemon启动图像界面
/etc/rc.d/rc.sysinit
进行系统初始化
主要是设置各种系统环境,有以下:
取得网络环境与主机类型
读取网络配置文件
/etc/sysconfig/network
,取得主机名与默认网关等网络环境测试与挂载内存设备
/proc
及USB设备/sys
决定是否启动SELinux
启动系统的随机数生成器
设置终端机字体
设置显示于启动过程找那个的欢迎界面
设置系统时间与时区
读取
/etc/sysconfig/clock
的设置值接口设备的检测与PnP参数测试
根据内核在启动时的检测结果
/proc/sys/kernel/modprobe
来进行检测用户自定义模块的加载
读取
/etc/sysconfig/modules/*.moduels
加载内核的相关设置
读取
/etc/ssyctl.conf
设置主机名与初始化电源管理模块
初始化软件磁盘阵列
读取
/etc/mdadm.conf
初始化LVM的文件系统
以fsck检验磁盘文件系统
进行磁盘配额quota的转化
重新以可读写模式挂载系统磁盘
启动quota
启动系统伪随机数生成器
清除启动过程中的临时文件
启动相关信息加载到
/var/log/dmesg
文件中
/etc/rc.d/rcN启动系统服务
内部定义了启动时需要启动的服务信息,并有一定的启动先后顺序。
特别是最后一行,加载/etc/rc.d/rc.local
文件,是用户自定义的开机启动程序
多重引导
其中引导加载程序除了可以安装在MBR之外,还可以安装在每个分区的引导扇区(boot sector),才有了多重引导功能。
每个分区都有自己的启动扇区,实际可开机的内核文件是放置在各分区内的。
loader只会认识自己的系统分区内的可开机内核文件和其他loader,loader可以直接指向或是间接将管理权转交另一个管理程序。
Linux登录方式
在Linux默认登录模式中,主要分为两种:
- 纯文本界面(运行等级 run level 3),可以拥有tty1~tty6的终端界面。
- 图形界面(运行等级 run level 5),拥有tty1~tty7。其中tty7就是开机后等待登录的图形环境。
登录环境的切换:
- [Ctrl] + [Alt] + [F1] ~ [F6]:文字界面登录tty1~tty6终端
- [Ctrl] + [Alt] + [F7]:图形界面桌面
Linux内核
内核文件是个压缩文件,解压缩后才加载到内存中。内核文件相关位置:
Linux命令行和简单命令
可以输入多条命令
使用**分号(;)**隔开多条命令,命令按顺序执行。
可以换行输入命令
当输入命令太长是时,可以使用\[Enter]
进行换行输入
用户符号区别
普通用户
[xxx@xxx
]$,其中``代表的是用户的主文件夹,即/home/username文件夹root
[xxx@xxx
]#,命令提示符和普通用户不一样,且代表/root文件夹
执行命令的查询路径PATH
概念
在终端执行命令的时候,其实由一个同名的可执行文件存在。系统会按照PATH的设置去每个PATH定义的目录下查询可执行文件,如果有多个同名的可执行文件,先查到的可执行文件先执行。(当涉及到别名等其他情况时情况会更复杂,详见
Shell-》Bash Shell环境-》路径与命令查找顺序
)查看PATH
echo $PATH
每个目录之间以冒号(:)隔开,有顺序之分。
一些事项
- 不同身份用户默认的PATH不同,默认能够随意执行的命令也不同
- 使用绝对路径或相对路径直接指定命令的文件名来执行,会比查询PATH来的正确
开关机相关命令
将数据同步写入硬盘
sync
退出登录
注销Linux,退出登录状态。
exit
关机
shutdown poweroff
重启
reboot
基础操作命令
在Linux中,不一样的大小写代表不同命令,即大小写敏感。
显示日期和时间
data
显示日历
cal
简单计算器
bc
重要的热键
[Tab]
具有“命令补齐”和“文件补齐”功能。
[Ctrl] + C
中断当前程序。但对于比较重要的命令慎用。
[Ctrl] + D
代表键盘输入结束。也可以代替
exit
命令。
查询命令 man
man是manual(操作说明)的简写。查询的结果页面称为man page。
man page存放位置
一般为
/usr/share/man
,可以修改/etc/man.config
或/ect/man.conf
或/etc/manpath.conf
来改变man page的查询路径。使用方法
man command
一些操作
man page简单解析
- 第一行,命令后面的数字的含义
其他参数
查询命令 info
和man类似,但输出格式有所不同。
查看Linux内核信息命令
- 查看实际的内核版本
uname -r
- 查看distribution信息
lsb_release -a
清除界面显示
clear
Linux用户管理
Linux的账号与用户组
用户标识符
在登录Linux时,是根据ID(UID和GID)来辨认用户,ID和账号的关系存储在**/etc/passwd
和/etc/group
**文件中。
标识符ID分为两种
- 用户ID,UID
- 用户组ID,GID
用户账号
用户登录shell流程
- 先查
/etc/passwd
文件是否有相关账号- 有,查出对应的UID,然后从
/etc/group
文件读出GID - 没有,提示没有账号
- 有,查出对应的UID,然后从
- 核对密码表,从
/etc/shadow
找出对应账号信息,对比密码是否正确 - 如果一切都正确,进入shell
/etc/passwd
文件概览
每一行都代表一个账号。注意,其中有很多系统账号,不能删除!
一共被:
分隔出7个字段
账号名称
密码
显示
x
,因为对应密码被放到/etc/shadow
文件了UID
GID
用户信息说明列
主文件夹路径
默认用户在
/home/username
,root在/root
Shell
用户登录的默认shell设置
/etc/shadow
文件概览
每一行都代表一个账号信息
一共被:
分隔出9个字段
账户名称
密码
密码经过加密了
最近更改密码的日期
从1970-01-01开始计算的累加日期
密码不可被更改的天数
相对于第3字段而言的,即为修改密码的间隔时间参数
密码需要修改的天数
相对于第3字段而言的,即为下一次需要修改密码的时间间隔
密码需要修改期限前的警告天数
相对第5字段而言的,发出提醒
密码过期后的账号宽限时间
相对第5字段而言的
账号失效日期
从1970-01-01开始计算的累加日期计算,表示账号在整个日期之后不能使用
保留字段
日后新功能加入使用
用户组设置
与用户组相关的配置文件在/etc/group
和/etc/gshadow
中。
/etc/group
文件概览
每一行代表一个用户组
一共被:
分隔出4个字段
用户组名称
用户组密码
显示
x
,移动到/etc/gshadow
文件中GID
此用户组支持的账号名称
/etc/gshadow
文件概览
- 用户组名
- 密码列
- 用户组管理员的账号
- 该用户组的所属账号
有效与初始用户组
初始用户组(initial group)
/etc/passwd
的GID,是用户登录系统就立刻拥有的用户组。有效用户组(effective group)
当有多个用户组支持这个用户账号时,若用户新建文件,文件的GID对应的用户组,即为有效用户组
用户组信息查看groups
使用
groups
命令可以查看所以支持这个账号的用户组,且第一个列出的用户组就是有效用户组有效用户组切换newgrp
在已经支持本账号的用户组间切换
newgrp groupname
账号管理
新增与删除用户
新增用户useradd
默认的一些参数
使用
useradd -D
查看你默认参数,如group、home目录等等。这些数据由**
/etc/default/useradd
**提供UID/GID、密码参数等
来自
/etc/login.defs
文件
设置密码passwd
修改密码参数chage
修改账号参数usermod
删除用户userdel
删除用户的相关数据,主要是:
- 用户账号/密码:
/etc/passwd
、/etc/shadow
- 用户组相关参数:
/etc/group
、/etc/gshadow
- 用户个人文件数据:
/home/username
、/var/spool/mainl/username
等等
批量新建用户模板
#!/bin/bash
# 新建账号,功能包括:
# 1. 检查account1.txt文件是否存在,并将该文件内的账号取出
# 2. 新建上述文件的账号
# 3. 将上述账号的密码修改成强制第一次进入需要修改密码的格式
export PATH=/bin:/sbin:/usr/bin:/user/sbin
if [ ! -f account1.txt ]; then
echo "所需要的账号文件不存在,请新建account1.txt,每行一个账号名称"
exit 1
fi
usernames=$(cat account1.txt)
for username in $usernames
do
useradd $username
echo $username | passwd --stdin $username
chage -d 0 $username
done
# account1.txt
std01
std02
std03
用户其他功能
查看用户相关信息
改变用户相关信息
改变用户的shell
查看UID/GID
新增与删除用户组
新增用户组groupadd
修改用户组参数groupmod
删除用户组
删除用户组时,必须确保**/etc/passwd
内的账号没有任何人使用该用户组作为初始用户组。**
管理用户组
ACL权限
概念
ACL(Access Control List),主要的目的是提供**ogu
的rxw
之外**的具体权限设置。ACL可以针对单一用户、单一文件/目录来进行rwx
权限的设置。
ACL需要文件系统的支持,Centos默认是启动ACL的,若没有启动,可以:
mount -o remount,acl /
或者前往/etc/fstab
文件修改信息如下:
文件ACL的设置
设置文件ACL
- 使用
setfacl
命令。
acl参数的格式
u:用户/用户组:权限
若用户字段没有,表示所有者
setfacl -m u:username:rwx filename
设置完后,文件的权限会出现
+
-rwxr-xr--+
查看文件ACL
使用
getfacl
命令getfacl filename #参数与setfacl相同,这里省略了
其中mask是文件的最大范围权限!
用户身份切换
在不同用户身份切换,一般是普通用户和root的切换
su
切换root的时候,需要输入root的密码
su后不接参数
表示使用non-login shell的方式登录root,很多原本的变量不会改变,如PATH等。
su后接
-
代表使用login shell的方式登录root,环境完全变为root环境
使用
exit
退出su环境
sudo
切换root的时候,不需要root密码,输入自己的密码即可,且仅有/etc/sudoers的用户才能执行sudo命令。
设置sudo权限使用
visudo
命令。
用户信息传递
查询用户在线信息
w
/who
查看目前已登录系统的用户
last
查询近来登陆者信息
lastlog
读取
/var/log/lastlog
文件,查询每个账号的最近登录时间
用户对谈
write
给某个用户写消息
mesg
mesg n #拒绝接收消息,但root的消息不可抵挡 mesg y #接收消息
wall
对所有系统用户广播消息
wall messagecontent
用户邮箱
每个Linux用户都有一个mailbox
mailbox在/var/spool/mail/username
文件
Linux文件系统
文件系统与磁盘管理
Linux使用Ext2/Ext3作为文件系统。其中EXT2是Linux最传统的磁盘文件系统。
文件系统结构
不同的OS使用不同文件系统
磁盘分区后,需要进行格式化。因为每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此需要将分区进行格式化,以成为操作系统能够利用的文件系统格式。Windows并不认识Linux的Ext2文件系统。
- Windows 98,使用FAT或FAT16文件系统
- Windows 2000以后,使用NTFS文件系统
- Linux,使用Linux second extended file system(Ext2fs)文件系统
文件系统位置
传统磁盘,一个分区只能被格式化为一个文件系统。
但由于LVM与软磁盘阵列(software raid),这些技术可以将一个分区格式化为多个文件系统(例如LVM),也能够将多个分区合成一个文件系统(LVM,RAID)。
通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分区。
Ext2底层结构
- Super block:记录文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等。
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码
- block:实际记录文件的内容,若文件太大时,会占用多个block
文件系统先格式化出inode与block的块。系统文件的属性与权限数据放置到inode,而inode记录了文件数据的实际放置点的block号码。此时操作系统就据此排列磁盘的阅读顺序。这种方式称为索引式文件系统。
Ext2文件系统在格式化的时候,区分为多个块组(block group)的,每个块组都有独立的inode/block/superblock系统。文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装引导装载程序。
data block(数据块)
是用来放置文件内容的地方。在Ext2文件系统中所支持的block大小有1KB,2KB,4KB。在格式化时,block的大小和编号就固定了。不同block大小,对文件系统有些影响:
每个block内最多只能放置一个文件的数据:
- 如果文件大于block的大小,则一个文件会占用多个block数量
- 若文件小于block,则该block的剩余空间就不能够再被使用了(磁盘空间会浪费)。
inodetable(inode表格)
inode的数量和大小在格式化的时候也被固定,除了用来放文件的属性和权限外,还具有下列特性:
- 每个inode大小均固定为128bytes
- 每个文件都仅会占用一个inode而已。所以文件系统能够创建的文件数量与inode的数量有关。
inode记录block号码的区域定义为12个直接记录区、1个间接记录区、1个双间接记录区、1个三间记录区。
Superblock(超级块)
记录整个文件系统相关信息的地方:
- block与inode的总量
- 未使用与已使用的inode/block数量
- block与inode的大小
- 文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息
- 一个valid bit数值,若此文件系统已被挂载,则valid bit为0;若未被挂载,则valid bit为1。
一般来说,superblock的大小为1024bytes。一个文件一般应该仅有一个superblock。处理第一个block group含有superblock外,后续的block group不一定含有superblock,若含有则该superblock主要是作为第一个block group内的备份,可以进行superblock的救援。
File system Description(文件系统描述说明)
可以描述每个block group的开始与结束的block号码,以及说明每个区段(superblock,bitmap,inodemap, data block)分别介于哪一个block号码之间。
block bitmap(块对照表)
从block bitmap中可以知道哪些block是空的,方便新建文件
删除文件时,在block bitmap中对应的block号码的标志改为“未使用中”。
inode bitmap(inode对照表)
与block bitmap类似,只不过是记录inode的信息。
U盘底层结构
U盘(闪存),使用文件系统一般为FAT格式。FAT没有inode,它将每个block号码都记录在前一个block当中。
与目录树关系
目录
ext2分配一个inode和至少一块block。
block里面记录在整个目录下的文件名与文件名占用的inode号码。
文件系统最顶层的目录的inode一般为2号。
文件
ext3分配一个inode和多个block记录文件内容。
与内存的交互
Linux使用异步处理(asynchronously)来解决读写磁盘慢的问题。
- 当系统文件到内存后,若文件没有被改动过,则内存区段的文件被设置为clean
- 当更改过后,内存中的数据被设置为Dirty。所有的操作都在内存中执行,并没有写入磁盘。系统会不定时将内存中设置为Dirty的数据写会磁盘。也可以使用
sync
强制写入磁盘。
文件压缩与打包
文件解压缩技术
定义
由于二进制的0和二进制文件一些重复数据可以进行统计记录的原因,文件空间并不是完全被填满的。
压缩比
压缩前与压缩后的文件所占用的磁盘空间大小的比值
Linux常见压缩文件后缀
compress、gizp、bzip都是对单一文件进行压缩
打包
将多个文件后目录包成一个大文件的命令功能。
tar
命令,除了打包外,还支持通过gzip/bzip2进行压缩。
完整备份和恢复
使用dump
命令可以对整个文件系统备份,也可以对单个目录备份。在多次备份中,后一次备份只备份与前一次备份的有变化的文件。
使用`restore命令可以恢复系统的数据
磁盘管理
新增磁盘步骤
- 对磁盘进行分区,以新建可用的分区
- 对分区进行格式化,以创建系统可用的文件系统,并进行检验
- 在Linux上,需要创建挂载点(目录),并进行挂载
设置开机挂载
在/etc/fstab
里面设置挂载相关信息。
其中第4列是一些特殊的文件系统参数(mount参数设置也有见),如下:
第5列是指示“能否被dump备份命令使用”
0:不做dump备份
1:每天进行dump操作
2:不定日期的dump备份操作
第6列是“是否以fsck检验扇区”
0:不要检验
1:最早检验
特殊设备挂载
镜像文件直接挂载
创建大文件以制作loop设备文件挂载
对大文件格式化+挂载
mkfs -t ext3 /home/loopdev mount -o loop /home/loopdev /media/cdrom/
相关配置文件
挂载相关配置文件
Linux支持的文件系统的驱动
/lib/modules/$(uname -r)/kernel/fs/
系统指定的测试(默认)挂载文件系统类型
/etc/filesystems
系统已经加载的文件系统类型
/proc/filesystems
挂载信息设置
etc/fstab
、/etc/mtab
和/proc/mounts
文件属性与权限
任何一个文件都具有User、Group和Others 三种等级权限。root可以查看所有文件。
文件属性
属性查看
使用
ls -al
命令可以查看当前文件下所有的文件详细的属性与权限。参数
权限 连接 所有者 用户组 文件容量 修改日期 文件名 drwx—— 3 root root 4096 Sep 5 10:37 .gconf -rw-r–r– 1 root root 42304 Sep 4 18:26 install.log
属性解析
第一列,文件类型与权限
一共10个字符。
第一个字符代表文件是“目录、文件或链接文件等”
[d]是目录
[-]是文件
[l]表示连接文件(linkfile)
有两种连接文件的方式:
hard link(硬连接/实际连接)
在某个目录下新建一条文件名连接到某inode号码的关联记录
有两个限制:不能跨文件系统,不能连接到目录
symbolic link(符号连接,即快捷方式)
创建一个单独的文件,这个文件会让数据的读取指向它连接的那个文件的文件名。
[b]表示可供存储的接口设备
[c]表示串行端口设备,如键盘、鼠标等
后面9个字符,3个分为一组”rwx”的组合,r为可读,w为可写,x为可执行。如果没有相应权限,用[-]代替。
- 第一组,文件所有者的权限
- 第二组,用户组的权限
- 第三组,其他人的权限
特别注意这些权限对于文件和目录的意义:
对于文件的意义
特别对于w权限,具有写入、编辑、新增、修改文件的内容的权限,但并不具备删除该文件本身的权限。
对于目录的意义
r权限,表示可以读取目录下的文件名数据
w权限,表示具有更改目录结构列表的权限,包括:
- 新建新的文件和目录
- 删除文件和目录
- 重命名文件和目录
- 转移该目录内的文件、目录位置
x权限,表示用户能否进入该目录成为工作目录
即cd命令能否进入
总而言之:
让用户能进入某目录成为“可工作目录”的基本权限:
- 可使用的命令:`cd等切换工作目录命令
- 目录所需权限:用户对这个目录至少具有
x
权限 - 额外需求:如果用户想要在这个目录使用
ls
,则还需要r
权限
用户在某个目录内读取一个文件的基本权限:
- 可使用的命令:
cat
、more
等命令 - 目录所需权限:用户对这个至少具有
x
权限 - 文件所需权限:用户对文件至少需要具有
r
的权限才行
- 可使用的命令:
让用户可以修改一个文件的基本权限:
- 可使用的命令:
nano
、vim
等编辑器 - 目录所需权限:用户在该文件所在的目录至少要有x权限
- 文件所需权限:用户对该文件至少要有
rw
权限
- 可使用的命令:
让一个用户可以创建一个文件的基本权限:
目录所需权限:用户再该目录要具有
wx
权限,特别是w
权限让用户进入某目录并执行该目录下的命令的基本权限:
- 目录所需权限:用户在该目录至少具有
x
权限 - 文件所需权限:用户在该文件至少需要有
x
权限
- 目录所需权限:用户在该目录至少具有
第二列,有多少文件名连接到此节点
每个文件都会将权限与属性记录到文件系统的i-node中。这个属性记录有多少不同的文件名连接到相同的一个i-node号码。
第三列,表示文件所有者账号
第四列,表示文件的所属用户组
第五列,文件容量的大小,默认为B
第六列,这个文件的创建文件日期或最近的修改日期
特别注意一下文件的时间,Linux下面会记录许多的时间参数,其中有三个主要的变动时间。ls默认显示的是mtime。
modification time(mtime)
文件的“内容数据”(不是文件属性或权限)改变时,更新mtime
status time(ctime)
文件的“状态”(权限或属性被修改等)改变时,更新ctime
access time(atime)
当“文件的内容被读取”(如使用cat命令)时,更新atime
第七列,文件名。
隐藏文件,文件名有个
.
改变文件属性与权限
改变文件所属用户组 chgrp
注意,改变后的组名要在/etc/group
文件中才行。
chgrp [-R] groupname filename
改变文件所有者 chown
注意,改变后的用户要在/etc/password
文件中才行。此外,还可以顺便改变用户组。
chown [-R] username filenmae
chown [-R] username:groupname filename
使用环境,如cp
命令,复制文件时,会同时复制执行者的属性与权限,可能需要改变权限。
改变文件的权限 chmod
用来改变文件的权限,有两种方式:数字、符号。
数字类型
使用数字来代替
rwx
。- r:4
- w:2
- x:1
- -:0
每组权限
rwx
的权限数字,是对应的数字相加。如:owner = rwx = 4 + 2 + 1 = 7
group = rwx = 4 + 2 + 1 = 7
others = — = 0 + 0 +0
命令使用方式:
chmod [-R] xyz filename
符号类型
使用u, g, o分别代替user 、group、others三种身份,a代表all,即全部身份。
chmod u=rwx, go=rx filename chmod a+x filename
文件的默认权限
在新建文件或目录时候的权限默认值,由umask指定。
umask是四个数字,如0022
,与一般权限有关的后三个数字,分别表示user、group、others需要在默认权限的基础上拿掉的权限。比如这里group和others需要去掉w
权限。
umask xxx #直接设置ugo需要去掉的权限
默认情况的权限
若用户创建“文件”,默认没有可执行
x
权限,只有rw
权限,所有最大为666,即默认权限为:-rw-rw-rw-
若用户创建“目录”,默认为777,即
drwxrwxrwx
设置umask后的权限
比如若umask为0022
新建文件时
-rw-rw-rw-
------w--w-
=-rw-r--r--
新建目录时
drwxrwxrwx
-d----w--w-
=drwxr-xr-x
文件的隐藏属性
设置文件的隐藏属性
显示文件隐藏属性
文件特殊权限
在Linux的一些特殊文件的权限里,如/tmp
、/usr/bin/passwd
等,有s
、t
等等权限。
SUID
s
出现在文件所有者的x
权限上时,称为Set UID,简称SUID权限。提供的功能:
- SUID权限仅对二进制程序有效
- 执行者对于该程序具有
x
的执行权限 - 本权限仅在执行该程序过程中有效
- 执行者将具有该程序所有者的权限
SGID
s
出现在文件用户组的x
权限上时,称为Set GID,简称SGID权限。如/usr/bin/locate
文件。
对于文件提供的功能:
- SGID对二进制程序有用
- 程序执行者对该程序具有
x
权限 - 执行者在执行过程中获得该程序用户组的支持
对于目录提供的功能:
- 用户若对于此目录具有
rx
权限,则该用户能进入目录 - 用户对此目录的有效用户组会变成该目录的用户组
- 若用户再此目录下具有
w
权限,则用户创建的新文件的用户组与此目录的用户组相同
SBIT
Sticky Bit(SBIT)目前只针对目录有效,作用是:
若用户对目录具有
wx
权限,当用户在该目录下创建文件或目录时,仅有自己与root才有权利删除该文件。
特殊权限的设置
依然使用chmod
命令,但需要在之前数字方式的基础上,使用4个数字修改权限,最前面的数字就是代表SUID
、SGID
、SBIT
的权限。
- SUID: 4
- SGID: 2
- SBIT: 1
Linux目录详解
Filesystem Hierarchy Standard(FHS)标准,规定每个特定的Linux目录下应该要放置什么样子的数据。FHS定义出三层目录:
- / ,根目录,与开机系统有关
- /usr , Unix software resource,与软件安装有关
- /var,variable,与系统运作过程有关
四种交互作用形态
可分享的
分享给其他系统挂载使用的目录
不可分享的
仅与自身机器有关,不适合分享给其他主机
不变的
有些数据不经常变动,跟随distribution而不变动。如函数库、文件说明文件等。
可变动的
进程改变的数据,如登录文件等。
常见目录
根目录(/)的内容
FHS建议,根目录所在分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区。
根目录与开机有关,开机过程中仅有根目录会被挂载,其他分区在开机后陆续进行挂载。下面这些目录一定要和根目录放在同一分区下:
- /etc 配置文件
- /bin 重要执行文件
- /dev 需要的设备文件
- /lib 执行文件所需要的函数库与内核所需的模块
- /sbin 重要的系统执行文件
根目录下的常见子目录如下:
/usr
的内容
是所有系统默认软件的安装目录。/usr的子目录建议有下列:
/var
内容
在系统运行之后逐渐填满容量的目录,包括缓存、登录文件、软件运行所产生的文件等。
绝对路径和相对路径
- 绝对路径:由根目录(/)开始写起的文件名或目录名称
- 相对路径:相对当前路径的文件名写法。
./xx
,../xx
,xx/xx
等.
代表当前目录..
代表上一层目录
Linux文件系统命令
目录相关命令
切换目录cd
cd
显示当前目录pwd
pwd [-P]
-P参数显示出当前路径,而非连接路径
新建目录mkdir
mkdir [-mp] filename
-m 777
配置文件的权限
-p filename1/filename2
递归创建目录
删除一个空的目录rmdir
rmdir [-p] filename
递归删除目录
查看文件与目录ls
其中ls -l
命令有个别名为ll
。
复制cp
特别注意,在默认的条件中,cp的源文件与目的文件的权限是不同的,目的文件的所有者通常会是命令操作者本身。
移除rm
移动mv
取路径的文件名basename和目录名称dirname
文件内容相关命令
从第一开始显示cat
从最后一行开始显示tac
tac filename
带行号输出nl
一页一页显示more
more filename
可用的操作:
- 空格键,向下翻一页
- Enter,向下滚动一行
- /字符串,向下查询“字符串”关键字
- :f,立刻显示出文件名以及目前显示的行数
- q,立刻离开more,不再显示该文件内容
- b或[Ctrl]+b,往回翻页
可以往前翻页显示less
在more的功能基础上,加上往前翻页的功能
less filename
可用的操作:
- 空格键,往下翻一页
- [PageDown],往下翻一页
- [PageUp],往上翻一页
- /字符串,向下查询“字符串”的功能
- ?字符串,向上查询“字符串”的功能
- n,重复前一个查询(与/或?有关)
- N,反向重复前一个查询(与/或?有关)
- q,离开less这个程序
只看头几行head
只看结尾几行tail
二进制方式读取文件od
修改文件时间或创建新文件touch
查看文件类型file
获取文件的基本数据的类型,如ASCII文件、data文件、binary文件,或是有没有动态函数库(share library)等信息。
file filename
文件压缩打包命令
解压缩命令
compress
gzip
打包命令
常用操作:
压缩
tar -jcv -f tarfilename.tar.bz2 filename
查询
tar -jtv -f tarfilename.tar.bz2
解压缩
tar -jxv -f tarfilename.tar.bz2 -C filename
文件/命令的信息查询命令
脚本文件名查询which
根据PATH环境变量所规范的路径,去查询完整文件名或命令路径。
按文件名查找相关文件whereis/locate/find
这两个命令查询的时候根据文件数据库查询,速度会快很多。相对于find
命令,是直接去磁盘找。
whereis
locate
其中
keyword
指的是可以根据文件部分名称
查找相关的文件。- 数据库文件:
/var/lib/mlocate/
- 更新数据库:
- 命令:
updatedb
- 配置文件:
/etc/updatedb.conf
- 命令:
- 数据库文件:
find
Linux磁盘命令
查询磁盘每个区段信息dumpe2fs
列出文件系统的整体磁盘使用df
评估文件系统的磁盘使用量du
连接文件ln
磁盘分区fdisk
该命令之后会进入一个交互式环境:
磁盘格式化mkfs/mke2fs
mkfs
进行格式化,创建文件系统
mke2fs
自定义数据创建文件系统
磁盘检验fsck/badblocks
fsck
检验文件系统是否出错
执行fsck时,被检查的分区务必不可挂载到系统上!
执行完成后,若系统磁盘有问题会在挂载点目录下面创建
lost+found
目录,存放有问题的数据badblocks
检查硬盘或软盘扇区有无坏轨
可以被
mke2fs -c 设备文件名
命令代替,不常用badblocks。
磁盘挂载mount
挂载是将参数写入/etc/mtab
和/proc/mounts
文件
磁盘卸载umount
修改设备文件参数mknod
修改磁盘卷标e2label
更改文件系统类型tune2fs
新建镜像文件mkisofs
光盘刻录cdrecord
Linux进程
例行性工作
概念
周期性或定时需要完成的事情
Linux的常见例行性工作
进行日志文件的轮替(log rotate)
日志文件分析logwatch
新建locate数据库
对文件名数据库
/var/lib/mlocate/
文件进行更新whatis数据库建立
与man page相关的查询命令的数据库
RPM软件日志文件的新建
软件变动后,文件名的排序、数据库的建立等等
删除临时文件
tmpwatch
命令进行周期工作,删除软件运行中产生的临时文件与网路服务有关的分析行为
仅执行一次的工作调度
启动atd服务
使用单一工作调度,需要开启atd服务
/etc/init.d/atd restart
设置单一工作调度at
at的工作机理
将工作以文本文件的方式写入**
/var/spool/at/
**目录内,该工作便等待atd服务的取用与执行at的限制相关文件
可以利用
/etc/at.allow
和/etc/at.deny
进行at的使用限制- 先寻找
/etc/at.allow
文件,写入这个文件的用户才能使用at,不在文件中的用户不可以使用(即使没有写入/etc/at.deny
文件,也不可以使用) - 如果
/etc/at.allow
文件不存在,就寻找/etc/at.deny
这个文件,写在/etc/at.deny
文件的用户不可以使用at,没有在/etc/at.deny
的用户就可以使用at - 如果两个文件都不存在,那么只用root可以使用at命令
- 先寻找
at的运行
输入
at
命令后,会进入at shell环境来让用户执行工作命令。所以,在at shell中最好使用绝对路径来执行相关命令。at的执行与终端机无关,所以所有的stdout和stderr都会传送到执行者的mailbox
at具有“后台执行”功能
查询当前at工作调度
使用atq
命令即可
atq
删除任务调度atrm
atrm [jobnumber] # jobnumber是atq命令查出的参数
CPU空闲时执行工作batch
当CPU工作负载(与当前CPU进行切换的进程数量有关)小于0.8时,才进行任务的执行
batch
是利用at来进行命令的执行,命令使用与at相似
循环执行的工作调度
启动crond服务
使用crond
系统服务来控制的,该服务Linux是默认启动的。
crond
服务的最低检测限制是“分钟”,所以服务会每分钟读取/etc/crontab
和/var/spool/cron
的数据内容。
设置完任务后,如果没有被执行,可以重启crond服务。
设置用户循环工作调度crontab
crontab的工作机理
将工作以文本文件的方式写入**
/var/spool/cron/
**目录内,该工作便等待crond服务的取用与执行与此同时,cron执行的每项工作都被记录到
/var/log/cron
日志文件中crontab的限制相关文件
与at类似,这里的文件是
/etc/cron.allow
、/etc/cron.deny
。cron工作的设置格式
输入
crontab -e
就会进入vi
的编辑界面。每项工作一行,可以分为6个字段:设置参数的一些辅助字符:
查询用户目前的crontab内容
crontab -l
删除任务
删除全部工作使用
crontab -r
删除部分工作,用
crontab -e
编辑文件删除
设置系统的循环工作调度
通过编辑/etc/crontab
文件,即可设置系统例行性工作调度。
唤醒停机期间的工作任务
anacron
anacron
是以天为单位或开机后立刻仅anacron
操作,会去检测停机期间应该进行但没有进行的crontab
任务,并将该任务执行一遍,然后anacron
就会自动停止。运行机理
anacron
读取时间记录文件(timestamps),分析现在的时间与时间记录文件所记载的上次执行anacron
的时间,两者比较后若发现有区别,那就是在某些时刻没有进行crontab
。此时anacron
开始执行未进行的crontab
任务。与
crontab
的关系/etc/anacrontab
进程
概念
在Linux系统中,触发任何一个事件时,系统都会将它定义成为一个进程,并且给予这个进程一个ID,即为PID,同时依据触发这个进程的用户与相关属性关系,给予PID一组有效的权限设置.
执行一个程序或命令,就可以触发事件而得到PID。程序一般是放置在磁盘中,通过用户的执行来触发。触发后会加载到内存中成为一个个体,那就是进程。为了操作系统可管理这个进程,进程有执行者的权限属性等参数,并包括进程所需要的脚步用户数据、文件等,最后操作系统再给予一个PID。系统就是通过PID判断进程是否具有权限进行某项工作的。
进程衍生出来的其他进程一般也会沿用这个进程的相关权限。
子进程与父进程
比如在bash下执行其他命令,这些命令有时候也会被触发成为PID,这个即为子进程,原来的bash环境则为父进程。
子进程与父进程的关系通过
PPID
参数判断。ps -l
命令输入后:子进程与父进程的调用
在Linux中称为
fork-and-exec
流程。父进程以fork的方式产生一个一模一样的子进程,被复制出来的子进程再以exec的方式来执行实际要进程的进程,最终成为一个子进程的存在。
后台进程设置
后台运行进程
丢入bash后台使用
&
command &
执行后会给出工作号码和command所触发的PID,如:
[1] 8400
后台的输出信息处理
使用数据流重定向,将数据流重定向到指定文件
command > outfilename 2>&1 &
暂停当前进程并丢到后台
如正在使用vim编辑文件,临时离开的情况
在vim的一般模式下,使用[Ctrl]+Z
,终端会输出类似下列输出
[1]+ Stopped
[1]表示工作号码,+
表示最近一个被丢进后台的工作(相对应,-
表示最近第二个被丢进后台的工作),Stopped表示进程工作状态处于暂停(相对应,Running
表示进程处于后台运行状态)
查看后台进程jobs
后台进程拿到前台fg
fg
后不接参数,默认取的是带有+
表示的工作
后台进程状态变为运行
[Ctrl]+Z
是变为后台暂停运行,bg
是让后台暂停的进程变为运行状态。使用方法同fg
bg %jobnumber
重启/删除后台进程kill
对于signal,主要了解1、9、15的用法。
另外,kill后面接的数字默认是PID,如果是bash的工作控制,则要使用%jobnumber
形式。
脱机管理
如果是远程ssh登录Linux,单单使用&
将进程后台运行,在会话结束时,进程也会关闭。需要使用nohup
将进程放入系统后台,而不是bash后台
注意,nohup并不支持bash内置命令,所以后面接的命令必须要是外部命令。
进程管理
进程查看
某一时间点系统进程查看ps
仅查看自己的bash相关进程
ps -l
- 进程标志和权限说明
- 4表示进程的权限为root
- 1表示此子进程仅可fork而无法实际执行(exec)
- 进程的状态
- R表示进程正在运行中
- S表示进程正在睡眠,可以被唤醒
- D表示阻塞,通常可能在等待I/O
- T表示停止状态
- Z表示“僵尸”状态,进程已经终止,但却无法被删除至内存外
- 进程被哪个UID拥有
- 进程的PID
- 进程的父进程PID(PPID)
- CPU使用率,单位为百分比
- PRI/NI和CPU,表示进程被CPU所执行的优先级。数值越小代表越快被CPU执行
- ADDR/SZ/WCHAN,和内存有关
- ADDR是kernel function,指出该进程在内存的哪个部分,如果是running进程,会显示
-
- SZ表示进程用掉多少内存
- WCHAN表示目前进程是否在运行中,如果是running进程,会显示
-
- ADDR是kernel function,指出该进程在内存的哪个部分,如果是running进程,会显示
- TTY表示登录者的终端机位置,若为远程登录则使用动态终端接口(pts/n)。
- TIME表示进程实际花费CPU运行的时间
- CMD,表示造成此程序的触发进程的命令为何
- 进程标志和权限说明
查看系统所有进程
ps aux
- USER,进程属于哪个用户账号
- PID
- %CPU,进程使用的CPU资源百分比
- %MEM,进程所占用的物理内存百分比
- VSZ,进程使用掉的虚拟内存量,单位KB
- RSS,进程占用的固定的内存量,单位KB
- TTY,进程的终端机位置,网络连接显示pts/n,和终端机无关则显示
?
- STAT,进程状态,
- START,进程被触发启动的时间
- TIME,进程实际使用CPU的时间
- COMMAND,进程的实际命令
僵尸进程
原因
该进程应该已经执行完毕,或是因故应该要终止了,但是该进程的父进程却无法完整将该进程结束,从而进程一直存在内存中
ps
相关命令查询时,在COMMAND后还有<defunct>
字样,即表示为僵尸进程处理僵尸进程一般需要杀掉其父进程,或者reboot
动态查看进程变化
top
进程相关性查看
pstree
可以看出,所有进程都是依附在init进程下面。
进程重启、关闭、删除
依然使用前面说过的kill
命令:kill -signal PID
还可以使用killall -signal command
场景的signal
如下:
进程的执行顺序
CPU具体执行哪个进程需要考虑进程的优先执行序(Priority)和CPU调度
进程的PRI和NI
进程的PRI即为优先级的意思,该值越低,越优先执行。
但是PRI由内核动态调整,用户无法直接调整PRI值,所以通过NI(nice)值来调整。最终的CPU执行优先级为:
PRI(final) = PRI(kernel) + nice
nice的值可调范围为
-20~19
- root可以调整其他人的nice值
- 一般用户仅可以调整自己的nice,且范围为
0~19
- 一般用户仅可以把nice值增大
- nice值可以在子父进程之前传递
设置程序初始nice值
调整进程nice值
特殊文件与程序
具有SUID/SGID权限的命令执行状态
SUID的权限会生效是由于具有该权限的程序被触发
比如passwd执行后,就具有root的权限。触发passwd后,会取得一个新的进程与PID,该PID产生时通过SUID来给予该PID特殊的权限设置。
/proc/*
目录的意义
所有的进程存在内存中,内存中的数据又是写入到/proc/*
目录下。
查找正在使用某文件的程序fuser
列出被进程所打开的文件名lsof
找到正在执行的进程的PID
系统资源管理
查看内存使用情况free
查看内核相关信息uname
查看系统启动时间和负载uptime
跟踪网络netstat
比较常用的有,查看哪些进程启动了网络连接/占用网络端口
分析内核产生的信息dmesg
特别是开机检测硬件的一些信息等。
dmesg | more
检测系统资源变化vmstat
可以检测CPU/内存/磁盘输入输出状态等
SELinux
概念
Security Enhanced Linux之意,是在进行程序、文件等权限设置依据的一个内核模板。由于网路服务也是程序,刚好也能够控制网络服务能否访问系统资源。
依据进程的所有者与文件资源的rwx
权限来决定有无访问文件系统能力的方式,被称为“自主访问控制”(Discretionary Access Control,DAC)。在某些情况会有问题,如root具有最高的权限、用户可以取得进程来更改文件资源的访问权限等
为了避免上述问题发生,SELinux导入强制访问控制(Mandatory Access Control,MAC)的方式。可以针对特定的进程与特定的文件资源来进行权限的控制。将权限控制的主体,从用户变成 了进程。
运行原理
SELinux的目标是:该进程能否读取文件资源
主体
SELinux主要想管理的就是进程
目标
SELinux想访问的是文件系统
策略
SELinux会依据某些服务来制定基本的访问安全性策略。主要有两个:
- targeted:针对网络服务限制较多,针对本机限制较少。是默认策略
- strict:完整的SELinux限制,限制方面较为严格
安全上下文
主体与目标的安全上下文必须一致才能顺利访问。
安全上下文有点类似
rwx
。进程的安全上下文存在内存中,文件的安全上下文放置到文件的inode内。进程的安全上下文使用
ps -Z
查看,文件的安全上下文使用ls -Z
查看:以
:
隔开为3个字段身份标识(user)
- root,标识root的账号身份
- system_u,标识系统程序,通常就是进程
- user_u,标识一般用户账号的身份
角色(role)
表明这个数据是程序、文件资源还是用户
- object_r:代表文件或目录等文件资源
- system_r:进程,一般用户
类型(type)
在文件资源上称为type,在进程上称为domain。
主体与目标之间是否具有可以读写的权限与进程的domain及文件的type有关。
如httpd_exec_t的domain,可以访问httpd_sys_content_t这个type的文件
SELinux启动、关闭和查看
SELinux查看
查看运行状态
并不是所有的Linux distribution都支持SELinux。SELinux支持三种(状态)模式:
- enforcing,强制模式,代表SELinux正在运行,且已经正确开始限制domain/type
- permissive,宽容模式,点SELinux正在运行,不过仅会有警告信息并不会实际限制domain/type的访问。**这种模式可以用来作为SELinux的调试
- disabled,关闭状态,SELinux没有运行
使用
getenforce
进行SELinux状态查看查看策略等信息
使用
sestatus
进行SELinux状态查看。SELinux的配置文件是
/etc/selinux/config
效果如图:
SELinux启动与关闭
SELinux的运行状态、策略等更改时,需要重新启动SELinux
启动SELinux,需要编辑配置文件
/etc/selinux/config
配置完后,在内核文件查询是否已经开启。如果要开启SELinux,不可以在kernel行出现selinux=0的字样。
SELinux模式在enforcing和permissive之间切换
setenforce
注意,
setenforce
无法在Disabled模式下面进行切换。
安全上下文的设置和查看
安全上下文的配置文件目录是/etc/selinux/targeted/
安全上下文的查看
进程的安全上下文使用
ps -Z
查看文件的安全上下文使用
ls -Z
查看
httpd这个进程拥有的httpd_t这个domain去读取index.html文件时,就会看是否和文件的type匹配。
修改文件的安全上下文chcon
文件的默认安全上下文的查询与修改semanage
文件的安全上下文恢复默认值restorecon
SELinux的策略与规则管理
策略相关的配置文件目录是/etc/selinux/targeted/
策略详细信息查询seinfo
策略的信息包括:所有类型、所有角色、所有身份标识、所有规则(布尔值)。
详细规则(布尔值)查询sesearch
布尔值状态查询getsebool
布尔值关闭或开启setsebool
SELinux的输出信息
SELinux在发生错误时,有几个服务会记录这些信息
setroubleshoot
,将错误信息写入/var/log/messages
设置服务开启:
发生错误时,可以查看:
cat /var/log/messages | grep setroubleshoot
audit
,将详细数据写入/var/log/audit/audit.log
与
setroubleshoot
不同的是,auditd
会将所有信息记录下来,不仅仅是错误信息。设置服务开启:
可以使用
audit2why
进行文件数据分析
服务
概念
常驻在内存当中的进程都负责一些系统所提供的功能以服务用户各项任务,因此这些常驻进程就会被称为服务(service)。执行service的程序或进程称之为daemon。
服务的分类
按照daemon启动与管理的方式分:
stand_alone,可自行单独启动服务
自行启动,不必通过其他机制的管理
值存在内存中,响应速度较快
super_daemon,通过这个特殊的daemon统一管理其他服务
当没有客户端的请求时,各项服务都未启动,等到有请求时,super daemon才唤醒相对应的服务。当请求结束后,服务也会关闭并释放系统资源。
有两种具体的工作状态:
多线程
super deamon同时负责多个进程
单线程
super deamon一个一个处理请求
按照daemon工作状态的方式分:
signal-control
通过信号来管理,有请求进来会立即启动去处理
interval-control
每个一段时间主动执行某项工作。
daemon的命令规则
服务名称后,通常会加一个d
,{xxx}d。
服务的端口号
在配置文件**/etc/services**中,写了服务与端口号的对应关系。格式为:
<daemon name> <port/数据包协议> <服务的说明>
服务的启动
服务的脚本文件
Linux distribution提供了服务的shell script文件来就进行启动和配置。
/etc/init.d/*
,启动脚本放置处/etc/sysconfig/*
,服务的初始化环境配置文件/etc/xinetd.conf, /etc/xinetd.d/*
,super daemon配置文件/etc/*
,各服务的配置文件/var/lib/*
,各服务产生的数据库/var/run/*
,各服务的程序PID记录处
Stand_alnoe的/etc/init.d/*的启动
/etc/init.d/*
下文件名直接启动service
命令启动service分析daemon后的参数,再去
/etc/init.d/*
取正确的服务来执行
由Super_daemon管理的启动
super_daemon是由xinetd
这个进程实现的,它管理的服务的配置文件在/etc/xinetd.d/*
下面,通过编辑服务文件的disable
字段来启动。
disable=yes #关闭服务
disable=no #开启服务
**xinetd管理的服务,有个默认的配置文件xinetd.conf
**。当启动的服务,没有设置配置文件里面的值时,则该配置文件的值就作为默认值。
设置开启立即启动服务
管理系统服务默认开启开启启动chkconfig
图形界面管理模式ntsysv
Red Hat系统独有,通过图像界面管理服务
自定义服务
定义好shell script文件后,放入/etc/init.d/
下面。文件有些格式要求:
chkconfig:[runlevels][启动顺序][停止顺序]
然后还是使用chkconfig
。
服务的查看
前面在Linux进程-系统资源管理-跟踪网络netstat
已经介绍过。查看端口即可查看相关服务。
服务的防火墙管理
防火墙,是针对源IP或域进行允许或拒绝的设置,以决定该连接是否能够成功实现连接的一种方式。
任何以xinetd管理的服务都可以通过/etc/hosts.allow和/etc/hosts.deny
来设置防火墙。通过TCP数据包分析出IP和Port(TCP Wrappers)并搭配这两个文件,就能决定连接是否可以进入主机。服务必须支持TCP Wrappers的功能,才能受这两个配置文件的限制。
查询程序是否支持TCP Wrappers
ldd $ (which service1 service2 ...)
若有
libwrap.so
这个函数库文件,即支持TCP Wrappers.配置文件语法
hosts.allow的优先级高于host.deny
配置文件第一和第二字段的特殊符号:
可以配合TCP Wrappers软件,配置文件做更复杂的操作
Linux应用程序
源码
Linux的软件几乎都是经过GPL的授权,所以每个软件几乎均提供源代码。
由于有些源码文件较大,所以一般软件的源码都是打包和压缩为Tarball文件,扩展名一般为
*.tar.gzip
或*.tar.bz2
。里面的文件通常包含:- 源代码文件
- 检测程序文件,可能为configure或config等文件名
- 本软件的建议说明与安装说明,INSTALL或README
Linux的软件
软件的命名也有一定的规范:
软件的安装和升级主要有两种模式:
- Red Hat系统(含Fedora/CentOs系列)开发的RPM软件管理机制与yum在线更新模式
- Debian使用的dpkg软件管理机制与APT在线更新模式等
RPM
全名是RedHat Package Manager,有如下优点:
- RPM内含已经编译过的程序与设置文件等数据,可以让用户免除重新编译的困扰
- RPM在被安装之前,会先检查系统的硬盘容量、操作系统版本等,可避免文件被错误安装
- RPM文件本身提供软件版本信息、依赖属性软件名称、软件用途说明、软件所含文件等信息,便于了解软件
- RPM管理的方式使用数据库记录PRM文件的相关参数,便于升级、删除、查询与验证。
软件默认安装路径
安装软件完毕后,软件相关信息被写入
/var/lib/rpm/
目录下的数据库文件中软件内的文件的位置:
一般情况:如果是应用软件:
/usr/local
;如果是系统相关:/usr/sbin
,/usr/bin
等。具体可以使用rpm -ql softwarename
查看。
RPM安装软件
安装软件必须先取得root权限。
其他的参数:
RPM升级与更新
不过一般是使用yum来进行软件的升级更新。
RPM软件查询
查询使用RPM安装的软件的信息。
本质是去查询/var/lib/rpm/
目录下的数据库文件。
RPM卸载软件与重建数据库
卸载的时候,很容易发送软件依赖属性导致无法删除的情况。所以删除的时候一定要从最上往下删除。
rpm -e softwarename
在RPM安装、删除、升级等过程中,可能会破坏/var/lib/rpm/
目录下的数据库文件。可以进行数据库重建:
rpm --rebuilddb
YUM
yum是通过分析RPM的标题数据后,根据各软件的相关性制作出属性依赖时的解决方案,然后可以自动处理软件的依赖属性问题,以解决软件安装或删除与升级问题。
yum的查询软件
yum安装和升级软件
yum删除软件
yum remove softwarename
yum的配置文件
Shell
程序编辑器
Vi
所以UNIX Like系统都会内置Vi
文本编辑器,很多软件等编辑接口也都会主动调用vi
。
模式
分为一般模式、编辑模式与命令模式三种。
一般模式
以
vi
命令打开一个文件就直接进入一般模式了。可以进行删除、复制、粘贴等操作(但不会改变文件内容)
编辑模式
在一般模式,按下
i, I, o, O, a, A, r, R
按键进入,可以编辑文件内容。命令行模式
在一般模式,输入
:
、/
、?
,光标移动到最下面一行,输入相关参数可以进行查找数据等操作。
按键说明
- 移动光标
一般模式切换编辑模式
一般模式切换到命令行模式
Vim
概念
Vim
是Vi
的高级版本,Vim
可以使用颜色或底线等方式来显示一些特殊的信息,还支持正则表达式的查找架构、多文件编辑、块复制等。
块选择
- 使用
vim
打开文件 - 使用按键移动光标到预选块左上角
- 按下
[Ctrl] + V
后将光标移动到预选块右下角 - 按下
y
进行复制 - 按下
p
进行粘贴
多文件编辑
多窗口
Shell概念
硬件、内核与Shell
我们必须通过shell
将我们输入到命令与内核通信,好让内核可以控制硬件来正确无误的工作。
Shell
的功能只是提供用户操作系统的一个接口,因此Shell
需要可以调用其他软件。即只要能操作应用程序等接口都能称为shell
.
Linux的Shell
在/etc/shells
文件中定义了可用的shell
。
/bin/sh
,已经被/bin/bash
所代替/bin/bash
,Linux的模式shell,基于GNU架构/bin/ksh
,Kornshell由AT&T Bell lab.发展出来,兼容bash/bin/tcsh
,整合C Sehll,提供更多功能/bin/csh
,已经被/bin/tcsh`所替代/bin/zsh
,基于ksh发展出来,功能更强大的shell
bash
内置了很多命令,可以利用type
判断是否是内置命令。
Shell变量
程序、变量与不同用户的关系:
注意,后面命令别名、自定义的变量,如果没有进行保存操作(Bash Shell小节会说),在注销bash后会失效。
变量的显示与设置
显示
echo ${var}
设置
var=value
注意:
等号两边不能接空格
变量内容有空格,可以使用双引号或单引号
若变量需要在其他子进程执行,需要使用
export
命令子进程仅会继承父进程的环境变量,子进程不会继承父进程的自定义变量
export
即是将自定义变量转换为环境变量通常大小自负为系统默认变量,自行设置变量可以使用小写字符
设置数字变量
var[index]=content #数组名字为var,下标为index,内容为content
取消设置
unset varname
环境变量
evn
命令查看环境变量
set
命令查看所有变量
含环境变量与自定义变量
export
即是将自定义变量转换为环境变量
变量相关操作命令
语系变量locale
查看系统支持的所有语系
locale -a
查看语系相关设置编码
locale
读取键盘输入的变量read
声明变量类型declare
设置字符串时,默认变量类型为字符串。
变量的删除、替换
变量的测试与内容替换
命令别名
设置别名
alias newName=originName
查看别名
alias
删除别名
unalias aliasName
Bash环境和操作
路径与命令查找顺序
当同一个命令名对应不同文件时,查找顺序如下:
- 以相对/绝对路径执行命令
- 由alias找到该命令执行
- 由bash内置的命令来执行
- 通过PATH环境变量的路径找到的一个命令来执行
登录和欢迎信息
登录提示信息文件
/etc/issue
放置本地登录信息这个文件可以使用反斜杠作为变量调用。
/etc/issue.net
放置远程登录信息
欢迎信息
登录完成后,告诉登录者的信息。在
/etc/motd
文件放置。
环境配置文件
bash Shell有两种登录方式
login shell
取得bash时需要完整的登录流程的,即为login shell。
这种方式登录时会读取
/etc/profile
和~/.bash_profile或~/bash_login或~/.profile
。前者为系统整体设置,后者为用户个人设置。non-login shell
取得bash接口的方法不需要重复登录时,如在图形界面登录后启动终端机,此时终端机的环境即为non-login shell。bash下产生的bash子进程也是这个情况
login Shell
系统配置文件
/etc/profile
每个用户登录后取得bash时一定要读取的文件。下面是这个文件中主要的几个变量:
- PATH:会依据UID决定PATH变量要不要含有sbin的系统命令目录
- MAIL:依据账号设置好用户的mailbox到
/var/spool/mail/账号名
- USER:根据用户的账号设置此变量内容
- HOSTNAME:依据主机的hostname命令决定此变量内容
- HISTSIZE:历史命令记录条数
此外,文件中还会调用其他的配置文件。
个人配置文件
在读取/etc/profile
后会继续读取个人配置文件。3个个人配置文件只会读取其中一个,读取顺序是:
~/.bash_profile
~/.bash_login
~/.profile
其中~/.bash_profile
中主要逻辑是判断~/.bashrc
文件是否存在,存在就读取。
non-login Shell
该方式登录bash仅会读取~/.bashrc
而已。
读取环境配置文件
修改上述配置文件后,通常需要注销和重新登录后生效。但是使用source
命令可以直接生效而不用重启.
source filename
. filename
通配符和特殊符号
通配符
特殊符号
数据流重定向
概念
命令执行的时候需要输入,执行完后需要将数据输出。具体从哪输入和输出到哪则可以进行设置。
- 标准输入(standard input, stdin):代码为0,使用<或<<
- 标准输出(standard output, stdout):代码为1,使用>或>>
- 标准错误输出(standard error output,stderr):代码为2,使用2>或2>>
数据流输出
不同符号的意义
- 1>:以覆盖的方法将正确的数据输出到指定的文件或设备上
- 1>>:以累计的方法将正确的数据输出到指定的文件或设备上
- 2>:以覆盖的方法将错误的数据输出到指定的文件或设备上
- 2>>:以累计的方法将错误的数据输出到指定的文件或设备上
常见用法
command > filename1 2> filename2 # 正确和错误数据分别输出到两个文件 command > filename 2>&1 # 正确和错误数据分别输出到同一个文件
/dev/null
垃圾桶这个黑洞设备可以吃掉任何导向这个设备的信息,即输入这里的信息将被丢弃。
数据流输入
stdin即是将原本需要由键盘输入的数据改由文件内容来代替
<
cat > outfilename < inputfilename
<<
代表输入结束的意思。
多个命令执行的判断条件
命令回传码$?
若一个命令执行的结果为正确,在Linux下面会回传一个**$?=0
**
判断条件
若有多个判断条件,Linux从左到右开始进行判断
管道命令
符号是|
,将多个命令连接起来进行处理
管道命令在使用时,每个管道后面的第一个数据一定是“命令”,且这个命令必须要能够接收数据。
管道命令的注意点:
- 管道命令仅处理stdout,忽略stderr
- 管道命令必须接收前一个命令的数据成为stdin来继续处理
注意减号-
的用途,在某些命令用到文件名的时候,stdin和stdout可以用-
来代替。
选取命令
cut
按自定义方式分割字符串并选取片段
grep
查找输入相关的字符串
排序命令
sort
uniq
对输出结果去重处理
wc
统计字符
双向重定向
同时将数据流送到文件与屏幕
字符串转换
tr
删除一段信息当中的文字,或是进行文字信息的替换。
后面的字符串可以是正则表达式
col
join
对比两个文件的数据相关性,并将两个文件当中有相同数据的行相加在一起
paste
直接将两个文件的两行贴在一起
expand
将[tab]转换为空格键
[tab]默认为8个空格
切割命令
将一个大文件依据文件大小或行数来切割为小文件
参数代换
xargs读入stdin的数据,并以空格或断行字符进行分隔为名的参数
正则表达式
正则表达式(Regular Expression)是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串。
基础正则
语系的设置
不同语系对正则的结果有影响,通常使用C语系即LANG=C
,兼容POSIX的标准。其有些特殊的符号如下。
基础正则字符表
扩展正则
相关工具
数据CURD工具sed
输出格式化工具
printf
awk
awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
相比于sed常常处理整行数据,awk可以分段处理,非常适合处理小型的数据处理。
awk可以后接文件处理,也可以处理前一个命令的stdout.
处理的每一行的字段内的数据,默认以空格键或[tab]键进行分隔。
每一行的字段都有变量名
$colum
,colum是第几列,其中$0
表示整行。awk的内置参数:
- awk的条件逻辑运算符
- 在awk中,shell变量可以直接使用,不用加上$符号
Shell Script
概念
shell script 是利用shell的功能所写的一个“程序”,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的。
shell script是直接利用shell与相关工具,所以不需要编辑即可执行。
基本语法
基本知识
- 命令的执行是从上而下,从左而右地分析与执行
- 空白行会被忽略掉,并且[tab]键所得到的空白同样是为空格键
- 读取到一个Enter符号(CR),就尝试开始执行改行命令
- 一行内容太多,可以使用
\[Enter]
换行 #
视为批注
执行命令的方法
执行sh文件必须具备可读与可执行(rx
)权限!
分为执行命令的方式有两大种,其中第一种又分3种。
使用bash
bash shell.sh 或 sh shell.sh
- 绝对路径执行
- 相对路径执行
- 放置到PATH或其已经写入的目录下,直接输入sh文件名执行
这种方式执行,script会使用一个新的
bash
环境来执行命令,即script是在bash的子进程执行的。所以在script中设置的变量不会传回到父进程中。利用source或
.
source shell.sh
这种方式执行,script直接在父进程中执行,所以script中定义的变量会生效。
sh文件分析
第一部分,声明,说明这个script使用的shell名称
bash在执行的时候会加载相关的配置文件,一般是non-login shell的
~/.bashrc
。第二部分,批注,程序内容的说明
第三部分,主要环境变量的说明
一般来说声明PATH和LANG,以使用外部命令
第4部分,主要程序部分
第5部分,告知执行结果
exit n表示中断程序并回传一个值个系统。后面的命令使用
$?`即可得到这个值。
sh的默认变量
使用特殊符号,读取sh文件后接的输入参数。
按整条命令的参数顺序,依次为
$0
、$1
等(从bash/sh的下一个参数开始)一些特殊符号:
$#
,表示sh文件后面接的参数的个数$@
,表示sh文件的所有参数$*
,表示$0c$1c$2
,其中c为分隔符,默认为空格键
shift
,造成参数变量号码偏移
逻辑语法
条件判断
两个可以写在条件里面的判断式:
测试命令Test
检测某个文件是否存在、是否有特定属性权限、基本大小判断等等。
判读符号[]
返回结果只有真和假,可以结合
&&
和||
使用一些注意事项:
- 中括号的两端需要有空格符来分割
- 中括号内的每个组件都需要有空格键来分隔
- 中括号内的变量,最好都以双引号括起来
- 中括号内的常量,最好都以单或双引号括起来
一些参数:
-o
参数,在中括号里面相当于“或”
下面就是具体的条件表达式:
if...then
case..esac
一个列子:
循环
不定循环:
while do done
until do done
固定循环:
for...do...done
函数
语法
由于shell script的执行方式是由上而下、由左而右,所以function的设置一定要在程序的最前面。
内置参数
函数名称用
$0
表示,后续节点变量依次用$1
、$2
等表示。后面接参数的形式是:
fname opt1 opt2 opt3 ...
shell script的追踪与调试
Shell其他相关命令
Shell资源限制命令ulimit
查看历史输入命令history
- 历史命令记录在
~/.bash_history
文件中 ~/.bash_history
记录的命令个数和bash的HISTSIZE
变量有关。
设置终端机环境stty/set
- 设置按键代表的含义等
stty function Key
#例如: stty erase ^h,^代表[Ctrl]
- 设置Bash的终端机环境
文件比较命令diff/cmp/patch
diff
以行为单位进行文件比较
cmp
利用字节为单位进行比较,可以比较二进制文件
patch