NameSpace
dd + option : 可以从标准输入或文件中读取数据,根据指定格式来转换数据,再输出到文件、设备或标准输出
--help 显示帮助信息
--version 显示版本信息
if=文件名(输出文件名,默认标准输入) 源文件
of=文件名(输出文件名,默认标准输出) 目的文件
ibs=bytes 一次读取bytes个字节
obs=bytes 一次输出bytes个字节
bs=bytes 同时设置ibs和obs
cbs=bytes 一次转换bytes个字节
skip=blocks 从输入文件开头跳过blocks个块后开始复制
seek=blocks 从输出文件开头跳过blocks个块后开始复制
count=blocks 拷贝blocks个块,块大小等于ibs指定的字节数
conv=<关键字>
▪ conversion:用指定的参数转换文件。
▪ ascii:转换 ebcdic 为 ascii
▪ ebcdic:转换 ascii 为 ebcdic
▪ ibm:转换 ascii 为 alternate ebcdic
▪ block:把每一行转换为长度为 cbs,不足部分用空格填充
▪ unblock:使每一行的长度都为 cbs,不足部分用空格填充
▪ lcase:把大写字符转换为小写字符
▪ ucase:把小写字符转换为大写字符
▪ swap:交换输入的每对字节
▪ noerror:出错时不停止
▪ notrunc:不截短输出文件
▪ sync:将每个输入块填充到 ibs 个字节,不足部分用空(NUL)字符补齐。
@example
# 从/dev/zero 中读取10240 8k的page到fdimage.img中
dd if=/dev/zero of=fdimage.img bs=8k count=10240
# 将testfile 文件中的英文字母转换成大写,并输出到testfile_1文件中
dd if=testfile_2 of=testfile_1 conv=ucase
mkfs [-V][-t fstype][fs-options] filesys [blocks] : 格式化文件
@example
# 格式化镜像文件ext4
mkfs -t ext4 ./data1.img
df [option]...[file](disk free 磁盘空间)显示Linux系统上的文件系统磁盘使用情况
* -a(all) 包含所有具有0 Blocks的文件系统
* -h(human-readable)
* -H(单位1000)
* --type=TYPE(指定文件系统TYPE)
* -T 显示文件系统的形式
@example
df -h 查看磁盘使用情况 df -Th 查看磁盘的系统类型
mount命令:可以用于加载文件系统到指定加载点。常用于挂载关盘,使我们可以访问光盘中的数据。因为关盘插入光驱中,Linux并不会自动进行挂载,必须使用Linux mount命令手动完成挂载
Linux系统不同目录下可以挂载不同分区和磁盘设备,它的目录和磁盘分区时分离的,可以自由组合
不同目录数据可以跨越不同磁盘分区或者不同磁盘设备
挂载的本质就是为磁盘添加入口(挂载点)
@example
mount [-l] 显示已经加载的文件系统
mount [-t vfstype] [-o options] device dir -t指定文件系统类型,可以不指定,会自动识别
# 将镜像挂载到/mnt/test4下面,确保挂载点也就是目录存在
mount ./fdimage.img /mnt/test4
unshare 主要能力是使用父进程不共享的名称空间运行程序
unshare [options] program [arguments]
这里主要介绍几个重要参数
-m,--mount 不共享mount空间,父进程不能看到该命名空间中的mount空间
--fork 执行unshare递达进程fork一个新的子进程,再子进程中执行unshare传入的参数
--mount-proc 执行子进程前,将proc优先挂载过去
@example
unshare -u /bin/bash 用户隔离
unshare --fork --pid --mount-proc /bin/bash PID隔离
*** 注意:
1、--fork 新建一个bash进程,如果不新建进程,新的namespace就会使用unshare的PID作为新的空间的父进程,而unshare进程并不在新的namespace中,所以会报Cannot allocate memory
2、mount-proc 是因为Linux下每个进程都有一个对应的/proc/PID目录,该目录中包含大量当前进程的信息,对一个PID namespace 而言。创建一个新的PID namespace后,如果向让子进程中ll、to等指令依赖/proc文件系统的命令工作,需要挂载/proc文件系统。而文件系统隔离是mount namespace管理的,所以Linux特意提供了一个选项--mount-proc来解决这个问题。如果不带这个我们看到的进程还是系统的进程信息
NameSpace Actual Conbat
打开shell窗口A,执行df -h 查看主机默认命名空间的磁盘挂载情况
[root@VM-20-6-centos data]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.9G 24K 1.9G 1% /dev/shm
tmpfs 1.9G 3.9M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/vda1 59G 23G 34G 41% /
tmpfs 370M 0 370M 0% /run/user/0
tmpfs 370M 0 370M 0% /run/user/1001
/dev/loop0 6.8M 77K 6.2M 2% /data/testmymount
打开一个新的shell窗口,执行mount隔离命令
[root@VM-20-6-centos ~]# unshare --mount --fork /bin/bash #表示创建子进程并隔离mount命名空间
[root@VM-20-6-centos ~]# mkdir -p /data/tmpmount
添加新的磁盘挂载,并添加文件
[root@VM-20-6-centos ~]# cd /data/tmpmount/
[root@VM-20-6-centos ~]# dd if=/dev/zero of=fdimage.img bs=8k count=10240
[root@VM-20-6-centos tmpmount]# mount ./fdimage.img /data/tmpmount
[root@VM-20-6-centos tmpmount]# echo "hello world" > test.txt
分别在两个窗口中查看挂载信息,并查看文件。可以观察到两者观察到的目录内文件并不相同,说明我们实现了文件系统的隔离
[root@VM-20-6-centos tmpmount]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 59G 23G 34G 41% /
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.9G 24K 1.9G 1% /dev/shm
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 1.9G 3.9M 1.9G 1% /run
tmpfs 370M 0 370M 0% /run/user/0
tmpfs 370M 0 370M 0% /run/user/1001
/dev/loop0 6.8M 77K 6.2M 2% /data/testmymount
/dev/loop1 74M 1.6M 67M 3% /data/tmpmount
[root@VM-20-6-centos tmpmount]# ll
total 4492
-rw-r--r-- 1 root root 83886080 May 25 19:38 fdimage.img
-rw-r--r-- 1 root root 12 May 25 19:35 test.txt
[root@VM-20-6-centos tmpmount]# ll
total 13
drwx------ 2 root root 12288 May 25 19:34 lost+found
-rw-r--r-- 1 root root 12 May 25 19:38 test.txt
CGroups
pidstat 是sysstat的一个命令,用于监控全部或指定进程的CPU、内存、线程、设备IO等系统资源的占用情况,用户可以通过指定的统计次数和时间来获得所需的统计信息
pidstat [option][<time interval>][<times>]
# 安装: yum install sysstat -y
# 卸载: yum remove sysstat -y
@example
pidstat -C stress -p ALL -u 2 100000 # 每两秒监控stress命令全部进程cpu使用,监视100000次
stress 是Linux的一个压力测试工具,可以对CPU、Memory、IO、磁盘等进行压力测试
stress [OPTION[ARG]]
-c --cpu N :产生N个进程,每个进程都训话你调用sqrt函数压力CPU
-i --io N :产生N个进程,每个进程循环调用sync将内存缓冲区内容写道磁盘上,产生IO压力
-m --vm N :产生N个进程,每个进程频繁调用malloc/free来分配释放内存
查看cgroups版本
[root@VM-20-6-centos tmpmount]# cat /proc/filesystems | grep cgroup
nodev cgroup
cgroups子系统查看
[root@VM-20-6-centos tmpmount]# cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 5 2 1
cpu 2 186 1
cpuacct 2 186 1
memory 4 186 1
devices 7 167 1
freezer 3 2 1
net_cls 6 2 1
blkio 11 167 1
perf_event 8 2 1
hugetlb 10 2 1
pids 9 167 1
net_prio 6 2 1
cgroups挂载信息查看
[root@VM-20-6-centos tmpmount]# ls /sys/fs/cgroup
blkio cpuacct cpuset freezer memory net_cls,net_prio perf_event systemd
cpu cpu,cpuacct devices hugetlb net_cls net_prio pids
查看一个进程上cgroup限制
# 以当前shell进程为例,查看进程cgrouup
[root@VM-20-6-centos tmpmount]# cat /proc/$$/cgroup
11:blkio:/user.slice
10:hugetlb:/
9:pids:/user.slice
8:perf_event:/
7:devices:/user.slice
6:net_prio,net_cls:/
5:cpuset:/
4:memory:/user.slice
3:freezer:/
2:cpuacct,cpu:/user.slice
1:name=systemd:/user.slice/user-1001.slice/session-1217342.scope
# 可以组合mount | grep cgroup 来查找控制信息
[root@VM-20-6-centos 7058]# mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
[root@VM-20-6-centos 7058]# ll /sys/fs/cgroup/cpu,cpuacct/user.slice
total 0
-rw-r--r-- 1 root root 0 May 17 17:22 cgroup.clone_children
--w--w--w- 1 root root 0 May 17 17:22 cgroup.event_control
-rw-r--r-- 1 root root 0 May 17 17:22 cgroup.procs
-r--r--r-- 1 root root 0 May 17 17:22 cpuacct.stat
-rw-r--r-- 1 root root 0 May 17 17:22 cpuacct.usage
-r--r--r-- 1 root root 0 May 17 17:22 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 May 17 17:22 cpu.cfs_period_us # CPU总时间片
-rw-r--r-- 1 root root 0 May 17 17:22 cpu.cfs_quota_us # 该进程占用时间片 -1代表不受cgroup控制
-rw-r--r-- 1 root root 0 May 17 17:22 cpu.rt_period_us
-rw-r--r-- 1 root root 0 May 17 17:22 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 May 17 17:22 cpu.shares
-r--r--r-- 1 root root 0 May 17 17:22 cpu.stat
-rw-r--r-- 1 root root 0 May 17 17:22 notify_on_release
-rw-r--r-- 1 root root 0 May 17 17:22 tasks
Cgroup Control Memory
[root@VM-20-6-centos 7058]# mount | grep cgroup # 找到控制内存信息的文件
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) # 这个
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
[root@VM-20-6-centos 7058]# cd /sys/fs/cgroup/memory
[root@VM-20-6-centos memory]# mkdir test_memlimit # 系统会为我们自动配置文件
[root@VM-20-6-centos test_memlimit]# ls # 重点关注limit_in_bytes空间上线 和 tasks(任务)
cgroup.clone_children memory.kmem.tcp.max_usage_in_bytes memory.oom_control
cgroup.event_control memory.kmem.tcp.usage_in_bytes memory.pressure_level
cgroup.procs memory.kmem.usage_in_bytes memory.soft_limit_in_bytes
memory.failcnt memory.limit_in_bytes memory.stat
memory.force_empty memory.max_usage_in_bytes memory.swappiness
memory.kmem.failcnt memory.memsw.failcnt memory.usage_in_bytes
memory.kmem.limit_in_bytes memory.memsw.limit_in_bytes memory.use_hierarchy
memory.kmem.max_usage_in_bytes memory.memsw.max_usage_in_bytes notify_on_release
memory.kmem.slabinfo memory.memsw.usage_in_bytes tasks
memory.kmem.tcp.failcnt memory.move_charge_at_immigrate
memory.kmem.tcp.limit_in_bytes memory.numa_stat
[root@VM-20-6-centos test_memlimit]# cat memory.limit_in_bytes # 可以看到内存是不上限的
9223372036854771712
[root@VM-20-6-centos test_memlimit]# echo "20971520" > memory.limit_in_bytes # 将其设置为20M
[root@VM-20-6-centos test_memlimit]# cat memory.limit_in_bytes
20971520
新建两个终端进行压力测试
# 终端1
[clx@VM-20-6-centos test_memlimit]$ stress -m 1 --vm-bytes 50m
stress: info: [1851] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [1851] (415) <-- worker 1852 got signal 9
stress: WARN: [1851] (417) now reaping child worker processes
# 压力测试退出
stress: FAIL: [1851] (451) failed run completed in 139s
# 终端2
08:30:29 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command
08:30:31 PM 1001 1851 0.00 0.00 10428 456 0.01 stress
08:30:31 PM 1001 1852 244557.00 0.00 61632 11324 0.30 stress
08:30:31 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command
08:30:33 PM 1001 1851 0.00 0.00 10428 456 0.01 stress
08:30:33 PM 1001 1852 240434.00 0.00 61632 29280 0.77 stress
# 此时在终端0中将 1852 移入tasks中,压力测试立马退出
08:30:33 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command
Cgroup Control CPU
[clx@VM-20-6-centos test_memlimit]$ mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu) # 这个
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
[root@VM-20-6-centos test_memlimit]# cd /sys/fs/cgroup/cpu,cpuacct
[root@VM-20-6-centos cpu,cpuacct]# cat cpu.cfs_period_us # 默认带宽,单位为微秒
100000
[root@VM-20-6-centos cpu,cpuacct]# cat cpu.cfs_quota_us # 目前不受cgroup控制
-1
[root@VM-20-6-centos cpu,cpuacct]# mkdir test_cpu
[root@VM-20-6-centos cpu,cpuacct]# cd test_cpu
[root@VM-20-6-centos test_cpu]# echo "20000" > cpu.cfs_quota_us
[root@VM-20-6-centos test_cpu]# cat cpu.cfs_quota_us # 设置CPU占用率为20%
20000
新建两个终端进行压力测试文章来源:https://www.toymoban.com/news/detail-475140.html
# 终端1
[root@VM-20-6-centos tmpmount]# stress --cpu 1
stress: info: [7206] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
# 终端2
[root@VM-20-6-centos tmpmount]# pidstat -C stress -p ALL -u 2 10000
# 开始7207进程CPU使用率接近100%
09:58:14 AM UID PID %usr %system %guest %CPU CPU Command
09:58:16 AM 0 7206 0.00 0.00 0.00 0.00 1 stress
09:58:16 AM 0 7207 97.50 0.00 0.00 97.50 0 stress
09:58:16 AM UID PID %usr %system %guest %CPU CPU Command
09:58:18 AM 0 7206 0.00 0.00 0.00 0.00 1 stress
09:58:18 AM 0 7207 81.50 0.50 0.00 82.00 1 stress
# 将7207进程写入到tasks中,可以看到该进程的CPU使用率最高只有20%了
09:58:18 AM UID PID %usr %system %guest %CPU CPU Command
09:58:20 AM 0 7206 0.00 0.00 0.00 0.00 1 stress
09:58:20 AM 0 7207 20.00 0.00 0.00 20.00 1 stress
# 终端0
[root@VM-20-6-centos test_cpu]# cat tasks;
[root@VM-20-6-centos test_cpu]# echo "7207" > tasks
总结:docker的本质就是调用这些API来完成对资源的管理的,但docker的易用性和镜像的设计更加人性化文章来源地址https://www.toymoban.com/news/detail-475140.html
到了这里,关于【Docker】0.空间资源隔离的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!