コンテンツにスキップ

仮想マシン

概要

設定

nftables

$ sudo systemctl reload nftables
$ sudo systemctl restart lxc-net
$ sudo systemctl restart docker
$ sudo nft list ruleset

libvirt

$ sudo adduser USER libvirt
$ newgrp libvirt

$ sudo virsh net-list --all
$ sudo virsh net-autostart default
$ sudo virsh net-start default
  • /etc/nftables.conf
table inet filter {
        chain input {
                iifname "virbr0" udp dport {53,67} accept
                iifname "virbr0" tcp dport 53 accept
        }
        chain forward {
                iifname "virbr0" accept
                oifname "virbr0" ct state established,related accept
        }
}
$ sudo nft insert rule inet filter input iifname "virbr0" accept
$ sudo nft insert rule inet filter forward iifname "virbr0" accept
$ sudo nft insert rule inet filter forward oifname "virbr0" accept
$ osinfo-query os

$ sudo virt-install \
  --name debian \
  --memory 4096 \
  --vcpus 4 \
  --disk path=~/libvirt/debian.qcow2,size=30,bus=virtio \
  --os-variant debian13 \
  --network network=default,model=virtio \
  --graphics spice \
  --cdrom ~/libvirt/debian-13.6.0-amd64-netinst.iso
$ virt-manager
削除
$ sudo virsh list --all
$ sudo virsh shutdown NAME
($ sudo virsh destroy NAME)
$ sudo virsh undefine NAME --remove-all-storage

bridge接続

※ifupdownやconnmanなどが起動しているなら停止する。

$ sudo nmcli connection add type bridge \
  ifname br0 \
  con-name br0 \
  ipv4.method auto \
  ipv6.method auto
$ sudo nmcli connection add type ethernet \
  ifname enp37s0 \
  master br0 \
  con-name br0-slave-enp37s0
$ sudo nmcli connection down "プロファイル 1"
$ sudo nmcli connection up br0
$ sudo nmcli connection up br0-slave-enp37s0
$ nmcli device status
$ nmcli connection show

virt-managerか、設定ファイル(/etc/libvirt/qemu)で設定する。

$ sudo virsh edit debian
$ virt-xml

systemd-networkdと共存する

  • /etc/NetworkManager/conf.d/10-unmanaged.conf
[keyfile]
unmanaged-devices=interface-name:enp37s0;interface-name:br0
sudo systemctl restart NetworkManager
nmcli device
  • /etc/systemd/network/10-br0.netdev
[NetDev]
Name=br0
Kind=bridge
  • /etc/systemd/network/20-enp37s0.network
[Match]
Name=enp37s0

[Network]
Bridge=br0
  • /etc/systemd/network/30-br0.network
[Match]
Name=br0

[Network]
DHCP=yes
IPv6AcceptRA=yes
sudo systemctl enable --now systemd-networkd
sudo apt install systemd-resolved
resolvectl status

LXC(Unprivileged)

  • ~/.config/lxc/lxc.conf
lxc.lxcpath = /lxc
  • /etc/subuid
  • /etc/subgid
USER:100000:65536
  • ~/.config/lxc/default.conf
lxc.include = /etc/lxc/default.conf

lxc.idmap = u 0 100000 65536
lxc.idmap = g 0 100000 65536
$ lxc-create -n debian -t download
  • /lxc/debian/config
lxc.apparmor.profile = lxc-container-default-with-nesting
  • /etc/lxc/lxc-usernet
USER veth lxcbr0 10
  • /etc/nftables.conf
table inet filter {
        chain input {
                iifname "lxcbr0" udp dport {53,67} accept
                iifname "lxcbr0" tcp dport 53 accept
        }
        chain forward {
                iifname "lxcbr0" accept
                oifname "lxcbr0" ct state established,related accept
        }
}
$ lxc-start -n debian
$ lxc-attach -n debian
$ lxc-stop -n debian
削除
$ lxc-stop -n debian
$ lxc-destroy -n debian
bridge接続
  • /etc/lxc/lxc-usernet
USER veth br0 10
  • /lxc/debian/config
lxc.net.0.link = br0

Docker

sudo adduser USER docker
  • /etc/docker/daemon.json
{
    "data-root": "/docker"
}

※ver.29では、containerdが使われている

  • /etc/containerd/config.toml
#root = "/var/lib/containerd"
  • /etc/nftables.conf
table inet filter {
        chain input {
                # Docker
                iifname "docker0" udp dport {53,67} accept
                iifname "docker0" tcp dport 53 accept
        }
        chain forward {
                # Docker
                iifname "docker0" accept
                oifname "docker0" ct state established,related accept
        }
}
$ docker pull debian:trixie
$ docker images
$ docker run --name debian-trixie -it debian:trixie bash
$ docker rm debian-trixie
apache

Dockerfile

FROM debian:trixie

RUN apt update && \
    apt install -y apache2 && \
    rm -rf /var/lib/apt/lists/*

EXPOSE 80

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
$ docker build -t apache .
$ docker run -d \
  --name web \
  -p 8080:80 \
  apache