Namespace隔离实战
- [1. 基础知识](#1. 基础知识)
-
- [1.1 dd命令详解](#1.1 dd命令详解)
- [1.2 mkfs命令详解](#1.2 mkfs命令详解)
- [1.3 df命令详解](#1.3 df命令详解)
- [1.4 mount命令详解](#1.4 mount命令详解)
- [1.5 unshare命令详解](#1.5 unshare命令详解)
- [2. 实战操作一(PID隔离)](#2. 实战操作一(PID隔离))
- [3. 实战操作二(Mount隔离)](#3. 实战操作二(Mount隔离))
1. 基础知识
1.1 dd命令详解
1. 功能
- 用于读取、转换并输出数据;
dd
可以从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。
2. 语法
bash
dd POTION
- 参数:
if=
文件名:输入文件名,默认为标准输入。即指定源文件。of=
文件名:输出文件名,默认为标准输出。即指定目的文件。ibs=bytes
:一次读入bytes字节,即指定一个快大小为bytes个字节。obs=bytes
:一次输出bytes字节,即指定一个快大小为bytes个字节。bs=bytes
:同时设置读入/输出的块大小为bytes个字节。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个字节,不足部分用空(NULL)字符补充。
3. 实操:
- 生成镜像文件
test.img
:dd if=/dev/zero of=test.img bs=8k count=1024
- 可以这样理解,创建了一个描述磁盘的结构体文件
test.img
。之后要想使用该磁盘,还需要对其实例化创建使用入口,就是常说的挂载。
- 可以这样理解,创建了一个描述磁盘的结构体文件

1.2 mkfs命令详解
1. 功能:
- 用于在设备上创建Linux文件系统,俗称格式化,比如我们使用U盘的时候可以格式化。
2. 语法:
bash
mkfs [-v] [-t fstype] [fs-options] filesys [blocks]
- 参数:
-t fstype
:指定要建立何种文件系统:如ext3,ext4。filesys
:指定要创建的文件系统对应的设备名。blocks
:指定文件系统的磁盘块数。
-V
:显示详细模式。
3. 实操:
- 为该磁盘指定一个文件系统
ext4
。

1.3 df命令详解
1. 功能
- 显示已挂载文件系统的总空间、已用空间、可用空间、使用百分比以及挂载点等信息。
2. 语法
bash
df [选项]... [文件或目录]...
- 常用选项:
-h
:显示易读格式;-i
:显示 inode;-T
:显示文件系统类型;-a
:显示所有文件系统;
3. 实操:

1.4 mount命令详解
1. 功能:
- 用于加载文件系统到指定的加载点。此命令也常用于挂载光盘,使我们可以访问光盘中的数据,因为你将光盘插入光驱,Linux不会自动挂载,必须使用Linux mount命令来手动挂载。
Linux下,不同目录可以挂载不同分区和磁盘设备,它的目录和磁盘分区是分离的,可以自由组合(通过挂载)。不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备。挂载的实质是为磁盘添加入口(挂载点)。
2. 语法:
bash
mount [-l]
mount [-t vfstype] [-o options] device dir
- 常见参数:
-l
:显示已加载的文件系统列表;-t
:加载文件系统类型,支持常见的系统类型 ext3、ext4、iso966、tmpfs、xfs等,大部分情况可以不指定,mount
可以自己识别;-o options
主要用来描述设备或档案的挂接方式:loop
:用来把一个文件当成磁盘分区挂接上系统;ro
:采用只读方式挂接设备;rw
:采用读写方式挂接设备。
device
:要挂接(mount)的设备;dir
:挂载点的目录
3. 实操:
- 将该磁盘挂载到目录
/data/testmymount/
,之后在这个目录中进行的操作,就是在test.img
描述的磁盘中进行操作。

1.5 unshare命令详解
1. 功能:
- 主要能力是使用与父进程不共享的名称空间来运行程序。
2. 语法:
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优先挂载过去 |
3. 实操hostname隔离
unshare -u /bin/bash
,启动一个子进程bash
,让其和父进程不共享UTS空间,并修改子进程hostname
:

- 另起一个终端,查看
hostname
:- 可以发现,这个终端中
bash
的hostname
没变,说明子进程bash
的hostname
已被隔离。
- 可以发现,这个终端中

- 子进程
bash
退出,再查看hostname
:hostname
为父进程的hostname
,没有改变。

2. 实战操作一(PID隔离)
1. 在主机上执行ps -ef,可以看到进程列表如下,其中启动进程PID 1为init进程

2. 打开另一个shell,创建新的bash进程,并且新建一个PID Namespace
- 执行命令
unshare -p --fork --mount-proc /bin/bash
。注意,一共要带三个参数:-p
:PID隔离;--fork
:先创建子进程;--mount-proc
:挂载虚拟文件系统/proc
。
3. 在新shell中ps -ef查看

- 只有这些内容,隔离成功。
3. 实战操作二(Mount隔离)
1. 打开第一个shell窗口A,执行命令,df -h,查看主机默认命名空间的磁盘挂载情况

2. 打开一个新的shell窗口B,执行Mount隔离命令

3. 在窗口B中,创建新镜像文件,并格式化:

4. 在窗口B中,创建新目录,并将磁盘挂载到该目录,并df查看:

5. 在窗口A中df查看:
- 找不到
datamount
文件夹的挂载信息,被隔离了。就算再向该目录中添加文件,外部也看不到。

当窗口B中的挂载隔离的子进程退出后,在该子进程内进行的挂载操作(如格式化并挂载磁盘)会全部自动卸载,相关的挂载信息会"丢失"。