Namespace隔离实战【Linux】

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.imgdd 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
    • 可以发现,这个终端中bashhostname没变,说明子进程bashhostname已被隔离。
  • 子进程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中的挂载隔离的子进程退出后,在该子进程内进行的挂载操作(如格式化并挂载磁盘)会全部自动卸载,相关的挂载信息会"丢失"。


相关推荐
A小辣椒18 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩3 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言