我正在尝试限制容器内的带宽。我曾尝试使用以下命令,但我认为它没有生效。
cd /sys/fs/cgroup/net_cls/
echo 0x1001 > A/net_cls.classid # 10:1
echo 0x1002 > B/net_cls.classid # 10:2
tc qdisc add dev eth0 root \
handle 10: htb
tc class add dev eth0 parent 10: \
classid 10:1 htb rate 40mbit
tc class add dev eth0 parent 10: \
classid 10:2 htb rate 30mbit
tc filter add dev eth0 parent 10: \
protocol ip prio 10 \
handle 1: cgroup
Run Code Online (Sandbox Code Playgroud)
这里 A 和 B 是使用此命令创建的容器。
lxc-execute -n A -f configfile /bin/bash
lxc-execute -n …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试在 Ubuntu 12.04 主机上使用 LXC 运行 Arch Linux 容器。Arch Linux 最近迁移到了systemd,根据很多地方的说法,它作为 LXC 来宾运行时存在一些问题。然而,其中许多来源已经过时了,而且我已经看到各种其他来源表明可以使用 或 之类的东西来运行基于 systemd 的lxc.autodev来宾devtmpfs。
因此,我试图找出以下内容:
当前使用 LXC 版本 0.7.5,但如果有必要,升级应该不是问题。
我在 Debian 上运行 LXC 容器(lxc 0.7.2-1),桥接网络由书中配置的公共 IP 和我遇到的问题是它将假 MAC 地址从 LXC 容器暴露到外部网络,在那里它被交换机端口阻止安全性,从而防止 LXC 容器与世界通信。我在具有相同网络配置的 Ubuntu 12.04.2 LTS(lxc 0.7.5-3ubuntu67)上运行另一个 LXC 容器,但我没有任何问题,因为它不会将假 MAC 暴露给外部网络,并且所有通信都与主机的 MAC 进行。
目前我正试图找到主机之间网络配置的差异,但没有取得太大的成功。它可能是 lxc 本身的版本相关行为吗?
Debian /etc/network/interfaces
auto br0
iface br0 inet static
bridge_ports eth0
bridge_fd 0
bridge_stp off
bridge_maxwait 0
address y.y.y.9
netmask 255.255.255.192
broadcast y.y.y.63
gateway y.y.y.1
pre-up iptables-restore < /etc/iptables.up.rules
Run Code Online (Sandbox Code Playgroud)
Debian LXC 网络配置
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = fe:95:57:4b:b4:9b
lxc.network.ipv4 = y.y.y.12/26
Run Code Online (Sandbox Code Playgroud)
Ubuntu /etc/network/interfaces
auto br0
iface …Run Code Online (Sandbox Code Playgroud) 我有一个 Debian 挤压内核 (linux-image-2.6.32-5-openvz-amd64),根据 Doku 应该支持 cgroups。当我查看内核配置时,确实如此(或者是否需要其他一些内核配置?)
# zgrep -i cgroup /boot/config-2.6.32-5-openvz-amd64
# CONFIG_CGROUP_SCHED is not set
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_DEVICE=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NET_CLS_CGROUP=y
Run Code Online (Sandbox Code Playgroud)
此外,根据http://wiki.debian.org/LXC,内核参数 cgroup_enable=memory 可能是必要的。我用它启动内核:
# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-2.6.32-5-openvz-amd64 root=UUID=6332fe39-7eaa-4519-b6c1-e05808284586 ro cgroup_enable=memory quiet console=ttyS0,57600n8
Run Code Online (Sandbox Code Playgroud)
但是,系统仍然没有cgroup支持!无法挂载 cgroup 文件系统,因为系统甚至不知道文件系统类型:
# mount -t cgroup none /cgroup
mount: unknown filesystem type 'cgroup'
Run Code Online (Sandbox Code Playgroud)
和:
# grep -i cgroup /proc/filesystems
#
Run Code Online (Sandbox Code Playgroud)
所以要么有错误,要么我错过了一些东西。谁能告诉我什么?是否缺少内核参数?内核配置?
我想知道 LXC 是否可以提供一个完全隔离的基准测试环境。假设我们有 2 台相同的机器,使用相同的全新 Linux 并且没有网络连接。
第一台机器的平均负载为 50,第二台机器只有 1。
我将同一个容器放在两台机器上并运行任何程序的基准测试。
两台机器的性能会一样吗?
如果没有,您知道拥有完全隔离环境的更好方法吗?我的意思是,一种在不依赖主机平均/当前负载的情况下具有相同性能的虚拟化方式。
谢谢 :)
我的主机文件系统ext4挂载了noatime标志。但是在 lxc 容器内,该标志不存在。
这是mount主机上的输出:
/dev/sdb1 on /home type ext4 (rw,noatime)
这mount是容器中的输出:
/dev/sdb1 on / type ext4 (rw)
我现在有两个问题:
noatime设置在容器里有区别吗?我的猜测是肯定的。
noatime容器的最佳设置方式是什么?理想情况下,我想配置这样一种方式,它总是尊重主机的文件系统标志。
更新
的/proc/mounts显示略有不同的条目:
rootfs / rootfs rw 0 0
/dev/sdb1 /home ext4 rw,noatime 0 0
Run Code Online (Sandbox Code Playgroud) 我现在运行私人服务器一段时间,当我设置它时,我使用 LXC 将不同的服务彼此分开。
大约一个月前,我开始使用 docker(用于工作和私人),从现在开始,我想将它用于新服务(并慢慢地将旧服务迁移到它)。
长话短说:是否可以在同一台主机上同时运行 LXC 和 Docker,只要我需要一个接一个地迁移服务?
服务器运行 Debian Jessie 64 位。
首先,我有一个特殊的 IPv6 地址分配给我的专用服务器,只有 1。一个 ::1/128 一个。但我可以为 eth0 分配地址(例如:::2/128、::3/128 等)。
现在我想在该服务器上运行 LXC 容器,但我希望它们成为一等公民,我希望它们拥有自己的 IPv6 地址。
带有 IPv4 的 LXC 工作正常。我可以启动一个容器,并从中 ping 世界。我有一个名为lxcbr0.
老实说,我不知道如何继续。在我的特定 LXC 配置中(“前缀”代表我分配的前缀):
lxc.network.ipv6 = prefix::3/128
lxc.network.ipv6.gateway = prefix::2 # iffy, not sure this is correct
Run Code Online (Sandbox Code Playgroud)
在主机上,我已将 sysctl 配置为使用转发:
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.eth0.forwarding = 1
Run Code Online (Sandbox Code Playgroud)
现在我迷失了方向。我想我需要为网桥分配一个 IP。我已经为它分配了前缀::2/128,这是我在上面的 LXC 配置中使用的。在“界面”中:
iface lxcbr0 inet6 static
address prefix::2
netmask 128
# use arp proxy? Read that somewhere.
post-up /sbin/ip -6 neigh add proxy prefix::3 dev eth0 …Run Code Online (Sandbox Code Playgroud) 有没有办法像 docker 那样在 lxd 容器中进行端口转发?
我听到一些传言说没有简单的方法。
根据 lxd 的主页,这是他们的目标:
直观(简单、清晰的 API 和清晰的命令行体验)
对我来说,端口转发是一个重要的部分。
我不着急。如果计划在未来发布,这将是一个有效的答案。
ufw在 Ubuntu 上使用时,我试图让端口转发工作以公开 LXC 容器,但无济于事。我根据 Internet 上的指南构建了以下工作流程 ([1][2][3]);最值得注意的是,关于/etc/ufw/before.rules我看到的部分到处重复,但是......我无法让它为我工作。
如果有人遵循本指南并取得成功....请告诉我(这样我可能会先哭,然后回过头来编写我自己的防火墙工具)
测试环境
在主机 1 上安装 LXC - 我正在使用普通的 LXC 进行此操作,尚未引入 LXD 设置
sudo lxc-create -n web -t download -- -d centos -r 7 -a amd64sudo lxc-start -n websudo lxc-attach -n web
yum install httpd ; yum enable httpd ; yum start httpdexit我们现在假设
lxc ×10
bridge ×2
networking ×2
performance ×2
arch-linux ×1
bandwidth ×1
benchmark ×1
cgroup ×1
containers ×1
docker ×1
filesystems ×1
ipv6 ×1
linux ×1
linux-kernel ×1
lxd ×1
routing ×1
systemd ×1
tc ×1
ubuntu ×1
ufw ×1