一、引言

操作系统有个内核,负责管理系统的进程、内存、设备、文件和网络等资源。操作系统还有个 shell,为用户提供与内核交互的途径。shell 可以分为 GUI(图形界面)和 CLI(命令行)两种,GUI 以 windows 为代表,CLI 以 linux 为代表。linux 也有 Gnome 桌面,但效率和性能不如 CLI,学 linux 必学 CLI。

CLI 是用户与内核打交道的工具。用户日常使用操作系统,最频繁的场景就是文件操作和网络访问。故而基础篇笔记主要记录 CLI 基本操作、文件系统、网络配置、权限管理等相关知识点。

二、CLI 基本操作

(一)查看目录

  • ls:显示指定目录下的文件及属性信息
  • pwd:显示当前工作目录的路径

(二)查看内容

  • echo:输出字符串或变量值(变量前加 $ 符号)
  • cat:输出文件内容
  • head:查看文件头部内容
  • tail:查看文件尾部内容,-f 将持续追踪文件尾部追加的内容
  • more:分页显示文件内容,只能向后翻页,不能往前回翻
  • less:分页显示文件内容,可以向后看,也可以向前看

(三)开关机

  • shutdown:按指定方式关闭系统
  • poweroff:关机
  • reboot:重启

(四)归档压缩

  • zip:打包成 zip 文件
  • unzip:zip 文件解包
  • tar:压缩和解压缩文件

(五)文件和目录操作

  • locate:基于数据库快速查找文件和目录,手动更新数据库使用 updatedb 命令
  • find:根据条件在指定目录下查找文件和目录
  • cp:复制文件或目录
  • mv:移动文件或目录
  • cd:切换目录
  • mkdir:创建目录
  • touch:创建空文件
  • rm:删除文件或目录
  • rmdir:删除空目录

(六)进程操作

  • &:命令 + 空格 +&,会将任务置于后台执行
  • jobs:查看后台任务
  • fg:将后台任务放到前台执行
  • bg:将前台任务放到后台执行,前台任务可通过 ctrl+z 暂停
  • ps:查看系统当前的进程状态
  • kill:终止进程

(七)命令帮助

  • history:查看历史命令记录
  • man:查看命令的帮助手册,一般情况下命令加 -h 或–help 够用了

(八)文本编辑

  • grep:搜索文本,可使用关键字或正则表达式
  • sed:编辑文本,可使用正则表达式或脚本
  • cut:基于列处理文件内容
  • wc:统计文件行数、单词数、字符数等信息
  • diff:比较文件内容差异
  • vim:linux 最常用的文本编辑工具,使用时分为三种模式(命令模式,插入模式,末行模式),各种模式切换方式如图:
graph TB
    A[命令模式] --> |i| B[插入模式]
    B[插入模式] --> |Esc| A[命令模式]
    A[命令模式] --> |:| C[末行模式]
    C[末行模式] --> |Esc| A[命令模式]

(1) vim 命令模式常用命令:

  • dd:剪切光标所在整行
  • yy:复制光标所在整行
  • p:将剪切或复制内容粘贴到光标处
  • o:插入新行
  • u:撤销上一步操作
  • n:定位到搜索结果的下一个字符串
  • N:定位到搜索结果的上一个字符串

(2) vim 末行模式常用命令:

  • :w 保存修改
  • :q 退出 vim
  • :q! 放弃修改,强制退出 vim
  • :x 保存并退出 vim
  • :set nu 显示行号
  • :set nonu 不显示行号
  • : 整数 跳转到指定行
  • :/ 字符串 搜索字符串

(九)管道和重定向

linux 的标准数据流包括输入流 stdin(0)、输出流 stdout(1)、错误流 stderr(2),默认情况下 stdin 接受键盘输入,stdout 和 stderr 将结果和错误输出到命令行终端。

通过管道和重定向操作符,可以控制标准数据流的来源和去向:

分类 操作符 定义 示例
重定向 > 将 stdout 输出到文件(覆盖模式) echo ‘test’ > file
重定向 >> 将 stdout 输出到文件(追加模式) echo ‘test’ >> file
重定向 2> 将 stderr 输出到文件(覆盖模式) cd /dev/null > file
重定向 2>&1 将 stderr 和 stdout 输出到文件(覆盖模式) cd /dev/null 2>&1 file
重定向 < 将文件输入到 stdin grep user < file
管道 &#124 将前一个命令的 stdout 作为后一个命令的 stdin echo ‘hello world’ &#124 grep ‘hello’

