Docker 前瞻

一、namespace 指令

1.1 dd 命令

dd 命令用于读取、转换并输出数据。

dd 命令可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

语法

bash 复制代码
dd option
  • if= 文件名:输入文件名,默认为标准输入。及指定源文件
  • of= 文件名:输出文件名就,默认为标准输出。即指定目的文件。
  • ibs= n:一次读入 n 个字节。
  • obs=n:一次输出 n 个字节。
  • bs=n:同时设置输入/输出的块大小为 bytes个字节
  • cbz= n:一次转换 n 个字节,即指定转换缓冲区大小。
  • skip=n:从输入文件开头跳过 n 个块后再开始复制(块大小等于 ibs)
  • seek=n:从输出文件开头跳过 n 个块后再开始复制(块大小等于obs)
  • count=n:仅拷贝 n 个块,块大小等于 ibs 指定的字节数
  • conv=<关键字>:
    1. block:把每一行转换为长度为 cbs,不足部分用空格填充
    2. unblock:是每一行的长度都为 cbs, 不足的部分用空格填充
    3. lcase:把大写字符转换为小写字符
    4. ucase:把小写字符转换为大写字符

案例:

bash 复制代码
# 生成一个 大小为 8M 的镜像文件(指令不要带空格)
dd if=/dev/zero of=test.img bs=8 count=1024

#将 test.txt 文件中的所有英文字母转换为大写,然后转换成 test2.txt 文件
dd if=test.txt of=test2.txt conv=ucase

1.2 mkfs

再设备上创建 Linux 文件系统,俗称格式化。

语法:

bash 复制代码
mkfs option

-t fstype:指定要建立何种文件系统:如 ext3,ext4

案例:

bash 复制代码
#将 sda6 分区格式化为 ext4 格式 
mkfs -t ext4 /dev/sda6

#格式化镜像文件为 ext4
mkfs -t ext4 ./fdimage.img

1.3 df 命令

显示目前再 Linux 系统上的文件系统磁盘使用情况统计。

语法:

bash 复制代码
df [OPTION]... [FILE] ...

常见参数:

  • -a, --all 包含所有具有 0 Blocks 的文件系统
  • -h, --human-readable 使用人类可读的格式
  • -H,--si 很想 -h, 但是 用1000 为单位,而不是1024
  • -t, --type=TYPE 限制列出文件系统的 TYPE
  • -T,--print-type 显示文件系统的形式

案例:

bash 复制代码
#查看磁盘使用情况
df -h
#查看磁盘的系统类型
df -Th

1.4 mount

用于加载文件系统到指定的加载点,此命令常用于挂在光盘,使我们可以访问光盘中的数据,因为你将光盘插入到光驱中,Linux 是不会自动挂载,必须使用 Linux mount 命令 来手动完成挂在。

Linux系统下不同的目录可以挂在不同的分区和磁盘设备,它的目录和磁盘分区是分离的,可以自由组合(通过挂载)

不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备

挂载的实质使为磁盘添加入口(挂载点)

语法:

bash 复制代码
mount [-l]
mount [-t vfstype] [-0 options] device dir

常见参数

  • -l :显示已加载的文件系统列表
  • -t:加载文件系统类型,支持常见的系统类型:ext3,ext4,iso9660 等,大部分可以不指定,mount 可以自己识别
  • -o options 主要用来描述设备或档案的挂接方式
    1. loop:用来把一个文件当成硬盘分区挂接上系统
    2. ro:采用只读的方式挂接设备
    3. rw:采用读写方式挂接设备
  • device:要挂接(mount)的设备。
  • dir:挂在点的目录

案例:

bash 复制代码
#将镜像挂载到/mnt/testext4 下面,需要确保挂载点也就是目录存在
mkdir -p /mnt/testext4
mount ./fdimage.img /mnt/testext4

1.5 unshare

unshare 主要能力是使用与父进程不共享的命名空间运行程序

语法:

bash 复制代码
unshare [options] program [arguments]

常用参数:

  • -i,--ipc:不共享 IPC 空间
  • -m,--mount:不共享 Mount 空间
  • -n,--net:不共享 Net 空间
  • -p,--pid:不共享 PID 空间
  • -u,--uts:不共享 UTS 空间
  • -U,--user:不共享用户
  • -V,--version:版本查看
  • --fork:执行 unshare 的进程 fork 一个新的子进程,再子进程里执行 unshare 传入的参数。
  • --mount-proc:执行子进程前,优先将 proc 挂在过去。

