文章目录
-
- Namespace
- [一、dd 命令详解](#一、dd 命令详解)
- [二、mkfs 命令详解](#二、mkfs 命令详解)
- [三、df 命令详解](#三、df 命令详解)
- [四、mount 命令详解](#四、mount 命令详解)
- [五、unshare 命令详解](#五、unshare 命令详解)

Namespace
namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。
Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
Namespace 相关参数与说明
| namespace | 系统调用参数 | 被隔离的全局系统资源 | 引入内核版本 |
|---|---|---|---|
| UTS | CLONE_NEWUTS | 主机名和域名 | 2.6.19 |
| IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存 - - 进程间通信 | 2.6.19 |
| PID | CLONE_NEWPID | 进程编号 | 2.6.24 |
| Network | CLONE_NEWNET | 网络设备、网络栈、端口等 | 2.6.29 |
| Mount | CLONE_NEWNS | 文件系统挂载点 | 2.4.19 |
| User | CLONE_NEWUSER | 用户和用户组 | 3.8 |
容器环境下的隔离效果
- UTS:每个容器能看到自己的hostname,拥有独立的主机名和域名。
- IPC:同一个IPC namespace 的进程之间能互相通讯,不同的IPC namespace 之间不能通信。
- PID:每个PID namespace 中的进程可以有其独立的PID,每个容器可以有其PID 为 1 的root 进程。
- Network:每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号。
- Mount:每个容器能看到不同的文件系统层次结构。
- User:每个container 可以有不同的user 和group id。
隔离两个进程的实现思路
- 首先容器进程与进程之间需要隔离,所以需要PID 隔离
- 首先容器A 进程不能读取容器B 进程通讯内容需要隔离信号量等,所以需要IPC 隔离
- 首先容器A 进程不能读取容器B 进程的文件,所以需要Mount 隔离
- 首先容器A 进程不能读取容器B 进程的socket,所以需要网络隔离、主机隔离
- Docker 允许用户在主机和容器间共享文件夹,同时不需要限制容器的访问权限,这就容易让容器突破资源限制。需要借助用户空间来完成用户之间的隔离。
一、dd 命令详解
Linux dd 命令用于读取、转换并输出数据。
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=ascii | 转换ebcdic为ascii |
| conv=ebcdic | 转换ascii为ebcdic |
| conv=ibm | 转换ascii为alternate ebcdic |
| conv=block | 把每一行转换为长度为cbs,不足部分用空格填充 |
| conv=unblock | 使每一行的长度都为cbs,不足部分用空格填充 |
| conv=lcase | 把大写字符转换为小写字符 |
| conv=ucase | 把小写字符转换为大写字符 |
| conv=swap | 交换输入的每对字节 |
| conv=noerror | 出错时不停止 |
| conv=notrunc | 不截短输出文件 |
| conv=sync | 将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐 |
| --help | 显示帮助信息 |
| --version | 显示版本信息 |
案例
shell
# 生成1个镜像文件
dd if=/dev/zero of=fdimage.img bs=8k count=10240
# 将testfile文件中的所有英文字母转换为大写,然后转成为testfile_1文件
dd if=testfile_2 of=testfile_1 conv=ucase
二、mkfs 命令详解
用于在设备上创建Linux文件系统,俗称格式化,比如我们使用U盘的时候可以格式化。
语法:mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
常见参数
| 参数 | 说明 |
|---|---|
| -t fstype | 指定要建立何种文件系统;如ext3,ext4 |
| filesys | 指定要创建的文件系统对应的设备文件名 |
| blocks | 指定文件系统的磁盘块数 |
| -V | 详细显示模式 |
| fs-options | 传递给具体的文件系统的参数 |
实例
shell
# 将sda6分区格式化为ext4格式
mkfs -t ext4 /dev/sda6
# 格式化镜像文件为ext4
mkfs -t ext4 ./fdimage.img
三、df 命令详解
Linux df 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。
语法:df [OPTION]... [FILE]...
常见参数
| 参数 | 说明 |
|---|---|
| -a, --all | 包含所有的具有 0 Blocks 的文件系统 |
| -h, --human-readable | 使用人类可读的格式(预设值是不加这个选项的...) |
| -H, --si | 很像 -h,但是用 1000 为单位而不是用 1024 |
| -t, --type=TYPE | 限制列出文件系统的 TYPE |
| -T, --print-type | 显示文件系统的形式 |
案例
shell
# 查看磁盘使用情况
df -h
# 查看磁盘的系统类型
df -Th
四、mount 命令详解
mount 命令用于加载文件系统到指定的加载点。此命令的也常用于挂载光盘,使我们可以访问光盘中的数据,因为你将光盘插入光驱中,Linux 并不会自动挂载,必须使用 Linux mount 命令来手动完成挂载。
Linux 系统下不同目录可以挂载不同分区和磁盘设备,它的目录和磁盘分区是分离的,可以自由组合(通过挂载),不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备。挂载的实质是为磁盘添加入口(挂载点)。
语法:mount [-l] mount [-t vfstype] [-o options] device dir
常见参数
| 参数 | 说明 |
|---|---|
| -l | 显示已加载的文件系统列表 |
| -t vfstype | 加载文件系统类型支持常见系统类型的ext3,ext4,iso9660,tmpfs,xfs等,大部分情况可以不指定,mount 可以自己识别 |
| -o loop | 用来把一个文件当成硬盘分区挂接上系统 |
| -o ro | 采用只读方式挂接设备 |
| -o rw | 采用读写方式挂接设备 |
| device | 要挂接(mount)的设备 |
| dir | 挂载点的目录 |
案例
shell
# 将 /dev/hda1 挂在 /mnt 之下。
mount /dev/hda1 /mnt
# 将镜像挂载到/mnt/testext4 下面,需要确保挂载点也就是目录存在
mkdir -p /mnt/testext4
mount ./fdimage.img /mnt/testext4
五、unshare 命令详解
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 优先挂载过去 |
案例
shell
# hostname 隔离
root@139-159-150-152:~# unshare -u /bin/bash
root@139-159-150-152:~# hostname test1
root@139-159-150-152:~# hostname
test1
root@139-159-150-152:~# exit
exit
root@139-159-150-152:~# hostname
139-159-150-152
root@139-159-150-152: