- 投稿日:2020-07-13T16:55:49+09:00
centOS 7インストールエラー
centOS 7 (2003)のインストールが失敗
30GBの未割当領域にwin10とデュアルブートでインストールを試みるも
インストール画面のパーティション選択をすると途端にエラーが発生
インストール中断しか選択できない始末となった。パーティション選択画面から何も選択しないで完了を押してもエラーが発生することから
どうやらインストーラー側に問題がありそうである。ダウンロード・インストール環境は以下の通り
URL:http://ftp.tsukuba.wide.ad.jp/Linux/centos/7.8.2003/isos/x86_64/CentOS-7-x86_64-DVD-2003.iso
USB:8 GB (FAT32)
(ISO書き込みにはRufusを使用)ファイルサイズもDVDバージョン(4.5GB)なので問題なさそうである。
(centOSはOS初期のファイルサイズがUbuntuに比べて大きい気がする。9GB近いファイルは間違いなくDVDには入らない。USBだって意外と手持ちのものはサイズが小さい。おそらくcentOS8ではすでにDVDインストールを前提としたインストールは、除外したように思われれる。サーバー利用が基本であるし、一度インストールすればもはごみとなるインストールファイルの合理化も進んでいるようだ....やはりUbuntuは優しい)考えられる理由としてはcentOSのダウンロードにFlashGetを利用したことくらいである。
このFlashGetは大容量のファイルダウンロードを高速に終わらせるソフトだが、
ファイルを分割して他サーバーにダウンロードさせ、その断片ファイルを自分のPCで結合することで高速化を実現している。
そのため、結合がきちんとできていないと思わぬエラーに遭遇することがある。よって、時間はかかるがChromeの標準ダウンローダーで再度上記のcentOSをダウンロード。
Rufusでインストールするも今度はブートローダーがインストールされず起動しない....orzということで、UnetbootinでcentOSのUSBを作った
Unetbootin:http://unetbootin.github.io/
しかし、これも駄目であった。次に、Etcherを使ってブートUSBを作成。
balenaEtcher:https://www.balena.io/etcher/
このソフトは圧倒的に書き込みスピードが速い。しかし、作成後のUSBはWindowsでは認識されないようになる。
無事ブートもできたものの、結局最初と同じエラーが発生。次記事に続く
- 投稿日:2020-07-13T16:06:39+09:00
shellで受け取ったフルパスを使用したファイルリネーム
概要
shellにファイルのフルパスを引数として渡したときに、もともとのファイルネームを利用しつつ名前を変えたい
例:
引数→ /home/desk/a.txt
出力→ /home/desk/bc_a.txtソース
a=/home/desk/a.txt echo $(dirname ${a})/bc_$(basename ${a})実行結果
/home/desk/bc_a.txtコマンド詳細
dirnameコマンドは引数のディレクトリ部分を抜き出してくれる
basenameはファイルネーム部分を抜き出してくれる
抜き出し条件も細かく決めることが可能なため、必要に応じて要調査
(拡張子なしで抜き出すなど)
- 投稿日:2020-07-13T12:40:15+09:00
bpftraceで Docker の仕組み調べてみる
概要
Dockerはよく
docker run
とかdocker exec
のコマンドで Black Box みたいに使われて完結ですが、その中身をもっと詳しく調査してみたい。そのための有力ツールの一つはbpftraceです。作業環境
- Ubuntu 20.04
Dockerの構成
Dockerはおよそ以下のパーツに構成されている
docker-cli
:docker run
とdocker exec
などのコマンドを提供するDockerのクライアント側dockcerd
:Docker のサーバー側、Docker Engine のデーモンプロセス、docker-cli
などクライアントからのリクエストを処理する場所containerd
:Container Runtime の一つ、いろんな Container の管理を機能しているデーモンプログラムrunc
:いろんなOS機能を利用して、単独のContainerの実行を成せているツールDockerがやっていること
Containerは Namespace、Cgroup、OverlayFS、Virtual Network などのOS機能利用して可能になるのがよくご存知ですが、Docker はこちらの機能どう利用したますか?
まずは、Container が実行した結果を確認していきます。この一番簡単の Container 起動します
$ docker run -ti --rm --name test alpine shこれからの利用のために pid と Container ID をに保存しておきます
$ export CPID=$(docker inspect test -f '{{ .State.Pid }}') $ echo $CPID 230973 $ export CID=$(docker inspect test -f '{{ .Id }}') $ echo $CID b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0
containerd
との親子関係$ pstree -s $CPID -STUpau systemd,1 └─containerd,80405 └─containerd-shim,230955 -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd ... └─sh,230973,ipc,mnt,net,pid,uts
containerd
はcontainerd-shim
を実行して、そしてまた Container プロセスを実行する。また、このContainer プロセスにはipc
とかmnt
などの namespace がついている。runcの設定
containerd
がrunc
を利用してるので、その設定も確認します$ jq -r '.process' < /var/run/containerd/io.containerd.runtime.v1.linux/moby/$CID/config.json { "terminal": true, "user": { "uid": 0, "gid": 0, ... }, "args": [ "sh" ], "env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "HOSTNAME=b6431f14cf40", "TERM=xterm" ], "cwd": "/", "capabilities": { "bounding": [ "CAP_CHOWN", "CAP_DAC_OVERRIDE", "CAP_FSETID", "CAP_FOWNER", "CAP_MKNOD", "CAP_NET_RAW", "CAP_SETGID", "CAP_SETUID", "CAP_SETFCAP", "CAP_SETPCAP", "CAP_NET_BIND_SERVICE", "CAP_SYS_CHROOT", "CAP_KILL", "CAP_AUDIT_WRITE" ], ... }, "apparmorProfile": "docker-default", "oomScoreAdj": 0 }Namespaces
Container プロセスについている namespace を具体的に見に行きましょう
$ lsns -p $CPID --output-all NS TYPE PATH NPROCS PID PPID COMMAND UID USER NETNSID NSFS 4026531835 cgroup /proc/1/ns/cgroup 120 1 0 /sbin/init 0 root 4026531837 user /proc/1/ns/user 120 1 0 /sbin/init 0 root 4026532186 mnt /proc/230973/ns/mnt 1 230973 230955 sh 0 root 4026532187 uts /proc/230973/ns/uts 1 230973 230955 sh 0 root 4026532188 ipc /proc/230973/ns/ipc 1 230973 230955 sh 0 root 4026532189 pid /proc/230973/ns/pid 1 230973 230955 sh 0 root 4026532191 net /proc/230973/ns/net 1 230973 230955 sh 0 root 0 /run/docker/netns/904e1ae9696cCgroups
所属している Cgroup はこちら
$ cat /proc/$CPID/cgroup 12:freezer:/docker/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0 11:devices:/docker/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0 10:blkio:/docker/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0 9:rdma:/ 8:pids:/docker/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0 7:memory:/docker/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0 6:hugetlb:/docker/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0 5:net_cls,net_prio:/docker/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0 4:cpu,cpuacct:/docker/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0 3:cpuset:/docker/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0 2:perf_event:/docker/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0 1:name=systemd:/docker/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0 0::/system.slice/containerd.serviceそして Cgroup の内容もちょっと見に行きましよう
$ cgget -g pids:/docker/$CID /docker/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0: pids.current: 1 pids.events: max 0 pids.max: max $ cgget -g net_cls,net_prio:/docker/$CID /docker/b6431f14cf40267d3eed22b34fc6e974be28f2e0f5b9b2bfbccdffaa5327a4a0: net_cls.classid: 0 net_prio.prioidx: 3 net_prio.ifpriomap: lo 0 enp0s3 0 docker0 0 veth18981d6 0Mounts
このContainer プロセスがマウントしたディレクトリはこちら
$ cat /proc/$CPID/mounts overlay / overlay rw,relatime,lowerdir=/var/lib/docker/overlay2/l/JVWDDYIF5YQFGNGL3PDNWJ4A4M:/var/lib/docker/overlay2/l/TQBVPLJN6SEMDRW7VD5FBARG4F,upperdir=/var/lib/docker/overlay2/ae3eab82db4efee497c2d69a4ad18a8cfc816ce0d61296fee7b6f611d7f6ebb3/diff,workdir=/var/lib/docker/overlay2/ae3eab82db4efee497c2d69a4ad18a8cfc816ce0d61296fee7b6f611d7f6ebb3/work,xino=off 0 0 proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0 tmpfs /dev tmpfs rw,nosuid,size=65536k,mode=755 0 0 devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666 0 0 sysfs /sys sysfs ro,nosuid,nodev,noexec,relatime 0 0 tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,relatime,mode=755 0 0 cgroup /sys/fs/cgroup/systemd cgroup ro,nosuid,nodev,noexec,relatime,xattr,name=systemd 0 0 cgroup /sys/fs/cgroup/perf_event cgroup ro,nosuid,nodev,noexec,relatime,perf_event 0 0 cgroup /sys/fs/cgroup/cpuset cgroup ro,nosuid,nodev,noexec,relatime,cpuset 0 0 cgroup /sys/fs/cgroup/cpu,cpuacct cgroup ro,nosuid,nodev,noexec,relatime,cpu,cpuacct 0 0 cgroup /sys/fs/cgroup/net_cls,net_prio cgroup ro,nosuid,nodev,noexec,relatime,net_cls,net_prio 0 0 cgroup /sys/fs/cgroup/hugetlb cgroup ro,nosuid,nodev,noexec,relatime,hugetlb 0 0 cgroup /sys/fs/cgroup/memory cgroup ro,nosuid,nodev,noexec,relatime,memory 0 0 cgroup /sys/fs/cgroup/pids cgroup ro,nosuid,nodev,noexec,relatime,pids 0 0 cgroup /sys/fs/cgroup/rdma cgroup ro,nosuid,nodev,noexec,relatime,rdma 0 0 cgroup /sys/fs/cgroup/blkio cgroup ro,nosuid,nodev,noexec,relatime,blkio 0 0 cgroup /sys/fs/cgroup/devices cgroup ro,nosuid,nodev,noexec,relatime,devices 0 0 cgroup /sys/fs/cgroup/freezer cgroup ro,nosuid,nodev,noexec,relatime,freezer 0 0 mqueue /dev/mqueue mqueue rw,nosuid,nodev,noexec,relatime 0 0 shm /dev/shm tmpfs rw,nosuid,nodev,noexec,relatime,size=65536k 0 0 /dev/sda1 /etc/resolv.conf ext4 rw,relatime 0 0 /dev/sda1 /etc/hostname ext4 rw,relatime 0 0 /dev/sda1 /etc/hosts ext4 rw,relatime 0 0 devpts /dev/console devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666 0 0 proc /proc/bus proc ro,relatime 0 0 proc /proc/fs proc ro,relatime 0 0 proc /proc/irq proc ro,relatime 0 0 proc /proc/sys proc ro,relatime 0 0 proc /proc/sysrq-trigger proc ro,relatime 0 0 tmpfs /proc/acpi tmpfs ro,relatime 0 0 tmpfs /proc/kcore tmpfs rw,nosuid,size=65536k,mode=755 0 0 tmpfs /proc/keys tmpfs rw,nosuid,size=65536k,mode=755 0 0 tmpfs /proc/timer_list tmpfs rw,nosuid,size=65536k,mode=755 0 0 tmpfs /proc/sched_debug tmpfs rw,nosuid,size=65536k,mode=755 0 0 tmpfs /proc/scsi tmpfs ro,relatime 0 0 tmpfs /sys/firmware tmpfs ro,relatime 0 0ここで注目するのは overlay の情報
overlay / overlay rw,relatime,lowerdir=/var/lib/docker/overlay2/l/JVWDDYIF5YQFGNGL3PDNWJ4A4M:/var/lib/docker/overlay2/l/TQBVPLJN6SEMDRW7VD5FBARG4F,upperdir=/var/lib/docker/overlay2/ae3eab82db4efee497c2d69a4ad18a8cfc816ce0d61296fee7b6f611d7f6ebb3/diff,workdir=/var/lib/docker/overlay2/ae3eab82db4efee497c2d69a4ad18a8cfc816ce0d61296fee7b6f611d7f6ebb3/work,xino=off 0 0ここでマウントした
/var/lib/docker/overlay2/l/TQBVPLJN6SEMDRW7VD5FBARG4F
は実は alpine イメージの内容です$ cat $(docker image inspect alpine -f '{{ .GraphDriver.Data.UpperDir }}')/../link TQBVPLJN6SEMDRW7VD5FBARG4Fネットワーク
最後にネットワークの設定も確認しましよう。Container プロセスは独自の network namespace に区別しているから、host mahcineと通信のためには、vethを利用します。
まずは、Container側のネットワーク設定
$ nsenter -t $CPID -n ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 17 bytes 1366 (1.3 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 $ nsenter -t $CPID -n ip link show type veth 280: eth0@if281: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 $ nsenter -t $CPID -n ip route show dev eth0 default via 172.17.0.1 172.17.0.0/16 proto kernel scope link src 172.17.0.2host machine 側
$ ifconfig docker0 docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:ffff:fe14:4bd6 prefixlen 64 scopeid 0x20<link> ether 02:42:ff:14:4b:d6 txqueuelen 0 (Ethernet) RX packets 8 bytes 433 (433.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 283 bytes 30567 (30.5 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 $ ip addr show type veth 281: veth18981d6@if280: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether fa:eb:12:ad:57:d1 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::f8eb:12ff:fead:57d1/64 scope link valid_lft forever preferred_lft forever $ ip route show dev docker0 172.17.0.0/16 proto kernel scope link src 172.17.0.1Container のアドレスは
172.17.0.2
で、hostの方は172.17.0.1
、veth18981d6
という veth で2つの interface を繋がている。そしてそれぞれの route table に転送経路のルールが載せている。
bpftrace
でDocker実行順番を明白するさて、いろいろの結果を確認してきたから、具体的に Docker はどうやってその結果のたどり着いたか、例えばいつにどんな関数をどんな変数で呼びましたか。ここではbpftraceが活躍するところです。
bpftrace っていうのは Linux Kenel の eBPF 機能を awk みたい記述で簡単に利用できるツールです。具体的な使用方法はここでは省きますが、Docに参照してください。
bpftrace
のセットアップ# bcc $ apt-get install -y linux-headers-$(uname -r) bison build-essential cmake flex g++ git libelf-dev zlib1g-dev libfl-dev systemtap-sdt-dev binutils-dev llvm-8-dev llvm-8-runtime libclang-8-dev clang-8 arping netperf iperf3 python3-distutils $ git clone --recurse-submodules https://github.com/iovisor/bcc.git $ mkdir bcc/build; cd bcc/build $ cmake -DPYTHON_CMD=python3 .. $ make -j8 && make install && ldconfig $ cd ../.. # bpftrace $ git clone https://github.com/iovisor/bpftrace.git $ mkdir bpftrace/build; cd bpftrace/build $ cmake -DHAVE_BCC_PROG_LOAD=ON -DHAVE_BCC_CREATE_MAP=ON -DBUILD_TESTING=OFF .. $ make -j8 && make installDockerをトレース
bpftraceで docker と OS のやり取りがトレースすることができる。まずはこちらの内容で
docker.bt
のファイル作成するdocker.bt#!/usr/bin/env bpftrace #include <linux/nsproxy.h> #include <linux/ns_common.h> #include <linux/utsname.h> #include <linux/pid_namespace.h> #include <linux/ipc_namespace.h> #include <linux/cgroup.h> #include <net/net_namespace.h> #include <linux/netdevice.h> BEGIN { printf("%-12s %-15s %-8s %-10s %s\n", "TIME", "COMMAND", "PID", "ACTION", "CONTENT"); } tracepoint:syscalls:sys_enter_execve { printf("%-12ld %-15s %-8d %-10s ", elapsed , comm, pid, "execve"); join(args->argv); } tracepoint:syscalls:sys_enter_mount { printf("%-12ld %-15s %-8d %-10s ", elapsed, comm, pid, "mount"); printf("type=%s, dev=%s, dir=%s\n", str(args->type), str(args->dev_name), str(args->dir_name)) } kretprobe:create_new_namespaces /comm=="runc:[1:CHILD]"/ { printf("%-12ld %-15s %-8d %-10s ", elapsed, comm, pid, "namespace"); $nsp = (struct nsproxy *)retval; printf("uts=%ld, ipc=%ld, cgroup=%ld, net=%ld, pid=%ld\n", ((struct uts_namespace *)$nsp->uts_ns)->ns.inum, ((struct ipc_namespace *)$nsp->ipc_ns)->ns.inum, ((struct cgroup_namespace *)$nsp->cgroup_ns)->ns.inum, ((struct net *)$nsp->net_ns)->ns.inum, ((struct pid_namespace *)$nsp->pid_ns_for_children)->ns.inum); } kprobe:veth_newlink { printf("%-12ld %-15s %-8d %-10s ", elapsed, comm, pid, "veth"); printf("name=%s, netns=%ld\n", ((struct net_device *)arg1)->name, ((struct net *)arg0)->ns.inum); }そして実行する
$ ./docker.bt Attaching 5 probes... TIME COMMAND PID ACTION CONTENT
もう一度 Container の起動する(別のターミナル)
$ docker run -ti --rm --name test alpine echo hi
docker.bt
に戻せば、こちらの内容出力されますTIME COMMAND PID ACTION CONTENT 1827725094 bash 235026 execve docker run -ti --rm --name test alpine echo hi 1874368200 dockerd 81563 mount type=overlay, dev=overlay, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 1892118900 dockerd 81563 mount type=overlay, dev=overlay, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 1904728454 dockerd 81563 mount type=overlay, dev=overlay, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 1905395722 dockerd 81563 veth name=veth3d71f6e, netns=4026531992 1912608987 networkd-dispat 235038 execve /usr/bin/networkctl list --no-pager --no-legend 1913900866 (spawn) 235036 execve /lib/udev/bridge-network-interface 1917882282 (spawn) 235039 execve /lib/open-iscsi/net-interface-handler start 1922126799 (spawn) 235040 execve /lib/udev/bridge-network-interface 1923736757 (spawn) 235041 execve /lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/veth3d71f6e --prefix=/net/ipv4/neigh/veth3d71f6e --prefix=/net/ipv6/conf/veth3d71f6e --prefix=/net/ipv6/neigh/veth3d71f6e 1925374081 (spawn) 235042 execve /lib/open-iscsi/net-interface-handler start 1935733149 containerd 235044 execve containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/6975e3344ad32b92a6a09066f31132f9b4e3d5c65e1b827ed91486f1128c17eb -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc 1940074927 containerd-shim 235053 execve runc --root /var/run/docker/runtime-runc/moby --log /run/containerd/io.containerd.runtime.v1.linux/moby/6975e3344ad32b92a6a09066f31132f9b4e3d5c65e1b827ed91486f1128c17eb/log.json --log-format json create --bundle /run/containerd/io.containerd.runtime.v1.linux/moby/6975e3344ad32b92a6a09066f31132f9b4e3d5c65e1b827ed91486f1128c17eb --pid-file /run/containerd/io.containerd.runtime.v1.linux/moby/6975e3344ad32b92a6a09066f31132f9b4e3d5c65e1b827ed91486f1128c17eb/init.pid --console-socket /tmp/pty046813817/pty.sock 6975e3344ad32b92a6a09066f31132f9b4e3d5c65e1b827ed91486f1128c17eb 1940243736 (spawn) 235043 execve /lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/vethc30992d --prefix=/net/ipv4/neigh/vethc30992d --prefix=/net/ipv6/conf/vethc30992d --prefix=/net/ipv6/neigh/vethc30992d 1955997514 runc 235060 execve runc init 1959669403 exe 235060 mount type=, dev=/proc/self/exe, dir=/var/run/docker/runtime-runc/moby/6975e3344ad32b92a6a09066f3113 1962524451 exe 235060 mount type=, dev=, dir=/var/run/docker/runtime-runc/moby/6975e3344ad32b92a6a09066f3113 1977110103 runc:[1:CHILD] 235061 namespace uts=4026532187, ipc=4026532188, cgroup=4026531835, net=4026532191, pid=4026532189 2002233022 runc:[2:INIT] 235062 mount type=, dev=, dir=/ 2002647666 runc:[2:INIT] 235062 mount type=bind, dev=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2002787106 runc:[2:INIT] 235062 mount type=proc, dev=proc, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2002848509 runc:[2:INIT] 235062 mount type=tmpfs, dev=tmpfs, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2003072500 runc:[2:INIT] 235062 mount type=devpts, dev=devpts, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2006987497 runc:[2:INIT] 235062 mount type=sysfs, dev=sysfs, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2007808775 runc:[2:INIT] 235062 mount type=tmpfs, dev=tmpfs, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008001937 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/systemd/docker/6975e3344ad32b92a6a09066f31132f9b, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008021032 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/systemd/docker/6975e3344ad32b92a6a09066f31132f9b, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008102923 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/perf_event/docker/6975e3344ad32b92a6a09066f31132, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008116742 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/perf_event/docker/6975e3344ad32b92a6a09066f31132, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008189722 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/cpuset/docker/6975e3344ad32b92a6a09066f31132f9b4, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008203301 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/cpuset/docker/6975e3344ad32b92a6a09066f31132f9b4, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008284557 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/cpu,cpuacct/docker/6975e3344ad32b92a6a09066f3113, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008300251 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/cpu,cpuacct/docker/6975e3344ad32b92a6a09066f3113, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008365239 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/net_cls,net_prio/docker/6975e3344ad32b92a6a09066, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008397968 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/net_cls,net_prio/docker/6975e3344ad32b92a6a09066, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008471763 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/hugetlb/docker/6975e3344ad32b92a6a09066f31132f9b, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008489627 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/hugetlb/docker/6975e3344ad32b92a6a09066f31132f9b, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008575004 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/memory/docker/6975e3344ad32b92a6a09066f31132f9b4, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008588697 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/memory/docker/6975e3344ad32b92a6a09066f31132f9b4, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008655100 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/pids/docker/6975e3344ad32b92a6a09066f31132f9b4e3, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008667811 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/pids/docker/6975e3344ad32b92a6a09066f31132f9b4e3, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008731445 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/rdma, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008744138 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/rdma, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008792554 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/blkio/docker/6975e3344ad32b92a6a09066f31132f9b4e, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008805034 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/blkio/docker/6975e3344ad32b92a6a09066f31132f9b4e, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008855551 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/devices/docker/6975e3344ad32b92a6a09066f31132f9b, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008868073 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/devices/docker/6975e3344ad32b92a6a09066f31132f9b, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008919459 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/freezer/docker/6975e3344ad32b92a6a09066f31132f9b, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008932321 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup/freezer/docker/6975e3344ad32b92a6a09066f31132f9b, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008958905 runc:[2:INIT] 235062 mount type=bind, dev=/sys/fs/cgroup, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2008977832 runc:[2:INIT] 235062 mount type=mqueue, dev=mqueue, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2009006418 runc:[2:INIT] 235062 mount type=tmpfs, dev=shm, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2009102662 runc:[2:INIT] 235062 mount type=bind, dev=/var/lib/docker/containers/6975e3344ad32b92a6a09066f31132f9b4e3, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2009116671 runc:[2:INIT] 235062 mount type=, dev=, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2009152544 runc:[2:INIT] 235062 mount type=bind, dev=/var/lib/docker/containers/6975e3344ad32b92a6a09066f31132f9b4e3, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2009184117 runc:[2:INIT] 235062 mount type=, dev=, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2009256053 runc:[2:INIT] 235062 mount type=bind, dev=/var/lib/docker/containers/6975e3344ad32b92a6a09066f31132f9b4e3, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2009268672 runc:[2:INIT] 235062 mount type=, dev=, dir=/var/lib/docker/overlay2/ec1fbee3aa02f9596794e45afddaddf75028e0 2012566089 runc 235085 execve libnetwork-setkey -exec-root=/var/run/docker 6975e3344ad32b92a6a09066f31132f9b4e3d5c65e1b827ed91486f1128c17eb ee4af79b8952 2055580696 dockerd 81563 mount type=bind, dev=/proc/235062/ns/net, dir=/var/run/docker/netns/53666134ee2d 2058245033 dockerd 235093 execve set-ipv6 /var/run/docker/netns/53666134ee2d all false 2117481953 (spawn) 235100 execve /lib/open-iscsi/net-interface-handler stop 2135647000 runc:[2:INIT] 235062 mount type=, dev=, dir=. 2135881831 runc:[2:INIT] 235062 mount type=bind, dev=/dev/pts/0, dir=/dev/console 2135959898 runc:[2:INIT] 235062 mount type=, dev=/proc/bus, dir=/proc/bus 2135974823 runc:[2:INIT] 235062 mount type=, dev=/proc/bus, dir=/proc/bus 2135984627 runc:[2:INIT] 235062 mount type=, dev=/proc/fs, dir=/proc/fs 2135995698 runc:[2:INIT] 235062 mount type=, dev=/proc/fs, dir=/proc/fs 2136004311 runc:[2:INIT] 235062 mount type=, dev=/proc/irq, dir=/proc/irq 2136017445 runc:[2:INIT] 235062 mount type=, dev=/proc/irq, dir=/proc/irq 2136025919 runc:[2:INIT] 235062 mount type=, dev=/proc/sys, dir=/proc/sys 2136036802 runc:[2:INIT] 235062 mount type=, dev=/proc/sys, dir=/proc/sys 2136045583 runc:[2:INIT] 235062 mount type=, dev=/proc/sysrq-trigger, dir=/proc/sysrq-trigger 2136057589 runc:[2:INIT] 235062 mount type=, dev=/proc/sysrq-trigger, dir=/proc/sysrq-trigger 2136066994 runc:[2:INIT] 235062 mount type=, dev=/dev/null, dir=/proc/asound 2136076692 runc:[2:INIT] 235062 mount type=, dev=/dev/null, dir=/proc/acpi 2136145362 runc:[2:INIT] 235062 mount type=tmpfs, dev=tmpfs, dir=/proc/acpi 2136198403 runc:[2:INIT] 235062 mount type=, dev=/dev/null, dir=/proc/kcore 2136211095 runc:[2:INIT] 235062 mount type=, dev=/dev/null, dir=/proc/keys 2136271650 runc:[2:INIT] 235062 mount type=, dev=/dev/null, dir=/proc/latency_stats 2136281142 runc:[2:INIT] 235062 mount type=, dev=/dev/null, dir=/proc/timer_list 2136292991 runc:[2:INIT] 235062 mount type=, dev=/dev/null, dir=/proc/timer_stats 2136302265 runc:[2:INIT] 235062 mount type=, dev=/dev/null, dir=/proc/sched_debug 2136312542 runc:[2:INIT] 235062 mount type=, dev=/dev/null, dir=/proc/scsi 2136411156 runc:[2:INIT] 235062 mount type=tmpfs, dev=tmpfs, dir=/proc/scsi 2136458345 runc:[2:INIT] 235062 mount type=, dev=/dev/null, dir=/sys/firmware 2136537743 runc:[2:INIT] 235062 mount type=tmpfs, dev=tmpfs, dir=/sys/firmware 2325058622 containerd-shim 235102 execve runc --root /var/run/docker/runtime-runc/moby --log /run/containerd/io.containerd.runtime.v1.linux/moby/6975e3344ad32b92a6a09066f31132f9b4e3d5c65e1b827ed91486f1128c17eb/log.json --log-format json start 6975e3344ad32b92a6a09066f31132f9b4e3d5c65e1b827ed91486f1128c17eb 2334946680 runc:[2:INIT] 235062 execve echo hi 2357752100 containerd-shim 235108 execve /usr/bin/containerd --address /run/containerd/containerd.sock publish --topic /tasks/exit --namespace moby 2389193617 containerd-shim 235116 execve runc --root /var/run/docker/runtime-runc/moby --log /run/containerd/io.containerd.runtime.v1.linux/moby/6975e3344ad32b92a6a09066f31132f9b4e3d5c65e1b827ed91486f1128c17eb/log.json --log-format json delete 6975e3344ad32b92a6a09066f31132f9b4e3d5c65e1b827ed91486f1128c17eb 2438983541 (spawn) 235129 execve /lib/udev/bridge-network-interface 2441125682 networkd-dispat 235130 execve /usr/bin/networkctl list --no-pager --no-legend 2441917196 (spawn) 235131 execve /lib/open-iscsi/net-interface-handler start 2445708579 (spawn) 235132 execve /lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/vethc30992d --prefix=/net/ipv4/neigh/vethc30992d --prefix=/net/ipv6/conf/vethc30992d --prefix=/net/ipv6/neigh/vethc30992d 2460630127 networkd-dispat 235133 execve /usr/bin/networkctl list --no-pager --no-legend 2469750858 (spawn) 235134 execve /lib/open-iscsi/net-interface-handler stop 2470070134 (spawn) 235135 execve /lib/open-iscsi/net-interface-handler stopこれは Docker がこの Container を実行するためにやったことは一目瞭然です。簡単にまとめると、順番的にはこちらです
- イメージの overlay をマウントする
- veth などのネットワーク設定
containerd-shim
を実行runc init
- namespaces 作り
- cgroup などにいろんなマウント
runc start
- ユーザーコマンド
echo hi
runc delete
- ネットワークの cleanup
参考資料
- 投稿日:2020-07-13T02:01:36+09:00
(Linux初心者)魔法の言葉auxとは
とりあえず使ってたけど、auxコマンドの意味とは
例題: ps aux | grep puma
以下、分解して見ていく。
まず、grepは特定の文字列を含むコマンドを検索したいときに使用する。
コマンド | grep 検索したい文字列コマンドを詳しく見てみる。
ps ・・・ 自分のプロセスを簡単に表示 aux・・・ a、u、xオプションの組み合わせ aオプション・・・ すべてのユーザーのプロセスを表示する uオプション・・・ 各プロセスの実行ユーザーやCPU, メモリ等の情報も表示する xオプション・・・ 端末を持たないすべてのプロセス(daemonなど)を表示するdaemon(デーモン)・・・バックグラウンドで動作するプロセス。コンピュータを使ってる人に見えない裏側で動作するもの。
要するにauxにすることですべての種類のプロセスの知り得るだけの情報がすべて網羅される。
解答 ps aux | grep pumaとは
【意味】pumaを含むコマンドの知りうる情報を全て表示するつまり、迷ったらauxは間違いではなかった。
- 投稿日:2020-07-13T00:03:27+09:00
Linux Network Namespace
はじめに
知識のアウトプット用として書いておこうと思いました。
Dockerといったコンテナ型仮想化技術を構成する要素の1つがNetwork Namespace
コマンドライン操作を必要とするだけで、ネットワーク的にシステムから独立した仮想的なコンピュータを作成できる。Ubuntu 18.04 LTS を起動させる。
ターミナルにて次のコマンドを入力する。
これは後続の作業に必要なパッケージをインストールするためのコマンド。
これにより必要なパッケージをインストールできる。ターミナル$ sudo apt-get update $ sudo apt-get -y installTCP/IPとは
TCP(Transmission Control Protocol)
IP(Internet Protocol)日常的に利用しているプロトコルの名称。
- 「運送会社がお客さんの荷物を目的地まで届ける」
- 「運送会社 => お客さんの手元まで届く流れ」
コンピュータの世界にも現実世界と同じように
荷物(データ)を届けるまでにちゃんと届くようにする仕組みがあるIPアドレスとは
インターネットプロトコルというプロトコルで
通信するのに必要な識別子の一種、インターネット上の住所のようなものネットワークインターフェースとは
LANケーブルをネットワークインターフェースカード(NIC)や無線LANアダプタを
表している。ただ、それらをソフトウェアから扱う上で抽象化した概念のことIPv4 / IPV6とは
IPv4 / 6 (Internet Protocol version 4 / 6 )
今いる世界.現在には2つのインターネットが全く別々に存在している
プロトコルにIPv4 / IPv6をそれぞれ使用しているため両者には互換性がない
- IPv4であればIPv4アドレス
- IPv6であればIPv6アドレスを使用するのが必要
IPv4は32bit(4bite)に対しIPv6は128bit(16byte)
普及に伴い新たに使えるものが少なくなってきているためIPv6へ移行が試みられている(補足)
IPアドレスを持ちネットワークにつながっている
ルータではないコンピュータのことをホスト(HOST)
というホストやルータといった区別をしないネットワークに繋がった
コンピュータの名称をノード(Node)
という
操作
$ ip address show
ターミナル$ ip address show 1: lo:<LOOPBACK,UP,LOWER_UP> mtu XXXXX qdisc noqueue state UNKNOWN group default qlen XXXX link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 000.X.X.X/X scope host lo valid_lft forever preferred_lft forever inet6 ::X/XXX scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu XXXX qdisc fq_codel state UP group default qlen XXXX link/ether XX:XX:Xx:XX:XX:XX brd ff:ff:ff:ff:ff:ff inet 00.X.X.XX/XX brd XX.X.X.XXX scope global dynamic eth0 valid_lft XXXXXsec preferred_lft XXXXXsec inet6 xxXX::XXX:Xxxx:xxXX:XXXX/XX scope link valid_lft forever preferred_lft forever
inet
の表示の後の部分がコンピュータのIPアドレス
lo
やeth0
はネットワークインターフェース
eth0
は差出人に相当するIPアドレスIPアドレスは必要に応じてネットワークインターフェースに付与される、つまり
- ネットワークインターフェース
lo
には000.X.X.X
というIPアドレス- ネットワークインターフェース
eth0
には00.X.X.XX
というIPアドレスが付与されている。ループバックアドレス
lo
の000.X.X.X
というIPアドレスはループバックアドレス
という特殊なアドレスで
自分自身のアドレスを表している
動作確認など自分自身だけに関わる通信をしたいときに使うと便利試しに
($ ping -c 3 <自分のループバックアドレス>)
コマンドを打つと同じように結果が帰ってくるのがわかる
$ sudo tcpdump
ターミナル$ sudo tcpdump -tn -I any icmp Tcpdump: verbose output suppressed, use -v or -vv for full protocol decode Listening on any, link-type LINUX_SLL (Linix cooked), capture size XXXXXX bytes IP XX.X.X.XX > 8.8.8.8 : ICMP echo request, id XXXX, seq 1, lenght 64 IP 8.8.8.8 > XX.X.X.XX : ICMP echo reply, id XXXX, seq 1, lenght 64 IP XX.X.X.XX > 8.8.8.8 : ICMP echo request, id XXXX, seq 2, lenght 64 IP 8.8.8.8 > XX.X.X.XX : ICMP echo reply, id XXXX, seq 2, lenght 64 IP XX.X.X.XX > 8.8.8.8 : ICMP echo request, id XXXX, seq 3, lenght 64 IP 8.8.8.8 > XX.X.X.XX : ICMP echo reply, id XXXX, seq 3, lenght 64コンピュータを流れる通信を覗き見できるコマンド
パケットキャプチャ、スニッフィングともいう
$ ping
を打った後$sudo tcpdump
側のターミナルを見てみると
3回のやり取りrequest replyがあったのを確認できる
$ traceroute
ターミナル$ traceroute -n 8.8.8.8 Trace route to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets 1 XX.X.X.X 0.568ms 0.562ms 1.044ms 2 XXX.XX.X.X 4.495ms 4.499ms 4.703ms 3 XX.X.X.XX 11.304ms 11.319ms 11.305ms 4 XX.X.X.XX 12.111ms 11.811ms 12.097ms ……パケットがどのような順路を通って目的地まで届くのかを確認するコマンド
通る順路とは通過するRoute
のこと
このコマンドはネットワークのトラブルシューティングによく使用されるRoute
ネットワーク機器
それぞれの行に表示されているIPアドレスはパケットが通過した
ルータの持っているIPアドレスインターネットにはたくさんのルータがありパケットを
バケツリレーして成り立っていることがわかる
ルーティングテーブルとは
TCP/IP の世界では次にパケットを渡すべき相手を
ルーティングテーブル
という概念で管理している
ルーティングテーブルはコマンドで確認ができる$ ip route show
ターミナル$ ip route show Default via XX.X.X.X dev eth0 proto dhcp src XX.X.X.XX metric XXX XX.X.X.X/XX dev eth0 proto kernel scope link src XX.X.X.XX XX.X.X.X dev eth0 proto dhcp scope link src XX.X.X.XX metric XXXまずルーティングテーブルは複数の
ルーティングエントリ
から構成されている
それぞれの行がルーティングエントリ
それぞれのルーティングエントリの先頭には宛先となるIPアドレスが書かれている
宛先default
は特殊な宛先であり、他のどのが宛先にも該当しない時に使用される3行目のXX.X.X.X/XXは複数のIPアドレスをまとめた表現方法
このようにルーティングテーブルは 宛先となるIPアドレスを
必ずしも1つずつ書くわけではない
$ ping
ターミナル$ ping -c 3 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56 (84) bytesofdata. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=9.06 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=8.88 ms 64 bytes from 8.8.8.8: icmp_seq=3 ttl=63 time=10.3 ms 8.8.8.8 pingstatistics 3 packets transmitted, 3 received, 0% packet loss, time 2004ms rtt min/avg/max/mdev = 8.883/9.445/10.386/0.678msTPC/IPのネットワークで疎通を確認するのに使用される。
-c 3
というオプションをつけたことによって応答を要求するメッセージを3回送っている。よって3回の返答が戻ってくる。”3 packets transmitted, 3 received, 0%”
こちらの出した要求に対して応答が無事に届いているのが確認できる。本題のNetwork Namespace
改めてNetwork NamespaceはDockerなどのコンテナ型仮想化技術を構成する要素の一つ
ターミナル$ sudo ip netns add helloworld $ ip netns list hello world$ ip netns add
新たにNamespaceを作成できる
$ ip netns list
lsのように確認ができる
$ sudo ip netns exec [Namaspace名]
このコマンドで実行できる
ターミナル$ sudo ip netns add ns1 $ sudo ip netns add ns2作り方が分かったので2つ作成
これでns1
とns2
のネットワークが作成できたが、お互いにまだ独立している状態
両者を繋ぐには "veth" (Virtual Ethernet Device)という仮想的な
ネットワークインターフェースを使用する、vethを作るには$ip link add
サブコマンドを使用する
ターミナル$ sudo ip link add ns1-veth0 type peer name ns2-veth0$ip link add
ネットワークインターフェース作成コマンド
これによってvethのネットワークインターフェースが作成された
ns1-veth0とns2-veth0は作成するネットワークインターフェースの名前ターミナル$ ip link show | grep veth 3 : ns2-veth0@ns1-veth0 : <BROADCAST, MULTICAST, M-DOWN> mtu XXXX qdisc noop state DOWN mode DEFAULT group default qlen XXXX 4 : ns1-veth0@ns2-veth0 : <BROADCAST, MULTICAST, M-DOWN> mtu XXXX qdisc noop state DOWN mode DEFAULT group default qlen XXXXgrepコマンドによってvethという文字列が含まれるものだけを絞り確認する
現実世界で言えばLANケーブルで繋がった2枚のネットワークインターフェースが作成されている
ただ、まだこれは作成しただけでシステムの領域に所属しているため
Network Namespaceで使用できるようにする
ターミナル$ sudo ip link set ns1-veth0 netns ns1 $ sudo ip link set ns2-veth0 netns ns2設定したいネットワークインファーフェースの名前の後ろに netns とNamespace名を指定する
このような感じになっている
ただ、まだこの段階ではPC同士をケーブルで繋いでいるのとほぼ同じなので
現実のPCのように設定をしなければ通信ができないIPを使用して通信する場合はIPアドレスが必要になる
よってvethインターフェースにIPアドレスを付与しなければならない
ターミナル$ sudo ip netns exec ns1 ip address add XXX.X.X.1/XX dev ns1-veth0 $ sudo ip netns exec ns2 ip address add XXX.X.X.2/XX dev ns1-veth0$ ip address add
IPアドレスを設置するには
$ ip address add
ns1-veth0にはXXX.X.X.1というIPアドレス
ns2-veth0にはXXX.X.X2というIPアドレスが付与される
さらに、UPとDOWNという2つの概念があり
初期の状態はDOWNなので使用するときはUPに設定する
ターミナル$ sudo ip netns exec ns1 ip link set ns1-veth0 up $ sudo ip netns exec ns2 ip link set ns2-veth0 up繋がったか確認
ターミナル$ sudo ip netns exec ns1 ping -c 3 XXX.X.X.2このようになっている
終わりに
同じネットワーク内ですが、ひとまずvethインターフェースで繋げる関連の理解をしました。
まだまだ複雑化していくので段階に分けてQiita書いていきます。