当前位置: 首页 > news >正文

Docker —— 隔离的基本操作(1)

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):每个进程和文件都有所属用户和组。
  • chmodchown:控制文件访问权限(rwx)。
  • sudosu:限制普通用户执行特权操作。
  • /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,建议设为 1M4K 提高效率)
    • count:复制的块数
    • skip:跳过输入文件开头的块
    • seek:跳过输出文件开头的块
    • status=progress:显示进度(GNU dd 支持)

常见用途示例

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:绕过缓存,测真实速度。

注意事项

  1. 谨慎操作

    • dd 直接操作设备,输入错误可能导致数据丢失!
    • 务必确认 ifof 参数(如误将 of=/dev/sda 写成 if=/dev/sda 会覆盖系统盘)。
  2. 进度查看

    • 较新版本的 dd 支持 status=progress
    • 旧版本可通过发送 USR1 信号查看进度:
      kill -USR1 $(pgrep ^dd)  # 另开终端执行
      
  3. 替代工具

    • 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

常见文件系统类型

文件系统命令适用场景
ext4mkfs.ext4Linux 默认文件系统(推荐)
ext3mkfs.ext3旧版 Linux 兼容
ext2mkfs.ext2极简需求(无日志功能)
XFSmkfs.xfs大文件、高性能(企业级)
Btrfsmkfs.btrfs支持快照、压缩(现代文件系统)
FAT32mkfs.vfatU盘、跨平台(Windows/macOS/Linux)
NTFSmkfs.ntfsWindows 专用(需 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, 4096mkfs.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, quotamkfs.ext4 -O encrypt /dev/sdb1
2. FAT/VFAT 文件系统
参数说明示例
-F fat-size指定 FAT 类型(12, 16, 32mkfs.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)

注意事项

  1. 数据会丢失!
    格式化会清空目标设备的所有数据,操作前务必确认设备路径。

  2. 必须先卸载分区

    sudo umount /dev/sdb1  # 卸载
    sudo mkfs.ext4 /dev/sdb1
    
  3. SSD 优化
    对 SSD 建议使用 ext4f2fs,并启用 TRIM:

    sudo mkfs.ext4 -E discard /dev/nvme0n1p1
    
  4. 修复误格式化
    如果误格式化,可尝试用 testdiskphotorec 恢复数据(但不保证成功)。


总结

操作命令示例
格式化 ext4sudo mkfs.ext4 /dev/sdb1
格式化 FAT32sudo mkfs.vfat -F 32 /dev/sdc1
强制覆盖现有文件系统sudo mkfs.xfs -f /dev/sdb2
设置卷标sudo mkfs.ext4 -L "mydata" /dev/sdb1
优化 SSDsudo 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 <类型>排除指定类型的文件系统

常用示例

  1. 显示所有文件系统使用情况

    df
    
  2. 以人类可读格式显示

    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
    
  3. 显示指定文件系统的使用情况

    df -h /dev/sda1
    
  4. 显示文件系统类型

    df -T
    
  5. 显示 inode 使用情况

    df -i
    
  6. 只显示 ext4 文件系统

    df -t ext4
    
  7. 排除特定文件系统类型

    df -x tmpfs
    

输出字段说明

字段说明
Filesystem文件系统对应的设备文件
Size文件系统总大小
Used已用空间
Avail可用空间
Use%使用百分比
Mounted on挂载点

实用技巧

  1. 快速查看磁盘使用情况

    df -h --output=source,size,used,avail,pcent,target
    
  2. 按使用百分比排序

    df -h | sort -k5 -n -r
    
  3. 监控特定挂载点

    watch -n 1 'df -h /home'
    
  4. 结合 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挂载镜像文件

常用示例

  1. 显示当前已挂载的文件系统

    mount
    

    mount -l
    
  2. 挂载设备到目录

    mount /dev/sdb1 /mnt/data
    

我们来试试:
在这里插入图片描述

  1. 指定文件系统类型挂载

    mount -t ext4 /dev/sdb1 /mnt/data
    
  2. 挂载 ISO 镜像文件

    mount -o loop ubuntu.iso /mnt/iso
    
  3. 挂载 USB 设备 (FAT32)

    mount -t vfat /dev/sdc1 /mnt/usb
    
  4. 挂载 Windows 共享 (CIFS/SMB)

    mount -t cifs //server/share /mnt/share -o username=user,password=pass
    
  5. 重新挂载为只读

    mount -o remount,ro /dev/sdb1
    
  6. 挂载所有 /etc/fstab 中的文件系统

    mount -a
    
  7. 挂载带特殊选项

    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

常见问题解决

  1. 设备忙无法卸载

    fuser -vm /mnt/data  # 查看哪个进程在使用
    fuser -km /mnt/data  # 终止使用该挂载点的进程
    umount /mnt/data
    
  2. 挂载 NTFS 分区

    mount -t ntfs-3g /dev/sdb1 /mnt/ntfs
    
  3. 挂载时修复错误

    fsck /dev/sdb1
    mount /dev/sdb1 /mnt/data
    

mount 命令是 Linux 系统管理中不可或缺的工具,合理使用可以灵活管理各种存储设备和网络共享。

http://www.xdnf.cn/news/288127.html

相关文章:

  • SpringCloud GateWay网关
  • 排序用法(Arrays.sort)
  • AI笔记-1
  • Qwen2_5-Omni-3B:支持视频、音频、图像和文本的全能AI,可在本地运行
  • 【Flask】ORM模型以及数据库迁移的两种方法(flask-migrate、Alembic)
  • 【全队项目】智能学术海报生成系统PosterGenius--前后端系统介绍
  • Vuex使用指南:状态管理
  • Leetcode:回文链表
  • GGD独立站的优势
  • 备战蓝桥杯国赛第一天-atcoder-beginner-contest404
  • Python异步编程进阶:深入探索asyncio高级特性
  • 从零开始开发纯血鸿蒙应用之NAPI
  • Linux的web服务器的部署及优化
  • 关于浏览器页面自动化操作
  • Python 矩阵运算:从理论到实践
  • 五大神经网络开发实战:从入门到企业级部署
  • 《Python星球日记》第30天:Flask数据库集成
  • 虚幻基础:硬件输入
  • 蓝桥杯 19. 植树
  • 【题解-洛谷】B4303 [蓝桥杯青少年组省赛 2024] 字母移位
  • [HOT 100] 2538. 最大价值和与最小价值和的差值
  • LabVIEW伺服电机故障监测系统
  • 【QT】QT中的事件
  • JavaSE笔记--反射篇
  • Cron表达式的用法
  • cudaMalloc函数说明
  • 5.5刷题map和set的使用
  • 笔试专题(十五)
  • 3小时超快速入门Python
  • 字符串,数组,指针之间的关系