三、文件系统

(一)linux 文件目录结构

linux 下一切皆文件(普通文件、目录文件、设备文件、管道文件……),linux 文件系统不区分磁盘(windows 通常分 C 盘 D 盘,cmd 切换跨盘目录时,需要先切换盘符),整个 linux 系统目录是以 / 为根节点的单根树结构,遵循 FHS 标准规范:

graph TB
    A["/"] --> B[bin] & C[boot] & D[dev] & E[etc] & F[home] & G[lib] & H[mnt] & I[opt] & J[proc] & K[root] & L[sbin] & M[tmp] & N[usr] & O[var]
    N[usr] --> N1[bin] & N2[lib] & N3[local]
    O[var] --> O1[cache] & O2[log]

各目录的简要说明如下:

/: 根目录
/bin: 存放二进制可执行文件,root 用户和普通用户都能使用
/boot: 存放 linux 启动时的引导程序
/dev: linux 的设备也是以文件形式组织,存放在此目录下
/etc: 存放 linux 的系统管理和配置文件
/home: 存放普通用户的家目录,类似于 windows 下 C 盘 Users 用户文件夹
/lib: 存放程序运行依赖的库文件和内核驱动模块
/mnt: 设备挂载目录
/opt: 三方软件或大型软件的安装目录
/proc: 虚拟文件系统,记录系统实时信息,只存在内存中,不占用磁盘空间
/root: root 用户的家目录
/sbin: 存放二进制文件,仅 root 用户有权限使用
/tmp: 临时目录,重启系统会自动删除
/usr: 不是 user 缩写,是 unix software resource 缩写,存放系统上安装的软件资源
/var: 存放系统中经常变动的文件,如缓存 cache、日志 log、邮件 mail 等

(二)分区 - 格式化 - 挂载

linux 添加一个新的磁盘设备时,由于 linux 一切皆文件,需要将磁盘格式化为指定的文件系统,然后挂载到 linux 的系统目录中才能使用。相关的常用命令如下:

  • df:查看系统上磁盘的使用情况
  • fdisk:磁盘分区工具,只支持 MBR 类型
  • parted:磁盘分区工具,支持 MBR 和 GPT
  • mkfs:格式化文件系统(包括 ext2、ext3、ext4、xfs、btrfs 等)
  • mount:把文件系统挂载到指定系统目录,重启后挂载失效,永久挂载需修改 /etc/fstab 配置
  • umount:卸载文件系统,如果文件系统正在使用,会出现 device busy 问题
  • fuser:查看使用文件系统的进程
  • lsof:查看被打开的文件

四、权限管理

(一)用户和组

linux 是服务器的主流操作系统,服务器通常由很多人同时使用。为不同的用户分配各自的操作权限,对维护系统的安全和稳定来说是十分必要的。

linux 的用户分为 root 用户、系统用户和普通用户,每个用户用唯一的 uid 标识,root 用户的 uid 为 0,系统用户的 uid 通常在 1~999,普通用户的 uid 通常 >=1000。系统用户主要用于执行系统程序,无法使用 shell 登录。

为了便于对用户进行管理,每个用户还有对应的用户组,包括主组和附加组,主组只能有一个,附加组可以有多个。默认情况下,创建用户时,会将用户归属于同名的主组。

linux 上用户和用户组的信息都保存在 /etc 目录下,相关命令和文件说明如下:

  • id:显示用户与用户组信息
  • passwd:修改用户密码
  • useradd:创建用户
  • groupadd:创建用户组
  • userdel:删除用户
  • groupdel:删除用户组
  • /etc/passwd:用户账号信息
  • /etc/shadow:用户密码信息(已加密)
  • /etc/group:用户组信息

(二)普通权限

linux 定义的普通权限有 r(读)w(写)x(执行)三种,对文件来说很容易理解,对文件夹来说,要浏览目录需要同时开启 r 和 x 权限,x 表示可以通过 cd 进入目录。

linux 通过 UGO 模型对文件进行权限控制,其中 U(user)表示文件所属用户,G(group)表示文件所属用户组,O(other)表示既不是所属用户也不是所属用户组的其他群体。

