ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

Linuxのコンソールのディスプレイをオフする

kernelのコマンドラインにconsoleblank=[N] (Nはオフまでの秒数)を追加する。

DebianやUbuntuでは、/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULTに以下のようにconsoleblankオプションを追加する。

GRUB_CMDLINE_LINUX_DEFAULT="quiet consoleblank=60"
その後、grub.confを更新して再起動する。
update-grub2
reboot

Linuxカーネルの主要なCONFIG

Linuxの主要なCONFIGを以下のテーブルに記載します。とくにmake defconfigで有効化されないものを中心に記載します。 また、この記事の内容はLinux 6.2.7をベースに作成されています。
CONFIG 説明
BRIDGE ブリッジ機能
SQUASHFS squashfsサポート
SQUASHFS_XATTR squashfsでのxattrのサポート
OVERLAY_FS オーバイレイFSのサポート。Dockerなどで使用されている。
FUSE_FS FUSE FSのサポート

CONFIGの追加例

CONFIG_BRIDGEを有効にする例を示します。Linuxのソースディレクトリで次のコマンドを実行すると、最初は以下のように無効化されています。
$ cat .config | grep CONFIG_BRIDGE
# CONFIG_BRIDGE is not set
有効化するには以下を実行します。
scripts/config --enable BRIDGE
再度.configを確認すると有効化されています。
$ cat .config | grep CONFIG_BRIDGE
CONFIG_BRIDGE=y
また、この変更に伴って新たに設定可能になったCONFIGを以下で確認できます。
$ make listnewconfig
CONFIG_BRIDGE_NF_EBTABLES=n
CONFIG_BRIDGE_IGMP_SNOOPING=y
CONFIG_BRIDGE_MRP=n
CONFIG_BRIDGE_CFM=n
これらについて個別に設定しても良いですし、以下のようにするとデフォルトに設定できます。
make olddefconfig

参考記事

Linuxでのプロセスの標準入出力

単独で動作するプロセスの標準入出力

Linuxでは、すべてのものはファイルとして扱われます。例えば、キーボード入力や画面出力もファイルとして扱われます。 具体的に見ていきましょう。まず以下のように入力してみます。この出力にはいろいろな知見が含まれます。順に説明します。

# ls -l /proc/self/fd
total 0
lrwx------ 1 root root 64 Mar 19 19:26 0 -> /dev/pts/1
lrwx------ 1 root root 64 Mar 19 19:26 1 -> /dev/pts/1
lrwx------ 1 root root 64 Mar 19 19:26 2 -> /dev/pts/1
lr-x------ 1 root root 64 Mar 19 19:26 3 -> /proc/147982/fd

/proc/self/fd

Linuxカーネルが提供する仮想ファイルシステム上のディレクトリです。 オープンしているファイルへのシンボリックリンクが格納されています。シンボリックリンクのファイル名はファイルデスクリプタ番号です。 詳しくは、以下の記事を参照ください。

ファイルデスクリプタ0, 1, 2

多くのケースで、プロセスはファイルデスクリプタ番号0, 1, 2の3つのファイルがオープンされた状態で起動されます。 この3つは、次のように用途が決まっています。
  • 0: 標準入力。プロセスが情報を入力するのに使用されます
  • 1: 標準出力。プロセスが通常出力を行うのに使用されます
  • 2: 標準エラー出力。プロセスがエラー出力を行うのに使用されます

/dev/pts/[数値]

上記のlsでは、ファイルデスクリプタ0,1,2に対して、どれも/dev/pts/1がオープンされています。 この/dev/pts/[数値]は、xtermなどの端末に相当するファイルです。 キーボードからの入力はそのファイル/dev/pts/[数値]に追記されているようにプロセスからは見えます。 プロセスが、ファイル/dev/pts/[数値]に書き込んだ内容は、対応する端末に文字列として表示されます。 この様子を図示すると次のようになります。

出力をファイルにリダイレクトする場合

標準出力をファイルに設定

