Namespace
namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。
介绍 Docker 容器虚拟化的基础概念 Namespace,包括其六种类型及隔离机制,并结合实际命令演示如何利用 dd、mkfs、df、mount 和 unshare 工具进行资源管理与命名空间隔离操作。

namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。
Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 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 |
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 | 显示版本信息 |
# 生成1个镜像文件
dd if=/dev/zero of=fdimage.img bs=8k count=10240
# 将 testfile 文件中的所有英文字母转换为大写,然后转成为 testfile_1 文件
dd if=testfile_2 of=testfile_1 conv=ucase
用于在设备上创建 Linux 文件系统,俗称格式化,比如我们使用 U 盘的时候可以格式化。
语法:mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
| 参数 | 说明 |
|---|---|
| -t fstype | 指定要建立何种文件系统;如 ext3,ext4 |
| filesys | 指定要创建的文件系统对应的设备文件名 |
| blocks | 指定文件系统的磁盘块数 |
| -V | 详细显示模式 |
| fs-options | 传递给具体的文件系统的参数 |
# 将 sda6 分区格式化为 ext4 格式
mkfs -t ext4 /dev/sda6
# 格式化镜像文件为 ext4
mkfs -t ext4 ./fdimage.img
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 | 显示文件系统的形式 |
# 查看磁盘使用情况
df -h
# 查看磁盘的系统类型
df -Th
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 | 挂载点的目录 |
# 将 /dev/hda1 挂在 /mnt 之下。
mount /dev/hda1 /mnt
# 将镜像挂载到 /mnt/testext4 下面,需要确保挂载点也就是目录存在
mkdir -p /mnt/testext4
mount ./fdimage.img /mnt/testext4
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 隔离
$ unshare -u /bin/bash
$ hostname test1
$ exit
$ hostname
139-159-150-152

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online