一、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=<关键字>:
- block:把每一行转换为长度为 cbs,不足部分用空格填充
- unblock:是每一行的长度都为 cbs, 不足的部分用空格填充
- lcase:把大写字符转换为小写字符
- 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 主要用来描述设备或档案的挂接方式
- loop:用来把一个文件当成硬盘分区挂接上系统
- ro:采用只读的方式挂接设备
- 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:进程隔离
bashunshare --fork -p --mount-proc /bin/bash
1. 为什么需要
--fork
?当使用
unshare
创建新的 PID 命名空间 时,若不指定--fork
,unshare
进程自身会直接进入新命名空间,并成为该命名空间的第一个进程(PID 1)。但此时存在一个问题:
父进程不在新命名空间中 :原进程(如当前 shell)与新命名空间中的
unshare
进程形成父子关系,但父进程属于原命名空间,导致内核无法正确管理新命名空间的进程层级。报错
Cannot allocate memory
:内核需要确保新命名空间的进程树是自洽的(即父进程也在同一命名空间中),否则会因无法建立进程树而报内存错误。
--fork
的作用 :通过
fork()
创建一个子进程(新的bash
进程),让该子进程成为新 PID 命名空间的第一个进程(PID 1),而原unshare
进程退出。这样新命名空间的进程树从子进程开始,符合内核的层级要求。
2.
--pid
参数的含义
隔离 PID 命名空间 :
--pid
表示仅创建新的 PID 命名空间,其他命名空间(如mount
、network
、uts
等)与原系统共享。效果:
新命名空间中的进程拥有独立的 PID 编号(例如,
bash
进程的 PID 为 1)。其他资源(如文件系统、网络接口)仍与原系统共享。
3. 为什么需要
--mount-proc
?
/proc
是 Linux 的虚拟文件系统,存储了进程和系统信息(如/proc/PID
目录)。关键问题:
默认
/proc
不隔离 :若不重新挂载/proc
,新 PID 命名空间中的进程仍会看到原系统的所有进程信息(即/proc
包含全局进程)。工具依赖
/proc
:ps
、top
等命令通过读取/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 中,此时就会停止申请和释放内存