次のようにコマンドの出力をファイルに保存することはよくあります。
ls -l /proc/self/fd > output.txt
作成されたファイルoutput.txtの内容(すなわち、lsがオープンしているファイル)は次のとおりです。
total 0
lrwx------ 1 root root 64 Mar 21 08:20 0 -> /dev/pts/1
l-wx------ 1 root root 64 Mar 21 08:20 1 -> /root/output.txt
lrwx------ 1 root root 64 Mar 21 08:20 2 -> /dev/pts/1
lr-x------ 1 root root 64 Mar 21 08:20 3 -> /proc/160788/fd
つまり、コマンドライン上で>を使ってファイルへ保存するとき、lsコマンドの標準出力はリダイレクトされたファイルに なっていることが分かります。以下のその様子を図示します。

標準エラー出力もファイルに設定

上記のように2>とその右側にファイル名を記載すると、そのファイルが標準エラー出力になります。
ls -l /proc/self/fd > output.txt 2> error.txt
output.txtの内容を確認すると以下のようになっています。
total 0
lrwx------ 1 root root 64 Mar 21 01:00 0 -> /dev/pts/5
l-wx------ 1 root root 64 Mar 21 01:00 1 -> /root/output.txt
l-wx------ 1 root root 64 Mar 21 01:00 2 -> /root/error.txt
lr-x------ 1 root root 64 Mar 21 01:00 3 -> /proc/75664/fd
以下にこの状態を図示します。

標準出力と標準エラー出力を同じファイルに設定

標準出力と標準エラー出力を同じファイルに保存する場合、以下のように2&>1を使います。 これはファイルデスクリプタ1(標準出力)をファイルディスクリプタ2(標準エラー出力)にコピーするという指示です。 そのため、> output.txtの後に記載する必要があります。
ls -l /proc/self/fd > output.txt 2&>1
output.txtの内容は次のとおりです。
total 0
lrwx------ 1 root root 64 Mar 21 02:33 0 -> /dev/pts/1
l-wx------ 1 root root 64 Mar 21 02:33 1 -> /root/output.txt
l-wx------ 1 root root 64 Mar 21 02:33 2 -> /root/output.txt
lr-x------ 1 root root 64 Mar 21 02:33 3 -> /proc/75694/fd
この状態を図示すると以下のようになります。

入力のリダイレクト

lessでファイル読む場合

以下のようにlessで引数にファイルを指定した場合、ファイルデスクリプタはどうなっているでしょうか?
less a.txt
この場合、4番に引数で指定したa.txtが割り当てられています。標準入力は端末のままです。 lessは、標準入出力とは別に引数で与えられたファイルをオープンしたということになります。 なお、このlessのPIDの調べ方は、次節の「パイプでプロセス間の入出力を連結する場合」で説明します。
total 0
lrwx------ 1 root root 64 Mar 21 03:11 0 -> /dev/pts/1
lrwx------ 1 root root 64 Mar 21 03:11 1 -> /dev/pts/1
lrwx------ 1 root root 64 Mar 21 03:11 2 -> /dev/pts/1
lr-x------ 1 root root 64 Mar 21 03:11 3 -> /dev/tty
lr-x------ 1 root root 64 Mar 21 03:11 4 -> /root/a.txt
この状態を図示すると以下のようになります。

標準入力にファイルを設定

一方、次のようなコマンドラインではどうなるでしょうか?
less < a.txt
答えは次のとおり、標準入力は<の右側に指定したファイルになっています。 この違いについては、この記事の最後の「標準入出力は誰が設定するのか?」で詳しく説明します。
total 0
lr-x------ 1 root root 64 Mar 21 04:29 0 -> /root/a.txt
lrwx------ 1 root root 64 Mar 21 04:29 1 -> /dev/pts/6
lrwx------ 1 root root 64 Mar 21 04:29 2 -> /dev/pts/6
lr-x------ 1 root root 64 Mar 21 04:29 3 -> /dev/tty
また、これまで同じく図も示します。

パイプでプロセス間の入出力を連結する場合

Linuxでは以下のようにパイプを使うケースも多いと思います。
cat a.txt | grep abc

この場合の標準入出力を見てみます。 ただし、上記のコマンドは一瞬で終了するため、実行中の/proc/[PID]/fdを調べることができません。 そのため、少しコマンドを工夫しますが、その前にcatやgrepを実行するbashのPID(プロセスID)を調べておきます。

変数$$には、実行中のbashのPIDが格納されています。以下のとおり、操作しているbashの74570であり、そのbashから実行されたコマンドの親PIDは、74570になります。

