正点原子学习 用户权限管理
1: /etc/group 是什么?
/etc/group 文件是 Linux/Unix 用来定义**用户组(Group)**的配置文件。
每一行定义一个用户组的信息,包括:组名、组密码(几乎废弃)、GID(组ID),以及属于这个组的用户列表。
字段 | 作用 |
---|---|
组名 | 用户组名字(唯一标识) |
x | 一般写 x ,真正的组密码几乎不用了 |
GID | 组 ID |
组内用户 | 这个组里有哪些用户(除了主组,还可以把其他用户附加到这个组) |
adm:x:4:syslog,mfo
cdrom:x:24:mfo
sudo:x:27:mfo
plugdev:x:46:mfo
audio:x:29:pulse
adm: x:4:syslog,mfo
→ 有个叫 adm 的组,GID=4,里面有 syslog 和 mfo 两个用户
→ adm 通常用来让成员可以读系统日志文件。
cdrom: x:24:mfo
→ cdrom 组,GID=24,mfo 是成员
→ 允许 mfo 访问光驱设备。
sudo: x:27:mfo
→ sudo 组,GID=27,mfo 是成员
→ 成员可以用 sudo 执行管理员命令。
plugdev: x:46:mfo
→ plugdev 组允许 mfo 管理可插拔设备(USB、移动硬盘)。
audio: x:29:pulse
→ audio 组包含 pulse 用户(PulseAudio 音频守护进程)
→ 让它可以访问音频硬件。
mfo❌1000: 有一个和用户同名的用户组嘛,为啥没有自身
你说的 /etc/group 里的这一行:
makefile
复制
编辑
mfo❌1000:
这是一个与用户名同名的用户组(常见于 Ubuntu 等发行版)。这里的最后一个字段是组成员列表,空着说明:
这个组只有“一个成员”,就是它的主用户 mfo,但主用户不一定显示在成员列表中。
为什么主用户不出现在成员列表?
/etc/group 文件中成员列表只列出附加组成员(secondary group members)。
用户的主组通过 /etc/passwd 文件的第三字段(GID)指定,不用在 /etc/group 里重复列出。
所以,mfo 用户的主组是 mfo 组(GID 1000),但 /etc/group 里不显示。
2 adduser 和 deluser 命令整理
命令 | 功能 | 说明 | 示例 |
---|---|---|---|
adduser | 创建新用户 | 创建一个新用户,默认会创建同名的用户组,并添加用户到该组。 | sudo adduser zzk1 |
deluser | 删除指定用户 | 删除指定用户,默认不删除同名组(除非组为空),可带参数删除组。 | sudo deluser zzk1 |
delgroup | 删除指定用户组 | 删除空用户组 | sudo delgroup zzk1 |
2. APT (Advanced Package Tool)
apt-get 是什么?
apt-get 是 APT (Advanced Package Tool) 系统的一个命令行前端。
用来 安装、更新、升级、卸载、修复软件包。
专门用于基于 Debian 的 Linux 发行版,比如 Ubuntu、Kali、Raspberry Pi OS。
2.1 常用 apt-get 命令
命令 | 作用 | 常用示例 |
---|---|---|
apt-get update | 更新可用软件包的索引(只更新索引,不安装) | sudo apt-get update |
apt-get upgrade | 升级所有已安装的软件到最新版 | sudo apt-get upgrade |
apt-get install | 安装新软件包 | sudo apt-get install vim |
apt-get remove | 卸载软件包(保留配置文件) | sudo apt-get remove vim |
apt-get purge | 卸载软件包及其配置文件 | sudo apt-get purge vim |
apt-get autoremove | 自动卸载系统中不再需要的依赖包 | sudo apt-get autoremove |
apt-get dist-upgrade | 升级系统,并智能处理依赖和可能的冲突 | sudo apt-get dist-upgrade |
apt-get clean | 清理已下载的软件包缓存 | sudo apt-get clean |
3 APT 与 insmod 和rmod 有啥区别
比较点 | apt-get | insmod / rmmod |
---|---|---|
层级 | 用户空间(应用层) | 内核空间(内核模块层) |
对象 | 软件包(.deb) | 内核模块(.ko) |
功能 | 安装/更新/卸载应用程序 | 加载/卸载内核模块 |
是否处理依赖 | 自动(APT 自动解析依赖) | insmod 不自动,modprobe 可以 |
是否需要 root 权限 | 一般需要(涉及系统文件) | 必须要 root(涉及内核) |
4 驱动和软件包有啥区别?
对比项 | 软件包 | 驱动 |
---|---|---|
安装方式 | 用包管理器 (apt-get 、yum 、pacman ) | 内核编译时编译进去或使用 insmod 、modprobe 加载 |
是否自动管理依赖 | 有包管理器自动解析 | 需要手动或 modprobe 解决依赖 |
是否动态 | 软件随时运行/卸载 | 驱动可动态插拔(内核模块)或编译成内核静态部分 |
卸载 | apt-get remove | rmmod 卸载模块 |
4.1什么是用户空间?
用户空间(User Space)
就是普通应用程序运行的“区域”。
这里运行的是 用户态进程:比如 vim、bash、firefox、nginx 等。
这里不能直接访问硬件,也不能直接操作内核。
必须通过 系统调用(System Call) 让内核帮忙完成文件读写、网络通信、进程调度等“特权操作”。
4.2 什么是内核空间?
内核空间(Kernel Space)
是 Linux 内核自己的“特权区域”。
这里运行的是 内核代码:进程调度、内存管理、文件系统、驱动模块(设备驱动)、网络协议栈等。
内核直接与硬件交互,提供给用户程序一个安全的抽象接口(系统调用、驱动接口)。
4.3对比
对比点 | 用户空间 | 内核空间 |
---|---|---|
谁在运行 | 普通用户态程序 | Linux 内核自身 |
是否直接访问硬件 | 不允许 | 直接控制硬件 |
程序权限 | 受限(低权限) | 高权限(Ring 0) |
崩溃后果 | 程序自己崩溃 | 整个系统可能挂掉 |
内存地址 | 虚拟内存地址空间的一部分 | 受保护的地址空间 |
入口出口 | 调用系统调用进入内核 | 处理完再切换回用户态 |
4.4 为什么要分开?
🔐 目的:安全 + 稳定
用户程序出错只影响自己(进程崩溃)
内核保护硬件和其他进程免受影响
防止恶意程序直接操作内存、IO 端口
4.5 简单示意图
+----------------------+
| 用户空间 (User) |
| ------------------ |
| 应用: bash, vim, |
| nginx, chrome ... |
+----------------------+||系统调用||
+----------------------+
| 内核空间 (Kernel) |
| -------------------- |
| 进程调度、内存管理、 |
| 驱动、文件系统、网络 |
+----------------------+||硬件 (CPU/IO)
4.5 驱动在用户空间吗?
A: 绝大多数驱动是内核模块(*.ko),运行在内核空间。某些驱动可以部分放在用户空间(比如 FUSE 文件系统),但核心访问还是通过内核完成。
Q: 内核挂了会怎么样?
A: 内核空间出错(比如驱动 Bug) → Kernel Panic(内核崩溃) → 系统死机重启。
5 文件系统是 内核 还是用户?
内核空间 | 用户空间 | |
---|---|---|
是否包含文件系统 | ✅ 文件系统驱动/核心逻辑都在内核里 | 🚫 没有完整实现(除 FUSE) |
功能 | 解析文件格式、管理磁盘块、挂载、读写缓存、权限控制 | 可以写用户态文件系统逻辑(如压缩/加密),但最终依赖内核 |
典型 | ext4、xfs、btrfs、NTFS、VFS | FUSE、sshfs、rclone mount |