DebianやUbuntuでは、/etc/default/grubのGRUB_CMDLINE_LINUX_DEFAULTに以下のようにconsoleblankオプションを追加する。
GRUB_CMDLINE_LINUX_DEFAULT="quiet consoleblank=60"その後、grub.confを更新して再起動する。
update-grub2 reboot
DebianやUbuntuでは、/etc/default/grubのGRUB_CMDLINE_LINUX_DEFAULTに以下のようにconsoleblankオプションを追加する。
GRUB_CMDLINE_LINUX_DEFAULT="quiet consoleblank=60"その後、grub.confを更新して再起動する。
update-grub2 reboot
| CONFIG | 説明 |
|---|---|
| BRIDGE | ブリッジ機能 |
| SQUASHFS | squashfsサポート |
| SQUASHFS_XATTR | squashfsでのxattrのサポート |
| OVERLAY_FS | オーバイレイFSのサポート。Dockerなどで使用されている。 |
| FUSE_FS | FUSE FSのサポート |
$ 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では、すべてのものはファイルとして扱われます。例えば、キーボード入力や画面出力もファイルとして扱われます。 具体的に見ていきましょう。まず以下のように入力してみます。この出力にはいろいろな知見が含まれます。順に説明します。
# 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
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コマンドの標準出力はリダイレクトされたファイルに なっていることが分かります。以下のその様子を図示します。
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以下にこの状態を図示します。
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 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また、これまで同じく図も示します。
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 grepcatと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が標準出力に書き込んだデータは、端末に表示されることが分かります。
$ 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 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つここではあげます。
$ ls -l /proc/73717/exe lrwxrwxrwx 1 foo foo 0 Mar 19 11:06 /proc/73717/exe -> /usr/bin/sleep
$ 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
$ 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 11:22:23 up 9:19, 2 users, load average: 0.00, 0.00, 0.00
あるプロセスがこのファイルを参照する時、それは、そのプロセス用ディレクトリへのリンクになっています。つまり、読み出すプロセスによって異なるリンク先を示します。
以下の例では、リンク先になっている73729は、/procを読み出しているlsコマンド自身のプロセスIDを持つディレクトリです。
$ ls -l /proc/self lrwxrwxrwx 1 root root 0 Mar 19 02:02 /proc/self -> 73729
sudo apt install gcc make flex bison bc libncurses-dev libelf-dev libssl-dev
以下のサイトにカーネルのソースコードが掲載されています。
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
make menuconfig上記のように入力すると、次のTUIベースの設定画面が表示されます。これを使って必要なCONFIGを追加/削除できます。

scripts/config -e CONFIG_DEBUG_INFO_DWARF5その後、設定されていないシンボルをデフォルトにする
make olddefconfig
make -j32
上記の-j32は、32並列でのコンパイルを行うオプション。実際のCPU数に合わせて適宜変更。
次のメッセージが表示されればビルド成功。下記のbzImageは、多くのLinux OSでvmlinuz-6.1.0-5-amd64のような名前になっているものと同じです。
Kernel: arch/x86/boot/bzImage is ready (#1)
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:~#
(Ctrl-a, cを入力) QEMU 7.2.0 monitor - type 'help' for more information (qemu) q
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
Operation not supportedその場合、次のコマンドを実行することで、追加可能になる。(wlan0の部分は適宜変更)
# iw dev wlan0 set 4addr on
$ sudo apt-get install pulseaudio-module-bluetooth $ pactl load-module module-bluetooth-discoverなお、オーディオの出力を制御するにはpavucontrolを使う。
追記: 2016/06/20
Ubuntu 16.04でもこの方法で再生できること確認しました。
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が何もない場合に指定する必要がある。
iface eth0 ine manual iface mybr0 inet static <同上> bridge_ports eth0
auto eth0 iface eth0 inet static address 192.168.71.10 netmask 255.255.255.0 gateway 192.168.71.1
LXC_DHCP_RANGE="10.0.3.100,10.0.3.254"その後、システムをリセットする。
# ifconfig lxcbr0 down # brctl delbr lxcbr0
# initctl stop lxc # initctl start lxcdnsmaqのオプションをが指定したとおりになっていれば成功。
# 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
# fsck -c /dev/sdb1もしくは、不良セクタの情報をファイルに書き出し、それをfsckに読み込ませる。
# badblocks -vs -o sdb1.badblocks /dev/sdb1 # fsck -l sdb1.badblocks /dev/sdb1badblocksの引数の-vは冗長な出力、-sは、進捗表示をそれぞれ意味する。
# ovs-vsctl add-port ovsbr0 veth-lxc特別なことは、ほとんどないが、以下の点に注意が必要。
$ dpkg -S /bin/ls coreutils: /bin/ls
$ rpm -qf /bin/ls coreutils-8.4-31.el6_5.1.x86_64
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
foo ALL=(ALL) NOPASSWD:ALLつぎのように%から始めると、グループで指定できる。
%admin ALL=(ALL) NOPASSWD:ALLなお、sudoグループがに関する記述があると個別ユーザーやグループにNOPASSWDを追加しても、パスワードを要求される。その場合、以下のように%sudo行をコメントアウトする。
#%sudo ALL=(ALL:ALL) ALLただし、複数ユーザー環境では、他のユーザーがsudoできなくなる可能性があるの要注意。
# lxc-create -t ubuntu -n container-name-tに使用するテンプレートは、/usr/share/lxc/templatesの下にある。
# lxc-start -n container-name
none /cgroup cgroup defaults 0 0/cgroupsを以下のようにマウントする。
# mkdir /cgroup # mount /cgroup
# lxc-console -n container-name
# lxc-shutdown -n container-name
# lxc-attach -n container-name
lxc.network.link = lxcbr0
lxc.network.veth.pair = veth-mycontainer
/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アドレスの記載がある場合、それも削除します。