$ echo $$
74570
次いで以下のコマンドを実行します。catに引数がありません。 この場合、catは標準入力すなわちキーボードから入力を待っている状態になり、ファイルを読み込んだ時のように瞬時には終了しなくなります。
cat | grep abc
ここでcatとgrepのPID(プロセスID)を調べます。同じPCの別の端末で、先ほど調べたbashのPIDを親にもつプロセスを探します。
$ ps --ppid 74570
TIME CMD
  75104 pts/6    00:00:00 cat
  75110 pts/6    00:00:00 grep
catとgrepのPIDはそれぞれ75104と75110であることが分かりました。 それぞれについて、/proc/[PID]/fd以下のファイルを見ます。
$ ls -l /proc/75104/fd
total 0
lrwx------ 1 root root 64 Mar 20 09:01 0 -> /dev/pts/1
l-wx------ 1 root root 64 Mar 20 09:01 1 -> 'pipe:[936222]'
lrwx------ 1 root root 64 Mar 20 09:01 2 -> /dev/pts/1
$ ls -l /proc/75110/fd
total 0
lr-x------ 1 root root 64 Mar 20 09:01 0 -> 'pipe:[936222]'
lrwx------ 1 root root 64 Mar 20 09:01 1 -> /dev/pts/1
lrwx------ 1 root root 64 Mar 20 09:01 2 -> /dev/pts/1
上記の結果から、catの標準出力がpipe:[936222]というのになっており、grepの標準入力も同じくpipe:[936222]になっています。 これは、下図のようにcatがパイプというファイルに出力を書き込み、grepは同じパイプというファイルからデータを読み出していることを意味します。 また、catの標準入力や標準エラー出力、grepの標準出力と標準エラー出力は、端末である/dev/pts/1となっています。つまり、catは端末を通じてキーボードからデータを入力し、grepが標準出力に書き込んだデータは、端末に表示されることが分かります。

標準入出力は誰が設定するのか?

このように、リダイレクトやパイプを使うことで起動されるプロセスの標準入出力が変化します。 標準入出力は、誰がいつ設定しているのでしょうか?答えは、起動されるプロセスの親プロセスです。 端末でコマンドを起動しているなら、bashなどのシェルが親プロセスです。 bashが、コマンドライン上のリダイレクトやパイプの記号を解釈して、子プロセスの標準入出力をユーザの指示通りになるように設定して起動します。

Linuxの/procとは(入門者向け)

/procとは

Linuxには、/procというディレクトリがあります。このディレクトリの中のファイルはLinuxカーネルが内部情報を提供するための仮想的なもです。SSD上のファイルのように、どこかにファイルの実体があるわけではありません。

ディレクトリ内容の例

実際に見てみると以下のようになっています。ls-Fオプションをつけてあるので、 末尾に/があるものはディレクトリ、@があるのは、シンボリックリンクです。
$ ls -F /proc/
1/      73669/     crypto          irq/         modules       sys/
3674/   73681/     devices         kallsyms     mounts@       sysrq-trigger
3675/   73687/     diskstats       kcore        mtrr          sysvipc/
38/     91/        dma             keys         net@          thread-self@
4771/   92/        driver/         key-users    pagetypeinfo  timer_list
4777/   acpi/      dynamic_debug/  kmsg         partitions    tty/
4778/   asound/    execdomains     kpagecgroup  pressure/     uptime
61/     buddyinfo  fb              kpagecount   schedstat     version
72/     bus/       filesystems     kpageflags   self@         vmallocinfo
73/     cgroups    fs/             loadavg      slabinfo      vmstat
73632/  cmdline    interrupts      locks        softirqs      zoneinfo
73638/  consoles   iomem           meminfo      stat
73639/  cpuinfo    ioports         misc         swaps
一見して分かるように、数字だけのディレクトリ(例: 1/, 3674/など)と、それ以外のファイルやディレクトリ(例: acpi/, buddyinfoなど)があります。 数字のディレクトリは、その値のプロセス番号をもつプロセスの情報をそのディレクトリ以下にファイルとして持ちます。 それ以外のファイルやディレクトリ(以下のファイル)には、システム全体の情報が格納されています。

プロセス用のディレクトリ

