Docker —— 隔离的基本操作(1)
- 1. 用户和权限隔离
- 2. 进程隔离
- 3. 文件系统隔离
- 4. 资源隔离(Cgroups)
- 5. 网络隔离
- 6. 安全增强(SELinux/AppArmor)
- 7. 容器技术(Docker/LXC)
- 总结
- dd
- 基本语法
- 常见用途示例
- 1. 磁盘/分区备份(克隆)
- 2. 创建空文件(预分配空间)
- 3. 销毁磁盘数据(安全擦除)
- 4. 复制 ISO 到 U 盘(制作启动盘)
- 5. 修改文件部分内容
- 6. 测试磁盘读写速度
- 注意事项
- 总结
- mkfs
- 基本语法
- 常见文件系统类型
- `mkfs` 命令参数详解
- 常见文件系统专用参数示例
- 1. ext4 文件系统
- 2. FAT/VFAT 文件系统
- 3. XFS 文件系统
- 常用操作示例
- 1. 格式化分区为 ext4(Linux 常用)
- 2. 格式化 U 盘为 FAT32(兼容 Windows/macOS)
- 3. 格式化并启用 XFS(适合大文件)
- 4. 检查设备后再格式化
- 高级选项
- 1. 调整 inode 数量(适用于大量小文件)
- 2. 启用文件系统加密(ext4)
- 3. 指定块大小(block size)
- 注意事项
- 总结
- df
- `df` 命令详解
- 基本语法
- 常用选项
- 常用示例
- 输出字段说明
- 实用技巧
- mount
- `mount` 命令详解
- 基本语法
- 常用选项
- 常用挂载选项 (`-o`)
- 常用示例
- `/etc/fstab` 文件格式
- 卸载文件系统
- 常见问题解决
我们之前已经了解了Docker技术架构演进的一个基本路线,如果还没有了解的小伙伴可以点击这里:
https://blog.csdn.net/qq_67693066/article/details/147678726
今天我们在学习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 系统管理中不可或缺的工具,合理使用可以灵活管理各种存储设备和网络共享。