通过 ls -l 查看文件权限如上图所示,第一列权限信息包含 10 位字符,第三列表示文件所属用户(属主),第四列表示文件所属用户组(属组)。权限信息中,第 1 个字符表示文件类型(- 表示文件,d 表示文件夹,l 表示符号链接),后面 9 个字符每 3 个一组,分别描述属主(user)权限、属组(group)权限、其他(other)权限。权限位是 rwx 表示具有相应权限,权限位是 - 表示没有相应权限。除了以字符的方式,每组权限还可以用 3 个 bit 位来表示,r 在高位,w 在中位,x 在低位,于是 rwx=b111=4+2+1=7。在修改权限时,可以使用任一种表达方式。

在创建文件或文件夹时,系统会设定默认的权限,通过原始权限减去权限掩码的方式,可以得到默认权限。文件夹的原始权限是 777(rwxrwxrwx),文件的原始权限是 666(rw-rw-rw-)。普通用户的默认掩码是 002,root 用户的默认掩码是 022。因此,对普通用户来说,新建文件夹的权限是 775(rwxrwxr-x),新建文件的权限是 664(rw-rw-r–)。

常用的权限修改命令如下:

  • chown:修改文件的属主
  • chgrp:修改文件的属组
  • chmod:修改文件的权限
  • umask:管理权限掩码

(三)特殊权限

除了 rwx 三种普通权限外,还有三种特殊权限:

权限 对文件影响 对目录影响
suid 以文件所属用户的权限执行,而非执行文件的用户权限
sgid 以文件所属用户组的权限执行(用法较少) 该目录中创建的任意新文件的所属组与该目录的所属组相同
sticky 对目录拥有写入权限的用户仅能删除该用户拥有的文件,无法删除其他用户拥有的文件

特殊权限设置方式:

  • chmod u+s file # user 组权限 x->s
  • chmod g+s folder # group 组权限 x->s
  • chmod o+t folder # other 组权限 x->t
  • chmod 7777 folder # drwsrwsrwt,suid=4,sgid=2,sticky=1

五、网络配置

(一)IP- 子网掩码 - 网关 -DNS

IP(v4) 编码用来标识互联网中的机器地址,它包含 32 个 bit 位,由网络地址 + 主机地址两部分组成。

子网掩码用来将 IP 地址切分为网络地址和主机地址,它也由 32 个 bit 位构成,且高位为连续的 1。子网掩码与 IP 地址成对出现,子网掩码与 IP 地址进行按位与运算可得网络地址。例如 IP 地址 192.168.1.1,子网掩码 255.255.255.0,可以算出网络地址为 192.168.1.0,可分配的主机地址包括 1~254(255 转换成 bit 位全为 1,全 1 的主机地址保留为广播地址),这一网段可以记为 192.168.1.0/24。同一网段的机器通信使用 ARP 协议,将 IP 地址解析为 MAC 地址,再基于 MAC 通信。

不同网络的主机之间进行通信需要使用网关,比如常见的路由器。网络 A 中的主机 A1 要跟网络 B 中的主机 B1 通信,主机 A1 需要先将数据包发送到 A 的网关,再由 A 的网关转发到 B 的网关,然后 B 的网关把数据包发送到主机 B1。现实中,跨域网络通信可能经过很多次路由器转发。

在互联网冲浪的时候,敲在地址栏里的是一串字符组成的域名。访问一个域名,实际上访问的也是互联网的一台主机。域名和 IP 的映射关系,通过 DNS 服务器进行解析,DNS 协议可以将域名解析为 IP 地址。

(二)相关命令和配置文件

  • ifconfig:查看和设置网络设备,重启后会失效,永久配置需要修改配置文件
  • hostname:查看和设置系统的主机名
  • ping:测试本机与目标主机之间的网络连通性
  • host:解析域名的 IP 地址
  • traceroute:追踪网络数据包的传输路径
  • mtr:网络诊断工具
  • ip route:查看路由表
  • /etc/sysconfig/network-scripts/ifcfg-eth0:网卡 eth0 的配置信息
  • /etc/resolv.conf:DNS 配置文件
  • /etc/sysconfig/network:主机名配置文件
  • /etc/hosts:静态主机名配置文件