いま、例としてsleepコマンドを実行させ、プロセスを起動します。 プロセスID 73717で起動しました。
$ sleep 3600 &
[1] 73717
このプロセスに関する/procの情報を見てみましょう。
$ ls -F /proc/73717/
arch_status         fd/                net/           setgroups
attr/               fdinfo/            ns/            smaps
autogroup           gid_map            numa_maps      smaps_rollup
auxv                io                 oom_adj        stack
cgroup              ksm_merging_pages  oom_score      stat
clear_refs          ksm_stat           oom_score_adj  statm
cmdline             limits             pagemap        status
comm                loginuid           patch_state    syscall
coredump_filter     map_files/         personality    task/
cpu_resctrl_groups  maps               projid_map     timens_offsets
cpuset              mem                root@          timers
cwd@                mountinfo          sched          timerslack_ns
environ             mounts             schedstat      uid_map
exe@                mountstats         sessionid      wchan
いろんなファイルやディレクトリがありますが、筆者がよく参照するものを2つここではあげます。

exe

そのプロセスの実行ファイルへのリンクです。プロセスの実行ファイルは/usr/bin/sleep であることが分かります。
 $ ls -l /proc/73717/exe
lrwxrwxrwx 1 foo foo 0 Mar 19 11:06 /proc/73717/exe -> /usr/bin/sleep

fd

そのプロセスがオープンしているファイルへのシンボリックリンクが格納されています。 シンボリックリンクのファイル名はデスクリプタ番号です。 この場合、標準入出力のためのファイル3つがオープンしていることが分かります。
$ ls -l /proc/73717/fd
total 0
lrwx------ 1 foo foo 64 Mar 19 11:15 0 -> /dev/pts/5
lrwx------ 1 foo foo 64 Mar 19 11:15 1 -> /dev/pts/5
lrwx------ 1 foo foo 64 Mar 19 11:15 2 -> /dev/pts/5

システム全体の情報

システム全体のファイルについても、3つ紹介します。

partitions

Linuxカーネルが認識しているパーティションが格納されています。以下ではNVMeのストレージのパーティションが表示されいてます。 USBストレージを挿入するとsda, sda1, sda2など、USBストレージに対応する項目が追加されます。Linuxカーネルが 接続したストレージを認識しているかを確認するときに有用です。
$ cat /proc/partitions 
major minor  #blocks  name

 259        0 1953514584 nvme0n1
 259        1     498688 nvme0n1p1
 259        2   19530752 nvme0n1p2
 259        3   19530752 nvme0n1p3
 259        4   19530752 nvme0n1p4
 259        5   19530752 nvme0n1p5
 259        6 1874891776 nvme0n1p6

uptime

Linuxが起動してからの時間が格納されています。
$ uptime
 11:22:23 up  9:19,  2 users,  load average: 0.00, 0.00, 0.00

self

あるプロセスがこのファイルを参照する時、それは、そのプロセス用ディレクトリへのリンクになっています。つまり、読み出すプロセスによって異なるリンク先を示します。

以下の例では、リンク先になっている73729は、/procを読み出しているlsコマンド自身のプロセスIDを持つディレクトリです。

$ ls -l /proc/self
lrwxrwxrwx 1 root root 0 Mar 19 02:02 /proc/self -> 73729

より詳しい情報

この記事の例で示したように/procにはたくさんのファイルがあります。それらの詳しい説明は以下を参照ください。

Linuxカーネルのビルド方法

この記事では、Linuxカーネルをビルドする方法を紹介します。Linuxコミュニティの最新カーネルでのみサポートされる機能を使う場合や、独自のLinux OSを作成する際に有用です。ここに掲載したコマンドは、Debian 11で実行を確認しましたが、他のLinux OSでも(パッケージのインストール方法を除いて)基本的には同じです。

ビルド準備

以下のパッケージをインストールします。
sudo apt install gcc make flex bison bc libncurses-dev libelf-dev libssl-dev

カーネルソースコードの取得

以下のサイトにカーネルのソースコードが掲載されています。

この記事を書いた日の最新安定版は6.2.7でした。以下は、それをビルド用マシンの作業用ディレクトリにダウンロードする例です。
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.2.7.tar.xz

ビルド

ソースコード展開

tar xf linux-6.2.7.tar.xz

設定

