我们之前已经了解了Docker技术架构演进的一个基本路线,如果还没有了解的小伙伴可以点击这里:
今天我们在学习Docker之前,我们先来了解一下操作系统自带的隔离,主要是要大家意识到,隔离并不是Docker的独家,操作系统自己早就实现了隔离,并且这些命令对于之后的Docker学习也是有帮助的。
Linux 操作系统通过多种机制实现进程、用户、文件系统、网络等资源的隔离,确保安全性和稳定性。以下是 Linux 的主要隔离技术及其实现方式:
1. 用户和权限隔离
Linux 使用 用户(User)和组(Group) 进行权限控制,确保不同用户只能访问授权资源:
uid
(用户ID)和gid
(组ID):每个进程和文件都有所属用户和组。chmod
、chown
:控制文件访问权限(rwx
)。sudo
和su
:限制普通用户执行特权操作。/etc/passwd
和/etc/shadow
:存储用户信息,密码加密存储。
示例:
# 查看当前用户信息
id
# 修改文件权限
chmod 600 /path/to/file # 仅所有者可读写
chown user:group /path/to/file
2. 进程隔离
Linux 内核通过 命名空间(Namespaces) 实现进程间的隔离:
命名空间类型 | 作用 |
---|---|
PID | 进程ID 独立(不同命名空间的进程看不到彼此) |
Mount (mnt ) |
文件系统挂载点隔离 |
Network (net ) |
独立网络栈(IP、端口、路由表等) |
UTS | 主机名和域名隔离 |
IPC | 进程间通信(消息队列、共享内存等)隔离 |
User | 用户和组ID 隔离(容器内 root ≠ 宿主机 root) |
Cgroup (cgroup ) |
控制资源使用(CPU、内存等) |
示例:查看进程的命名空间
ls -l /proc/$$/ns # 查看当前进程的命名空间
3. 文件系统隔离
chroot
:修改进程的根目录,限制其访问范围(早期容器技术)。- OverlayFS:联合文件系统(Docker 使用),实现分层存储。
mount --bind
:挂载特定目录,实现文件访问控制。
示例:使用 chroot
创建隔离环境
# 创建一个简单的隔离环境
mkdir -p /jail/{bin,lib64}
cp /bin/bash /jail/bin/
cp /lib64/{ld-linux-x86-64.so.2,libc.so.6} /jail/lib64/
chroot /jail /bin/bash # 进入隔离环境
4. 资源隔离(Cgroups)
Control Groups (cgroups) 限制进程的资源使用:
- CPU:分配 CPU 时间片。
- Memory:限制内存使用。
- I/O:控制磁盘读写带宽。
- Network:限制网络带宽。
示例:使用 cgroups v2
限制进程内存
# 创建 cgroup
mkdir /sys/fs/cgroup/memory/mycgroup
echo 100000000 > /sys/fs/cgroup/memory/mycgroup/memory.limit_in_bytes
# 将进程加入 cgroup
echo $$ > /sys/fs/cgroup/memory/mycgroup/cgroup.procs
5. 网络隔离
- Network Namespace:每个容器/进程有独立的网络栈。
iptables
/nftables
:防火墙规则隔离流量。veth
虚拟设备:连接不同网络命名空间。bridge
:虚拟交换机管理容器网络。
示例:创建网络命名空间
ip netns add mynetns # 创建网络命名空间
ip netns exec mynetns ip a # 在命名空间内执行命令
6. 安全增强(SELinux/AppArmor)
- SELinux(Security-Enhanced Linux):强制访问控制(MAC),限制进程权限。
- AppArmor:基于配置文件限制进程能力。
示例:查看 SELinux 状态
sestatus
7. 容器技术(Docker/LXC)
容器是上述隔离技术的组合:
- Docker:使用
Namespaces + Cgroups + OverlayFS
实现轻量级虚拟化。 - LXC:Linux 原生容器,直接调用内核功能。
示例:运行一个 Docker 容器
docker run -it --rm alpine sh
总结
隔离类型 | 技术 | 作用 |
---|---|---|
用户隔离 | uid/gid , sudo |
限制用户权限 |
进程隔离 | Namespaces |
进程间资源隔离 |
文件系统隔离 | chroot , OverlayFS |
限制文件访问 |
资源隔离 | Cgroups |
限制 CPU、内存等 |
网络隔离 | Network Namespace , iptables |
独立网络环境 |
安全增强 | SELinux , AppArmor |
防止提权攻击 |
容器 | Docker , LXC |
综合隔离 |
我们今天主要来看进程隔离和文件隔离,但是在这之前,我们先了解几个命令:
dd
dd
是 Linux/Unix 系统中一个强大的 磁盘和文件操作工具,主要用于 数据复制、转换和备份。它可以直接访问设备文件,适用于磁盘克隆、创建镜像文件、数据擦除等场景。
基本语法
dd if=输入文件 of=输出文件 [选项]
if
(input file):输入源(文件或设备,如/dev/sda
)of
(output file):输出目标(文件或设备)- 其他常用选项:
bs
:块大小(默认 512B,建议设为1M
或4K
提高效率)count
:复制的块数skip
:跳过输入文件开头的块seek
:跳过输出文件开头的块status=progress
:显示进度(GNUdd
支持)
常见用途示例
1. 磁盘/分区备份(克隆)
# 备份整个磁盘到镜像文件
sudo dd if=/dev/sda of=/backup/sda.img bs=4M status=progress
# 恢复镜像到磁盘
sudo dd if=/backup/sda.img of=/dev/sda bs=4M status=progress
- 适用场景:全盘备份、系统迁移。
2. 创建空文件(预分配空间)
# 创建一个 1GB 的空文件
dd if=/dev/zero of=testfile bs=1M count=1024
/dev/zero
:提供空字符流。
我们来试试这个,这个比较方便:
我们打开testfile,写一行hello world:
然后我们可以将所有的小写字母转换成大写:
dd if=testfile of=testfile_2 conv=ucase
3. 销毁磁盘数据(安全擦除)
# 用零填充整个磁盘(不可恢复)
sudo dd if=/dev/zero of=/dev/sdb bs=4M status=progress
# 随机数据填充(更安全)
sudo dd if=/dev/urandom of=/dev/sdb bs=4M status=progress
- 注意:操作不可逆,务必确认目标设备!
4. 复制 ISO 到 U 盘(制作启动盘)
sudo dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress conv=fsync
/dev/sdb
是 U 盘设备(用lsblk
确认)。conv=fsync
:确保数据完全写入。
5. 修改文件部分内容
# 替换文件开头 1KB 为 0
dd if=/dev/zero of=file.bin bs=1K count=1 conv=notrunc
notrunc
:不截断原文件,仅覆盖指定部分。
6. 测试磁盘读写速度
# 写入速度测试
dd if=/dev/zero of=./testfile bs=1G count=1 oflag=direct
# 读取速度测试
dd if=./testfile of=/dev/null bs=1G count=1 iflag=direct
oflag=direct
/iflag=direct
:绕过缓存,测真实速度。
注意事项
谨慎操作:
dd
直接操作设备,输入错误可能导致数据丢失!- 务必确认
if
和of
参数(如误将of=/dev/sda
写成if=/dev/sda
会覆盖系统盘)。
进度查看:
- 较新版本的
dd
支持status=progress
。 - 旧版本可通过发送
USR1
信号查看进度:kill -USR1 $(pgrep ^dd) # 另开终端执行
- 较新版本的
替代工具:
pv
:显示进度条(需安装):pv /dev/sda > sda.img
rsync
:更安全的文件同步。
总结
用途 | 命令示例 |
---|---|
磁盘备份 | dd if=/dev/sda of=/backup/sda.img bs=4M status=progress |
制作启动盘 | dd if=ubuntu.iso of=/dev/sdb bs=4M conv=fsync |
安全擦除磁盘 | dd if=/dev/urandom of=/dev/sdb bs=4M status=progress |
创建大文件 | dd if=/dev/zero of=largefile bs=1M count=1024 |
测试磁盘速度 | dd if=/dev/zero of=./testfile bs=1G count=1 oflag=direct |
dd 的核心功能就是“从输入源(if)读取原始数据,原封不动地写入输出目标(of)”,像一个二进制搬运工。
mkfs
mkfs
(Make Filesystem)是 Linux 中用于 创建文件系统 的命令,相当于对磁盘或分区进行“格式化”。它会在目标设备(如分区、磁盘、镜像文件)上写入文件系统的元数据,使其能够被操作系统识别和使用。
基本语法
mkfs [选项] 设备或文件
或通过指定文件系统类型:
mkfs.文件系统类型 [选项] 设备或文件
例如:
mkfs.ext4 /dev/sdb1 # 将 /dev/sdb1 格式化为 ext4
mkfs.vfat /dev/sdc1 # 格式化为 FAT32
常见文件系统类型
文件系统 | 命令 | 适用场景 |
---|---|---|
ext4 | mkfs.ext4 |
Linux 默认文件系统(推荐) |
ext3 | mkfs.ext3 |
旧版 Linux 兼容 |
ext2 | mkfs.ext2 |
极简需求(无日志功能) |
XFS | mkfs.xfs |
大文件、高性能(企业级) |
Btrfs | mkfs.btrfs |
支持快照、压缩(现代文件系统) |
FAT32 | mkfs.vfat |
U盘、跨平台(Windows/macOS/Linux) |
NTFS | mkfs.ntfs |
Windows 专用(需 ntfs-3g 包) |
mkfs
命令参数详解
参数 | 说明 | 示例 |
---|---|---|
-t fstype |
指定要创建的文件系统类型(如 ext3 , ext4 , xfs , vfat 等) |
mkfs -t ext4 /dev/sdb1 |
filesys |
目标设备文件名(如 /dev/sdb1 )或镜像文件 |
mkfs.ext4 /dev/sdb1 |
blocks |
指定文件系统的磁盘块数(一般自动计算,手动指定较少使用) | mkfs.ext4 /dev/sdb1 204800 (20万块) |
-V |
详细模式(显示操作过程) | mkfs -V -t ext4 /dev/sdb1 |
fs-options |
传递给具体文件系统的参数(需在 filesys 前指定) |
mkfs.ext4 -b 4096 /dev/sdb1 |
常见文件系统专用参数示例
1. ext4 文件系统
参数 | 说明 | 示例 |
---|---|---|
-b block-size |
指定块大小(如 1024 , 4096 ) |
mkfs.ext4 -b 4096 /dev/sdb1 |
-L volume-label |
设置卷标 | mkfs.ext4 -L "mydata" /dev/sdb1 |
-m reserved-blocks-percent |
保留空间百分比(默认5%) | mkfs.ext4 -m 1 /dev/sdb1 (设为1%) |
-O feature |
启用特性(如 encrypt , quota ) |
mkfs.ext4 -O encrypt /dev/sdb1 |
2. FAT/VFAT 文件系统
参数 | 说明 | 示例 |
---|---|---|
-F fat-size |
指定 FAT 类型(12 , 16 , 32 ) |
mkfs.vfat -F 32 /dev/sdc1 |
-I |
强制格式化整个设备(无分区表) | mkfs.vfat -I /dev/sdd |
3. XFS 文件系统
参数 | 说明 | 示例 |
---|---|---|
-f |
强制覆盖现有文件系统 | mkfs.xfs -f /dev/sdb2 |
-d agcount=N |
设置分配组数量(性能调优) | mkfs.xfs -d agcount=4 /dev/sdb2 |
常用操作示例
1. 格式化分区为 ext4(Linux 常用)
sudo mkfs.ext4 /dev/sdb1
- 选项:
-L
:设置卷标(如-L "mydata"
)-m 0
:减少保留空间(默认 5%,-m 0
设为 0% 以最大化可用空间)
我们将刚刚的testfile格式化为ext4格式:
2. 格式化 U 盘为 FAT32(兼容 Windows/macOS)
sudo mkfs.vfat -F 32 /dev/sdc1
-F 32
:强制 FAT32 格式(默认可能格式化为 FAT16)
3. 格式化并启用 XFS(适合大文件)
sudo mkfs.xfs -f /dev/sdb2
-f
:强制覆盖现有文件系统
4. 检查设备后再格式化
lsblk # 确认设备路径(如 /dev/sdb1)
sudo blkid /dev/sdb1 # 查看当前文件系统类型
sudo umount /dev/sdb1 # 先卸载(如果已挂载)
sudo mkfs.ext4 /dev/sdb1 # 再格式化
高级选项
1. 调整 inode 数量(适用于大量小文件)
sudo mkfs.ext4 -N 1000000 /dev/sdb1 # 分配 100 万个 inode
2. 启用文件系统加密(ext4)
sudo mkfs.ext4 -O encrypt /dev/sdb1
3. 指定块大小(block size)
sudo mkfs.ext4 -b 4096 /dev/sdb1 # 4KB 块(适合 SSD)
注意事项
数据会丢失!
格式化会清空目标设备的所有数据,操作前务必确认设备路径。必须先卸载分区
sudo umount /dev/sdb1 # 卸载 sudo mkfs.ext4 /dev/sdb1
SSD 优化
对 SSD 建议使用ext4
或f2fs
,并启用 TRIM:sudo mkfs.ext4 -E discard /dev/nvme0n1p1
修复误格式化
如果误格式化,可尝试用testdisk
或photorec
恢复数据(但不保证成功)。
总结
操作 | 命令示例 |
---|---|
格式化 ext4 | sudo mkfs.ext4 /dev/sdb1 |
格式化 FAT32 | sudo mkfs.vfat -F 32 /dev/sdc1 |
强制覆盖现有文件系统 | sudo mkfs.xfs -f /dev/sdb2 |
设置卷标 | sudo mkfs.ext4 -L "mydata" /dev/sdb1 |
优化 SSD | sudo mkfs.ext4 -E discard /dev/nvme0n1p1 |
df
df
命令详解
df
(Disk Filesystem) 命令用于显示 Linux 系统中文件系统的磁盘空间使用情况。它可以显示所有已挂载文件系统的可用空间和已用空间。
基本语法
df [选项] [文件或目录]
常用选项
选项 | 说明 |
---|---|
-a |
显示所有文件系统,包括虚拟文件系统 |
-h |
以人类可读格式显示 (KB, MB, GB) |
-H |
类似 -h ,但以 1000 为换算单位而非 1024 |
-i |
显示 inode 使用情况而非块使用情况 |
-k |
以 KB 为单位显示 |
-l |
只显示本地文件系统 |
-P |
使用 POSIX 输出格式 |
-T |
显示文件系统类型 |
-t <类型> |
只显示指定类型的文件系统 |
-x <类型> |
排除指定类型的文件系统 |
常用示例
显示所有文件系统使用情况:
df
以人类可读格式显示:
df -h
输出示例:
Filesystem Size Used Avail Use% Mounted on /dev/sda1 20G 5.2G 14G 28% / tmpfs 1.9G 0 1.9G 0% /dev/shm
显示指定文件系统的使用情况:
df -h /dev/sda1
显示文件系统类型:
df -T
显示 inode 使用情况:
df -i
只显示 ext4 文件系统:
df -t ext4
排除特定文件系统类型:
df -x tmpfs
输出字段说明
字段 | 说明 |
---|---|
Filesystem | 文件系统对应的设备文件 |
Size | 文件系统总大小 |
Used | 已用空间 |
Avail | 可用空间 |
Use% | 使用百分比 |
Mounted on | 挂载点 |
实用技巧
快速查看磁盘使用情况:
df -h --output=source,size,used,avail,pcent,target
按使用百分比排序:
df -h | sort -k5 -n -r
监控特定挂载点:
watch -n 1 'df -h /home'
结合 grep 过滤结果:
df -h | grep -v tmpfs
这个命令比较简单,我们举一个简单的例子:
df
命令是 Linux 系统管理员监控磁盘使用情况的重要工具,经常与 du
命令配合使用来分析和解决磁盘空间问题。
mount
mount
命令详解
mount
命令用于挂载文件系统到 Linux 目录树中的指定挂载点。它是 Linux 系统管理中最基础且重要的命令之一。
基本语法
mount [-选项] [设备] [挂载点]
mount [-选项] [-t 文件系统类型] [-o 挂载选项] 设备 挂载点
常用选项
选项 | 说明 |
---|---|
-a |
挂载 /etc/fstab 中所有文件系统 |
-t |
指定文件系统类型 (ext4, ntfs, vfat 等) |
-o |
指定挂载选项 (多个选项用逗号分隔) |
-l |
显示已挂载设备及其标签 |
-v |
显示详细执行过程 |
-r |
以只读模式挂载 |
-w |
以读写模式挂载 (默认) |
常用挂载选项 (-o
)
选项 | 说明 |
---|---|
ro /rw |
只读/读写挂载 |
remount |
重新挂载已挂载的文件系统 |
noexec |
不允许执行二进制文件 |
nosuid |
忽略 suid/sgid 位 |
nodev |
不解释设备文件 |
sync /async |
同步/异步 I/O 操作 |
defaults |
使用默认选项 (rw, suid, dev, exec, auto, nouser, async) |
user |
允许普通用户挂载 |
nouser |
只允许 root 挂载 (默认) |
loop |
挂载镜像文件 |
常用示例
显示当前已挂载的文件系统:
mount
或
mount -l
挂载设备到目录:
mount /dev/sdb1 /mnt/data
我们来试试:
指定文件系统类型挂载:
mount -t ext4 /dev/sdb1 /mnt/data
挂载 ISO 镜像文件:
mount -o loop ubuntu.iso /mnt/iso
挂载 USB 设备 (FAT32):
mount -t vfat /dev/sdc1 /mnt/usb
挂载 Windows 共享 (CIFS/SMB):
mount -t cifs //server/share /mnt/share -o username=user,password=pass
重新挂载为只读:
mount -o remount,ro /dev/sdb1
挂载所有
/etc/fstab
中的文件系统:mount -a
挂载带特殊选项:
mount -o noexec,nosuid /dev/sdb1 /mnt/data
/etc/fstab
文件格式
/etc/fstab
文件用于定义自动挂载的文件系统,格式如下:
设备/UUID 挂载点 文件系统类型 挂载选项 dump fsck
示例:
/dev/sdb1 /mnt/data ext4 defaults 0 2
UUID=1234-5678 /mnt/usb vfat defaults 0 0
卸载文件系统
使用 umount
命令卸载:
umount /mnt/data
或
umount /dev/sdb1
常见问题解决
设备忙无法卸载:
fuser -vm /mnt/data # 查看哪个进程在使用 fuser -km /mnt/data # 终止使用该挂载点的进程 umount /mnt/data
挂载 NTFS 分区:
mount -t ntfs-3g /dev/sdb1 /mnt/ntfs
挂载时修复错误:
fsck /dev/sdb1 mount /dev/sdb1 /mnt/data
mount
命令是 Linux 系统管理中不可或缺的工具,合理使用可以灵活管理各种存储设备和网络共享。