案例1:hostname 隔离

bash 复制代码
# /bin/bash 主机隔离
unshare -u /bin/bash
root@qingkai:/dockertest# hostname test
root@qingkai:/dockertest# hostname
test
root@qingkai:/dockertest# exit
exit
root@qingkai:/dockertest# hostname
qingkai

案例2:进程隔离

bash 复制代码
unshare --fork -p --mount-proc /bin/bash

1. 为什么需要 --fork

当使用 unshare 创建新的 PID 命名空间 时,若不指定 --forkunshare 进程自身会直接进入新命名空间,并成为该命名空间的第一个进程(PID 1)。但此时存在一个问题:

  • 父进程不在新命名空间中 :原进程(如当前 shell)与新命名空间中的 unshare 进程形成父子关系,但父进程属于原命名空间,导致内核无法正确管理新命名空间的进程层级。

  • 报错 Cannot allocate memory:内核需要确保新命名空间的进程树是自洽的(即父进程也在同一命名空间中),否则会因无法建立进程树而报内存错误。

--fork 的作用

通过 fork() 创建一个子进程(新的 bash 进程),让该子进程成为新 PID 命名空间的第一个进程(PID 1),而原 unshare 进程退出。这样新命名空间的进程树从子进程开始,符合内核的层级要求。


2. --pid 参数的含义

  • 隔离 PID 命名空间--pid 表示仅创建新的 PID 命名空间,其他命名空间(如 mountnetworkuts 等)与原系统共享。

  • 效果

    • 新命名空间中的进程拥有独立的 PID 编号(例如,bash 进程的 PID 为 1)。

    • 其他资源(如文件系统、网络接口)仍与原系统共享。


3. 为什么需要 --mount-proc

/proc 是 Linux 的虚拟文件系统,存储了进程和系统信息(如 /proc/PID 目录)。关键问题

  • 默认 /proc 不隔离 :若不重新挂载 /proc,新 PID 命名空间中的进程仍会看到原系统的所有进程信息(即 /proc 包含全局进程)。

  • 工具依赖 /procpstop 等命令通过读取 /proc 获取进程信息,若未隔离,这些工具会显示原系统的进程,而非当前命名空间的进程。

--mount-proc 的作用

自动将 /proc 文件系统挂载到新命名空间的 /proc 目录,确保:

  • 隔离的进程信息:仅显示当前 PID 命名空间及其子命名空间的进程。

  • 挂载隔离 :虽然未显式创建新的 mount 命名空间,但 --mount-proc 会在新 PID 命名空间内重新挂载 /proc,使其独立于原系统

案例三:mount 隔离

bash 复制代码
#开启mount 隔离
unshare -m --fork /bin/bash
#创建镜像文件
dd if=/mnt/zero of=test2.img bs=8k count=1024
#格式化文件
mkfs -t ext4 /docker/test2.img
#创建要挂载的目录
mkdir -p /mnt/testext4
#将文件系统挂载到创建的目录上
mount -t ext4 /dockertest/test2.img ./testext4

二、pidstat

pidstat 是 systat 的一个命令,用于监控全部或指定进程的 CPU、内存、线程、IO等系统资源的占用情况。pidstat 第一次采样显示自系统开始的各项统计信息,后续采样将显示自上次命令后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

语法:

bash 复制代码
pidstat [选项] [<时间间隔>] [<次数>]

参数:

  • -u:默认参数,显示各进程的 CPU 使用统计
  • -r:显示各进程的内存使用统计
  • -d:显示各进程的 IO 使用情况
  • -p:指定进程号,ALL 表示所有进程
  • -C:指定命令(stress 监控 stress 命令相关进程的状态)
  • -l:显示命令名和所有参数

安装:

bash 复制代码
#ubuntu 卸载
apt remove sysstat -y
#ubuntu 安装
apt install stsstat -y

#centos 卸载
yum remove sysstat -y
#centos 安装
yum install sysstat -y

三、stress

stress 是 Linux 的一个压力测试工具,可以对 CPU、Memory、IO、磁盘进行压力测试。