ここではデフォルト設定を行います。
cd linux-6.2.7
make defconfig

さらなる設定を行う場合 (TUI)

make menuconfig
上記のように入力すると、次のTUIベースの設定画面が表示されます。これを使って必要なCONFIGを追加/削除できます。

さらなる設定を行う場合 (コマンドライン)

以下のようにscript/configを使用する
scripts/config -e CONFIG_DEBUG_INFO_DWARF5
その後、設定されていないシンボルをデフォルトにする
make olddefconfig

参考

以下にコマンドラインでCONFIGを設定する方法を説明しています。

コンパイル

make -j32

上記の-j32は、32並列でのコンパイルを行うオプション。実際のCPU数に合わせて適宜変更。

次のメッセージが表示されればビルド成功。下記のbzImageは、多くのLinux OSでvmlinuz-6.1.0-5-amd64のような名前になっているものと同じです。

Kernel: arch/x86/boot/bzImage is ready  (#1)

起動テスト

ここではrootfsにDebian 11のドライブイメージを使い、QEMUで起動してみます。なお、QEMUの使用方法に関しては、以下に関連記事がまとめられています。

rootfsドライブイメージのダウンロード

以下のようにrootfsのイメージをダウンロードします。
wget https://cloud.debian.org/images/cloud/bullseye/20230124-1270/debian-11-nocloud-amd64-20230124-1270.qcow2

起動

次のとおりQEMUを実行します。--nographicオプションを付与しているので、仮想マシンにシリアルデバイスが作成されます。 また、カーネルオプションにconsole=ttyS0を付与して、コンソールをシリアルデバイスに設定しています。 これらによりQEMUを実行している端末が、そのままシリアルデバイスへの入出力端末となります。

なお、defconfigで設定した場合、virtio経由のストレージ機能がカーネルに組み込まれます。 initrdなしで直接rootfsをカーネルがマウントできます。

sudo qemu-system-x86_64 \
-cpu host \
--enable-kvm \
-m 1024 \
-nographic \
-drive id=drive0,format=qcow2,file=debian-11-nocloud-amd64-20230124-1270.qcow2,if=virtio \
-kernel arch/x86_64/boot/bzImage \
-append "root=/dev/vda1 console=ttyS0"
以下のようなログインプロンプトが表示されれば成功です。
(省略)
Debian GNU/Linux 11 debian ttyS0

debian login:
このイメージでは、ユーザ名としてrootと入力すると、パスワードなしで以下のようにログインできます。
Linux debian 6.2.7 #1 SMP PREEMPT_DYNAMIC Sun Mar 19 02:39:21 UTC 2023 x86_64
(省略)
root@debian:~#

起動失敗時のQEMU強制終了方法

QEMU起動中にCtrl-a、続いてcを入力するとQEMUのモニタ画面に移行します。ここでqを入力します。
(Ctrl-a, cを入力)
QEMU 7.2.0 monitor - type 'help' for more information
(qemu) q

cupsがない場合のsmbdのエラーメッセージ出力を抑止する。

CUPSがないと、smbdが次のようなメッセージを出力する。
Mar 26 08:44:22 ren smbd[4874]: [2015/03/26 08:44:22.103445,  0] ../source3/smbd/server.c:1278(main)
これを抑止するには、/etc/samba/smb.confのprinting項目をbsdに変更し、再起動する。
;    printing = cups
    printing = bsd
CentOS7.0なら、再起動は次のとおり。
# systemctl restart smb

Wireless LAN interfaceをブリッジ可能にする

wlan0などの無線LAN I/Fをbridgeに追加しようとすると以下のようなエラーで失敗することがある。
Operation not supported
その場合、次のコマンドを実行することで、追加可能になる。(wlan0の部分は適宜変更)
# iw dev wlan0 set 4addr on

Ubuntu 14.04/14.10/16.04でBluetoothヘッドホンを接続する。

デフォルトだと、A2DPに接続しようとすると"Stream Setup Failed"とメッセージが表示され失敗する。
以下のようにして、pulse-audioにbluetoothのためのモジュールをインストールする。
$ sudo apt-get install pulseaudio-module-bluetooth
$ pactl  load-module module-bluetooth-discover
なお、オーディオの出力を制御するにはpavucontrolを使う。

追記: 2016/06/20
Ubuntu 16.04でもこの方法で再生できること確認しました。

Ubuntu 14.04で起動時にBridgeインターフェイスを作成する。

/etc/network/interfaceに以下のような記述を行う。青字の部分はBridge名であり、下記の例ではmybr0である。
auto mybr0
iface mybr0 inet static
  address 192.168.81.1
  network 192.168.81.0
  netmask 255.255.255.0
  broadcast 192.168.81.255
  bridge_ports none

なお、bridge_ports noneという行は、Bridge起動時点で、そのBridgeに所属するinterfaceが何もない場合に指定する必要がある。

また、eth0のような起動時に存在するNICを加えてbridgeを構成するには、次のようにすればよい。

iface eth0 ine manual

iface mybr0 inet static
<同上>
bridge_ports eth0


関連記事 CentOSでBridgeインターフェイスを作成する

Debian系Linux OS (Ubuntu含む)で静的にIPアドレスを設定する。

/etc/network/interfacesに以下のように記述する。
auto eth0
iface eth0 inet static
  address 192.168.71.10
  netmask 255.255.255.0
  gateway 192.168.71.1

Ubuntu 13.10, 14.04のLXCでDHCPの範囲を変更する。

デフォルトでは、サブネットのほぼ全てがDHCPに割り当てられる。静的なIPを割り当てるため、その範囲を変更するには、 /etc/default/lxc-netを編集すればよい。以下の例は、割り当てアドレスの先頭を10.0.3.100にする。
LXC_DHCP_RANGE="10.0.3.100,10.0.3.254"
その後、システムをリセットする。

なお、/etc/init/lxc-net.confを読むと、lxcbr0を一旦削除しないと再度、dnsmasqを起動されない模様。 少々面倒だが、次の様にすれば、リセットせずに反映できる。
  • すべてのコンテナを終了する
  • 次のコマンドでlxcbr0を削除
  • # ifconfig lxcbr0 down
    # brctl delbr lxcbr0
    
  • lxcの再起動
  • # initctl stop lxc
    # initctl start lxc
    
dnsmaqのオプションをが指定したとおりになっていれば成功。
# ps ax | grep lxc-dnsmasq 
 6097 ?        S      0:00 dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/var/run/lxc/dnsmasq.pid --conf-file= --listen-address 10.0.3.1 --dhcp-range 10.0.3.100,10.0.3.254 --dhcp-lease-max=253 --dhcp-no-override --except-interface=lo --interface=lxcbr0 --dhcp-leasefile=/var/lib/misc/dnsmasq.lxcbr0.leases --dhcp-authoritative

Linuxで不良セクタを検出して登録する

/dev/sdb1に対して、不良セクタの検出を行い、ファイルシステムにそれを登録する例。
# fsck -c /dev/sdb1
もしくは、不良セクタの情報をファイルに書き出し、それをfsckに読み込ませる。
# badblocks -vs -o sdb1.badblocks /dev/sdb1
# fsck -l sdb1.badblocks /dev/sdb1
badblocksの引数の-vは冗長な出力、-sは、進捗表示をそれぞれ意味する。

LXCのNICをOpen vSwitchに追加

ホストでOpen vSwitchのブリッジが作成されていることを前提に説明する。 ブリッジをovsbr0、LXCのコンテナが作るvethデバイスをveth-lxcとすると以下のように組み込めばよい。
# ovs-vsctl add-port ovsbr0 veth-lxc
特別なことは、ほとんどないが、以下の点に注意が必要。
  • LXCコンテナのvethでバイス名が固定していないと若干面倒
  • LXCコンテナを起動するときに、Linuxのbridgeに組み込む設定(lxc.network.link)があると、 lxc-startでエラーになる
これらを回避するには、LXCの基本的な使い方 の「設定ファイル」項目を参照して、適宜設定のこと。

あるコマンドが含まれるパッケージを検索する

Debin, Ubuntuなどdpkgベースの場合

-Sオプションを使用する。
$ dpkg -S /bin/ls
coreutils: /bin/ls

Fedora, CentOSなどRPMベースの場合

-qfオプションを指定
$ rpm -qf /bin/ls
coreutils-8.4-31.el6_5.1.x86_64

CentOSでBridgeインターフェイスを作成する

mybr0というブリッジをつくる例。

/etc/sysconfig/network-scripts/ifcfg-mybr0を作成する。 (青色の部分は、作成するブリッジの名前にする)
以下は、ファイル内容の例。ポイントは、TYPE=Bridgeを記述すること。
DEVICE=mybr0
BOOTPROTO=static
BROADCAST=192.168.118.255
GATEWAY=192.168.158.2
IPADDR=192.168.118.1
NETMASK=255.255.255.0
ONBOOT=yes
TYPE=Bridge

ブリッジを作成するには、再起動するか、以下のコマンドを実行する。
# ifup mybr0
ブリッジが作成できているかはifconfigコマンドで確認できる。また、次のコマンドで、ブリッジの構成について確認できる。 (なお、この例ではまだ、interfaceがブリッジに追加されていない)
# brctl show
bridge name     bridge id               STP enabled     interfaces
mybr0           8000.000000000000       no

Ubuntu 13.10 / 14.04, CentOS6.5 / 6.6 / 7.0でパスワードなしでsudoする

ユーザfooをパスワードなしで、sudoできるようにするには、/etc/sudoersに以下に次の行を加える
foo ALL=(ALL) NOPASSWD:ALL
つぎのように%から始めると、グループで指定できる。
%admin ALL=(ALL) NOPASSWD:ALL
なお、sudoグループがに関する記述があると個別ユーザーやグループにNOPASSWDを追加しても、パスワードを要求される。その場合、以下のように%sudo行をコメントアウトする。
#%sudo ALL=(ALL:ALL) ALL
ただし、複数ユーザー環境では、他のユーザーがsudoできなくなる可能性があるの要注意。

LXCの基本的な使い方

以下のコマンドで-nオプションは省略できる場合が多い。

コンテナの作成

テンプレートをubuntu、コンテナ名をcontainer-nameとして作成する例。
# lxc-create -t ubuntu -n container-name
-tに使用するテンプレートは、/usr/share/lxc/templatesの下にある。

コンテナを起動

# lxc-start -n container-name

トラブルシュート

No croup mounted on the systemと表示される場合、/etc/fstabに次の記述をして、
none        /cgroup        cgroup        defaults    0    0
/cgroupsを以下のようにマウントする。
# mkdir /cgroup
# mount /cgroup

コンテナのコンソールを表示

# lxc-console -n container-name

コンテナのコンソールを終了

  • Ctrl-a + q
(Ctrl-a + Ctrl-qでないことに注意。qを入力する時は、Ctrlは押下されていない。)

コンテナの終了

# lxc-shutdown -n container-name

コンテナへのアタッチ

アタッチは、ログインを省略して、rootでコンテナの直接シェルを起動する。
# lxc-attach -n container-name

設定ファイル

設定ファイルは以下のひとつで、シンプル。
  • /var/lib/lxc/[container-name]/config

BridgeへのInterfaceの自動追加

以下の行の右辺にbridge名を設定。 なお、Bridgeの作り方については、こちらも参照。
lxc.network.link = lxcbr0

ホスト側のvethインターフェイス名

通常は適当な名前が付けられるので設定不要だが、明示することもできる。
lxc.network.veth.pair = veth-mycontainer

CentOSでNICのMACアドレスが70-persistent-net.ruleに自動登録されるのを抑制する

CentOSでは、NICのMACアドレスをあるinterface(eth0など)に固定するための設定が自動的に以下のファイルに追加されます。
/etc/udev/rules.d/70-persistent-net.rule
この機能は、便利ではありますが、不都合な場合もあります。例えば、Diskイメージをコピーして、他の環境で使う場合に、1枚目のNICがeth1になるなどです。 上記の振る舞いを抑制するには、下記のファイルを編集します。
/lib/udev/rules.d/75-persistent-net-generator.rules
以下の行を削除または、コメントアウトします。
 DRIVERS=="?*", IMPORT{program}="write_net_rules"
なお、上記は、自動的に追加することを抑止しますが、すでに70-persistent-net.ruleなどに設定がある場合、それは依然として有効のままです。無効にする場合は、70-persistent-net.rulの中の該当する行を削除します。また、/etc/sysconfig/network-scripts/ifcfg-eth0の中にもMACアドレスの記載がある場合、それも削除します。