课程内容#
目录结构#
-
-
-
最上头的 root 为根目录 /,不是 root 用户
-
此外,在根目录 / 下还有一个 root 文件夹,是 root 用户的家目录
- 除了 root 用户,其它用户都无法进入
-
bin、sbin 二进制 /[系统的]
-
etc 配置文件夹【全局】
-
opt 可选的,存在意义不是很强,用户可选择地放文件
-
run 当前正在跑的文件,一般不关注
-
var 动态数据
- mail 系统的通知机制,不是 e-mail
- log 日志【重要,勿修改】
- 查看信息一般需要 sudo 权限,一般要查看 error、warning 的位置
- last 显示的登录信息就存放在 wtmp 文件中
-
boot 内核文件,启动相关
-
home 所有用户的家的父目录
- 用户的家都在 home 下,路径为 ${HOME} 或~
-
lib、lib64 库
-
media 媒体 [早期挂载软盘、光驱用,U 盘不在这,现在都用得少了]
-
mnt 挂载目录
- 挂载其它的文件系统,如 U 盘、WSL 中的 CD... 盘
- 约定俗成的挂载点,不会自动挂载,也可以有其他任意位置的挂载点
-
proc 进程
- 通过 ps 查看对应进程 id 后,可在 proc 目录下找到对应 id 的目录
- 目录里的文件大都是 0KB,因为都不是真的,只是为了显示
- 其中有一个 fd 目录→文件描述符 file descriptor
-
- 可以往 stdout【#1】输入 abc,即会在终端显示
- 暂时不管 10 是做什么的
-
-
tmp 临时文件夹
- 关机就会清空,不是缓冲
- [PS] tmpfile 命令,可创建临时文件,参考 man tmpfile
-
dev 设备文件
-
usr用户主动安装的文件
- 一般是管理员用户,普通用户无法安装软件
- local 共享文件 [手册...]
启动流程#
- 👉按下开机键
- 👉加载BIOS:硬件检测 [CPU、磁盘、内存条等],读取配置 [系统安装位置等],直到读取 MBR
- BIOS—— 基本输入输出系统,基于 CMOS 芯片的固件
- 固件是基于软件和硬件的,将一些程序固化 [烧制] 在一个芯片上
- 一直上电的 [纽扣电池],掉电就会初始化
- BIOS—— 基本输入输出系统,基于 CMOS 芯片的固件
- 👉读取第一个可启动设备内的 MBR [主引导分区]
- 存储了引导程序 Boot Loader
- 加载 kernel:检测硬件,加载驱动
- 此时 kernel 接手 BIOS 的工作
- 👉执行引导程序 [Ubuntu:Grub]
- 加载虚拟文件系统,把内核 kernel 跑起来
- 👉初始化磁盘,读取系统镜像文件
- 👉启动 1 号进程
- 早期叫 init,现在叫 cnd
- 此时系统有自己的功能了
- 👉加载磁盘,挂载数据,启动各种服务,连接终端
- 👉【最后】运行 x windows 系统→有图形化界面
运行级别#
Linux 下,不同的运行级别对应不同的服务来启动系统
run level | 含义 | 备注 |
---|---|---|
0 | halt | 系统关机 |
1 | single user mode | 在系统出问题时维护用,类似安全模式 |
2 | multi-user, without nfs | nfs:network file system |
3 | full multi-user mode | 完整的多用户纯文本模式【常用】 |
4 | unused | 系统保留,没有用 |
5 | X11 | 在 run level 3 的基础上加载 X windows |
6 | reboot | 重启 |
- 启动方式发展
- System V [依次启动]
- Upstart [分组启动,没有依赖关系的服务可以同时启动]
- Systemd [全部服务一起启动,有依赖关系的服务再稍稍滞后,进一步提高并发性]
- 系统启动速度并不代表系统性能的好坏,如大型机器,几年重启一次,要好好检查一下硬件
- 热启动:在没有必要的情况下,跳过 BIOS 的硬件检测过程,加快启动速度
配置文件#
文件系统#
- /etc/fstab 开机时挂载的文件系统
- 静态文件系统信息,指示需要挂载的系统盘
- 如:需给公司机器挂载一个其它的磁盘,可以在这设置
- /etc/mtab 当前挂载的文件系统
用户系统#
- /etc/passwd 用户信息
- 不仅有普通的用户,还有非常多系统用户
- 用户:密码占用符:uid:gid: 用户描述:家目录:默认 shell
- 以前密码占用符存放密码,现在放在👇
- /etc/shadow 用户密码
- 显示的密码加密了,解密成本也许大于获取的价值
- /etc/group 群组信息
- /etc/gshadow 群组密码
- 基本不用,root 来管整个体系即可,没必要细分到组
- /etc/sudoers Sudoer 列表
- % 代表组
- 可自己添加
Shell#
- echo ${SHELL} 查看该用户的 Shell 类型
- /etc/shells 可用的 Shells 列表
【针对 zsh】
- /etc/zsh/zprofile 用户首选项【全局】
- ⭐在 man zsh 里搜索 ——FILES,即可看到所有可配置 zsh 的文件路径
- 举例:在 4 个全局配置、4 个用户配置里 echo "In ..."
- 在用户登录 zsh 时,显示顺序如下:
-
- 顺序:zshenv→zprofile→zshrc→zlogin,先全局 (G),再用户 (L)
- [PS] 用户配置文件
- $ZDOTDIR/.zshenv
- $ZDOTDIR/.zprofile
- $ZDOTDIR/.zshrc
- $ZDOTDIR/.zlogin
- $ZDOTDIR/.zlogout
- $ZDOTDIR—— 默认为用户的家目录
系统环境#
- /etc/environment 环境变量
- PATH 环境变量:${PATH}
- which 命令,会在这【PATH 环境变量】里面的路径找命令对应的文件【文件需可执行】
- ⭐PATH 添加路径 ".":PATH=${PATH}:.
- 可直接在 PATH 变量后添加:.,即可连接
- 还可使用 export PATH=${PATH}:.
- ❗ 但两种方式都是在内存中修改,重连 shell 后就会消失
- 详见下 2 节 —— 环境变量
- /etc/updatedb.conf 文件检索数据库配置信息
- updatedb 更新数据库 [更新后,可以使刚被创建的文件被 locate 找到,数据库不是实时更新的]
- /etc/issue、/etc/issue.net 发行信息、[远程登录时的显示]
- /etc/os-release 更详细的系统信息
网络#
- ⭐/etc/hosts 主机列表
- 也叫静态 DNS,可以写对应关系
- ❗ 域名 [主机名]→IP 地址
- [自己的理解] 类似 windows 的 hosts,对于一个名称的解析先找 hosts,再使用 DNS
- /etc/hostname 主机名
- ①需要 sudo 权限修改→新的主机名
- ②重启主机;或者使用 [hostname 新的主机名]临时修改内存中的主机名,否则改了后,环境里的主机名并没有变
- ③再重连即可
- [自己的理解] 第①步改的是真正的主机名,第②步 hostname 用来临时修改内存里的主机名,直接重启也可刷新内存
- ⭐/etc/resolv.conf 域名解析服务器地址
- DNS 动态域名服务器
- ❗ 域名→IP 地址
- /etc/network/interfaces 网卡配置文件,先自行查看
环境变量#
- env 所有环境变量,命名通常为大写字母
- 通过 $ 加上环境变量的名称,即可调用
- PATH 可执行文件夹的路径
- OLDPWD 上次工作目录
- HISTSIZE 保存的历史记录大小 [输入命令]
- bash 默认保存 1000 行
- zsh 暂时没有该变量
- 通过 history 可以查看输入的命令历史,无痕浏览自行搜索
- export
- export PATH=${PATH}:.
- 等同于 PATH=${PATH}:.
- 相比直接给环境变量赋值,export 更规范
- 这是在内存中修改,如果想固化该变量,每次连接都生效,可在任意【配置文件】中添加上述语句,zsh 的配置文件详见上 3 节 ——Shell
- [PS] 可通过 set 查看所有本地定义的环境变量
软件管理#
- 源码安装
git clone XXXX # 下载源代码
cd XXX
make # 编译
make install # 安装
- 软件包管理系统
- ⭐推荐 apt:它可以被理解为 apt-get 和 apt-cache 的高级集成版
- man apt 可以看到其描述:高级、比 apt-get、apt-cache 交互性更好
- 举例:
随堂练习#
代码演示#
附加知识点#
- shell 中声明定义的变量存储在内存中,在进程空间里,将 shell 关闭再打开,变量就没了
- 不要把一切皆文件的概念理解过头了,文件是静态的,需要进程来维护文件,使动态化
- 变量存储在进程空间里
- ps 可以看到进程 ID
- ⭐使用 ssh 绰号登录云主机,如 ssh Ten,WSL 上效果如下👇
-
- 针对 WSL 或 MacOS
- ①在本机的 /etc/hosts 里添加云主机的 IP,对应一个绰号 Ten,如:45.123.111.1 Ten
- ②在本机创建一个用户,名称与想登录的云主机用户一致,如:hz [本机用户]、hz [云主机用户]
- ③此时在本机 ssh Ten,输入密码即可登录
- ❗ 重启后失效 [针对 WSL 2,其他系统方法自行搜索,WSL 1 不能 chattr]
- 使用 sudo chattr +i /etc/hosts,使 /etc/hosts 只读,重启也不会被重置
- 若要再修改:sudo chattr -i /etc/hosts
- [PS] 还可使用 ssh-copy-id 做免密登录,tldr ssh-copy-id 可查看帮助说明
-
- 域名和 IP 可以是多对多的,可以做负载均衡
思考点#
Tips#
- [bash 下] /etc/profile 用户首选项【全局】 [默认 shell 为 bash 时会先运行的文件]