[Docker][NameSpace][PID 隔离][Mount 隔离]详细讲解


1.什么是NameSpace

  • namespace是Linux内核用来隔离内核资源的方式
  • 是一种将全局系统资源划分为独立单元的资源隔离方法,对文件系统、进程、网络、设备等资源进行隔离,使得在不同命名空间中运行的进程看到的资源是不同的,彼此之间相互隔离,容器内的进程认为它们运行在独立的环境中,而不会看到主机上其他容器的影响
  • 具体的实现方式是把一个或多个进程的相关资源指定在同一个namespace

2.NameSpace操作

  • Linux提供了多个API来操作namespace,分别为:clone()setns()unshare(),为了确定隔离的是哪项namespace,在使用以上API时,需要指定调用参数

    namespace系统调用参数被隔离的全局系统资源
    UTSCLONE_NEWUTS主机名和域名
    IPCCLONE_NEWIPC通信资源 - 信号量、消息队列、共享内存
    PIDCLONE_NEWPID进程编号
    NetworkCLONE_NEWNET网络资源 - 网络设备、网络栈、端口
    MountCLONE_NEWNS文件系统挂载点
    UserCLONE_NEWUSER用户和用户组
  • 以上命名空间在容器环境下的隔离效果

    • UTS:每个容器能看到自己的hostname,拥有独立的主机名和域名
    • IPC:同一个IPC namespace的进程之间能互相通讯,不同的 IPC namespace 之间不能通信
    • PID:每个PID namespace中的进程可以有其独立的PID,每个容器可以有其PID为1的root进程
    • Network:每个容器拥有其独立的网络设备,IP地址,IP路由表,/proc/net目录,端口号
    • Mount:每个容器能看到不同的文件系统层次结构
    • User:每个Container可以有不同的usergroup id
  • 如果要隔离两个进程需要怎么办?

    • 容器进程与进程之间需要隔离,所以需要PID隔离
    • 容器A进程不能读取容器B进程通讯内容需要隔离信号量等,所以需要IPC隔离
    • 容器A进程不能读取容器B进程的文件,所以需要Mount隔离
    • 容器A进程不能读取容器B进程的 socket,所以需要网络隔离、主机隔离
    • Docker允许用户在主机和容器间共享文件夹,同时不需要限制容器的访问权限, 这就容易让容器突破资源限制。需要借助用户空间来完成用户之间的隔离

3.基础语法

1.dd 命令

  • 功能:用于读取、转换并输出数据,可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出
  • 语法
    dd OPTION
    
  • 参数
    • 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=<关键字>,关键字可以有以下11种
      • conversion:用指定的参数转换文件
      • ascii:转换ebcdicascii
      • ebcdic:转换 asciiebcdic
      • ibm:转换 asciialternate ebcdic
      • block:把每一行转换为长度为cbs,不足部分用空格填充
      • unblock:使每一行的长度都为 cbs,不足部分用空格填充
      • lcase:把大写字符转换为小写字符
      • ucase:把小写字符转换为大写字符
      • swap:交换输入的每对字节
      • noerror:出错时不停止
      • notrunc:不截短输出文件
      • sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
    • --help:显示帮助信息
    • --version:显示版本信息
  • 示例
    # 生成一个镜像文件
    dd if=/dev/zero of=SnowK.img bs=8k count=1024
    
    # 将SnowK文件中的所有英文字母转化为大写,然后转成为Die文件
    dd if=SnowK of=Die conv=ucase
    

2.mkfs 命令

  • 功能:用于在设备上创建Linux文件系统,俗称格式化
    • 比如使用U盘的时候可以格式化
  • 语法
    mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
    
  • 参数
    • -V : 详细显示模式
    • -t fstype:指定要建立何种文件系统
      • 如:ext3,ext4
    • fs-options:传递给具体的文件系统的参数
    • filesys指定要创建的文件系统对应的设备文件名
    • blocks:指定文件系统的磁盘块数
  • 示例
    # 格式化镜像文件为ext4
    mkfs -t ext4 SnowK.img
    

3.df 命令

  • 功能:显示目前在Linux系统上的文件系统磁盘使用情况统计
  • 语法
    df [OPTION]... [FILE]
    
  • 常见参数
    • -a:包含所有的具有0 Blocks的文件系统
    • -h:使用人类可读的格式
    • -H:很像-h,但是用1000为单位而不是用1024
    • -t--type=TYPE,限制列出文件系统的TYPE
    • -T:显示文件系统的形式
  • 示例
    # 查看磁盘使用情况
    df -h
    
    # 查看磁盘的系统类型
    df -Th
    

4.mount 命令

  • 功能:用于加载文件系统到指定的加载点,此命令的也常用于挂载光盘,使我们可以访问光盘中的数据
    • 因为将光盘插入光驱中,Linux并不会自动挂载,必须使用mount命令来手动完成挂载
    • 挂载的实质:为磁盘添加入口(挂载点)
  • 注意:Linux系统下不同目录可以挂载不同分区和磁盘设备,它的目录和磁盘分区是分离的, 可以自由组合(通过挂载)
  • 常见语法
    mount [-l]
    mount [-t vfstype] [-o options] device dir
    
  • 常见参数
    • -l:显示已加载的文件系统列表
    • -t:加载文件系统类型
      • 支持常见系统类型的ext3,ext4,iso9660,tmpfs,xfs等
      • 大部分情况可以不指定,mount可以自己识别
    • -o options:主要用来描述设备或档案的挂接方式
      • loop:用来把一个文件当成硬盘分区挂接上系统
      • ro:采用只读方式挂接设备
      • rw:采用读写方式挂接设备
    • device:要挂接(mount)的设备
    • dir:挂载点的目录
  • 示例
#将SnowK.img镜像挂载到/test目录下,需要确保挂载点(目录)存在
mkdir /test
mount ./SnowK.img /data

5.unshare 命令

  • 功能:使用与父程序不共享的名称空间运行程序

  • 语法

    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优先挂载过去
  • 示例

    # 隔离hostname
    snowk@SnowKYP:~$ unshare -u /bin/bash
    root@SnowKYP:/home/snowk# hostname SnowK
    root@SnowKYP:/home/snowk# hostname
    SnowK
    root@SnowKYP:/home/snowk# exit
    exit
    snowk@SnowKYP:~$ hostname
    SnowKYP
    

4.PID 隔离实战

  • 命令
    unshare --fork --pid --mount-proc /bin/bash
    
  • 解释
    • --fork:新建一个bash进程,是因为如果不建新进程,新的namespace会用unshare的 PID作为新的空间的父进程,而这个unshare进程并不在新的namespace中,所以会报错Cannot allocate memory
    • --pid:隔离PID
    • --mount-proc:Linux下的每个进程都有一个对应的/proc/PID目录,该目录包含了大量的有关当前进程的信息
      • 对一个PID namespace而言,/proc目录只包含当前namespace和它所有子孙后代namespace里的进程的信息
      • 创建一个新的PID namespace后,如果想让子进程中的top、ps等依赖/proc 文件系统的命令工作,还需要挂载/proc 文件系统
      • 而文件系统隔离是mount namespace管理的,所以Linux特意提供了一个选项--mount-proc来解决这个问题
        • 如果不带这个看到的进程还是系统的进程信息

5.Mount 隔离实战

  • 命令
    unshare --mount --fork /bin/bash
    
  • 解释
    • --mount:隔离Mount命名空间
    • --fork:新建进程
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DieSnowK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值