语法:

bash 复制代码
stress [OPTION [ARG]]

参数:

  • -c,--cpu N:产生 N 个进程,每个进程都循环调用 sqrt 函数产生 CPU 压力
  • -i,--io N:产生 N 个进程,每个进程循环调用 sync 将内存缓冲区内容写到磁盘上,产生 IO 压力。通过系统调用 sync 刷新内存缓冲区数据到磁盘中,以确保同步。如果缓冲区数据较少,写到磁盘中的数据也较少,不会产生 IO 压力。在 SSD 磁盘环境中尤为明显,很可能 iowait 总是 0,却因为大量调用 sync ,导致系统 CPU 使用率 sys 升高。
  • -m
    --vm N:产生 N 个进程,每个进程循环调用 malloc/free 函数分配和释放内存。
    --vm-bytes B:指定分配内存的大小
    --vm-keep:一直占用内存(默认是不断释放并重新分配内存)
  • -d
    --hdd N:产生 N个不断执行 write 和 unlink 函数的进程(创建文件,写入内容、删除文件)
    --hdd-bytes B:指定文件大小
  • -t,--timeout N:在 N 秒后结束程序
  • -q,--quiet:程序在运行的过程中不输出信息

安装:

bash 复制代码
#ubuntu 卸载
apt remove stress -y
#ubuntu 安装
apt install stress -y

#centos 卸载
yum remove stress -y
#centos 安装
yum install stress -y

四、cgroup

4.1 信息查看

bash 复制代码
#查看当前系统操作系统版本
cat /etc/*release*
#版本查看
cat /proc/filesystems |grep cgroup
#cgroups 子系统查看
cat /proc/cgroups
#cgroups 挂载信息查看(cgroup2 on /sys/fs/cgroup type cgroup2)表示cgroup 挂载到了 /sys/fs/cgroup 目录
mount | grep cgroup
#查看一个当前进程的 cgroup 限制
cat /proc/$$/cgroup
#(0::/user.slice/user-0.slice/session-33754.scope)当前进程 cgroup信息在 cgroup 挂载目录中的/user.slice/user-0.slice/session-33754.scope

cgroup2 如何配置:

bash 复制代码
# 限制为 1 个核心的 20%
echo "20000 100000" > cpu.max

# 限制内存使用为 1GB
echo "1073741824" > memory.max

# 最多允许 100 个进程
echo "100" > pids.max

注意:cgroup 配置会继承父层级的限制。若当前配置信息不生效,可以返回上级目录,查看父目录的配置信息

4.2 使用 cgroups 对内存进行控制

bash 复制代码
#在 cgroup 挂载目录创建文件,作为限制模板
mkdir cgrouptest

#限制 cpu 使用率为 50%
echo 50000 100000 > cpu.max

#限制内存使用最大为 20 m 20*1024*1024
echo "20971520" > memory.max

#将要限制的进程写入 cgroup.procs 中
echo 2603690 > cgroup.procs

我们可以使用如下命令验证 cgroup 是否生效

bash 复制代码
#不停的申请回收 100m 内存
stress --vm 1 --vm-bytes 100m
#监控对应的进程
pidstat -C stress -p ALL  -r 2 1000
#当我们把对应进程号加入 cgroup.procs 中,此时就会停止申请和释放内存
相关推荐
yangang1852 小时前
linuxbash原理
linux·运维·服务器
小小毛桃2 小时前
在Ubuntu系统中运行Windows程序
linux·windows·ubuntu
一一Null2 小时前
关于手机取证中逻辑采集与系统备份的差异
服务器·网络·智能手机
码农新猿类2 小时前
服务器本地搭建
linux·网络·c++
小度爱学习2 小时前
linux中的执行命令格式及命令帮助
linux·运维·chrome
yangshuo12812 小时前
如何在服务器上搭建mail服务器邮件服务器
运维·服务器
猿小喵2 小时前
记录一次TDSQL网关夯住故障
运维·数据库·mysql
良许Linux3 小时前
嵌入式算吃青春饭么?
linux
良许Linux3 小时前
马上要毕业去工作了,做嵌入式软件开发工程师,但是完全不会编程怎么办?
linux
良许Linux3 小时前
学stm32,有什么学习方法?
linux