Linux 资源控制实战分析:用 LXC 亲手造一个 “迷你虚拟机“

你好,Linux 新手朋友!你是不是经常听到 "容器""Docker""资源隔离" 这些词,感觉又高大上又难懂?是不是觉得这些都是大佬才玩得转的黑科技?

别慌,今天咱们就用最接地气的方式,通过 LXC 这个工具,亲手创建一个容器,一步步搞明白 Linux 到底是怎么把一台机器 "劈成" 好几台用的。全程保姆级操作,每一步都告诉你在哪敲、敲什么、会看到啥,零基础也能跟上。

1、先唠明白:容器到底是个啥?

在动手之前,咱们先用大白话把概念说清楚,不整虚的。

1.1 虚拟机 vs 容器:两家的 "装修方案" 不一样

你可以把一台电脑想象成一栋大房子。

  • 虚拟机:相当于在房子里砌了好几堵承重墙,隔出好几间独立的小房子。每间都有自己的墙、自己的门、自己的水电系统,互相完全不打扰。但缺点是费材料、占地方,开多了房子就挤不动了。
  • 容器:相当于在房子里用轻质隔板隔出好多小隔间。大家共享房子的地基、主水管和主电线,但是每个隔间有自己的小房间、小桌子,你在隔间里干啥,隔壁基本看不见也管不着。省材料、搭得快,是现在的主流玩法。

咱们今天玩的 LXC,就是 Linux 原生的 "轻质隔板工具",大名鼎鼎的 Docker 早期也是靠它起家的。学会了 LXC,你再看 Docker 就会觉得:哦,原来就是包装得更花哨了而已。

1.2 Linux 靠啥实现 "隔间" 效果?

就两个核心法宝,记住这俩词你就超过一半外行:

  1. Namespace(命名空间):负责 "眼睛上的隔离"------ 让每个隔间里的人,都以为自己拥有一整台电脑。看不到别的进程、看不到别的用户、连主机名都不一样。
  2. Cgroups(控制组):负责 "实际上的限流"------ 给每个隔间分配好最多用多少 CPU、多少内存、多少硬盘 IO,谁也别抢谁的。

说一千道一万,不如亲手干一遍。咱们现在就开始实战。

2、战前准备:把 LXC 工具装上

咱们分 Ubuntu 和 CentOS 两种系统来讲,你是什么系统就看哪一节。

操作窗口说明 :以下所有命令,都在你的宿主机终端窗口(也就是你平时敲 Linux 命令的那个黑窗口)里执行,全程用 root 用户或者加 sudo。

2.1 Ubuntu 系统安装步骤

2.1.1 先检查一下有没有装过旧版本

如果之前装过,建议先清理干净,避免出奇怪的问题。没装过直接跳到 2.1.2。

在哪操作 :宿主机终端 执行命令

bash 复制代码
systemctl status lxc

做了什么 :查看 lxc 服务当前状态 预期效果

  • 如果提示 "Unit lxc.service could not be found",说明没装过,直接往下走。
  • 如果显示正在运行,说明之前装过,可以先停止所有容器再卸载。

需要卸载的话依次执行:

bash 复制代码
# 先查看有哪些容器
lxc-ls -f

# 逐个停止容器(把xxx换成你的容器名)
lxc-stop -n xxx

# 逐个删除容器
lxc-destroy -n xxx

# 卸载软件
apt-get purge --auto-remove lxc lxc-templates -y
2.1.2 正式安装

在哪操作 :宿主机终端 执行命令

bash 复制代码
apt install lxc lxc-templates bridge-utils -y

做了什么:一次性装三个东西

  • lxc:主程序,容器的核心引擎
  • lxc-templates:各种系统模板,相当于 "隔间装修样板间"
  • bridge-utils:网桥工具,用来给容器分配网络

预期效果:命令跑完没有报错,最后出现类似 "0 upgraded, 0 newly installed, 0 to remove" 或者安装成功的提示。

2.1.3 检查服务状态

在哪操作 :宿主机终端 执行命令

bash 复制代码
systemctl status lxc

做了什么 :确认 lxc 服务正常运行 预期效果 :看到绿色的 active (exited) 字样,说明服务启动成功了。

2.2 CentOS 系统安装步骤

2.2.1 先配置软件源

CentOS 默认源里没有 LXC,得先装 epel 源。

在哪操作 :宿主机终端 执行命令

bash 复制代码
yum -y install epel-release

做了什么:安装扩展软件源,里面包含 LXC 相关包

2.2.2 正式安装

在哪操作 :宿主机终端 执行命令

bash 复制代码
yum -y install lxc lxc-templates bridge-utils lxc-libs libcgroup libvirt lxc-extra debootstrap

做了什么:安装 LXC 全家桶,比 Ubuntu 多装了几个依赖库和虚拟化管理工具

2.2.3 启动服务并检查

在哪操作 :宿主机终端 执行命令

bash 复制代码
systemctl start lxc
systemctl start libvirtd
systemctl status lxc

做了什么:启动 lxc 服务和虚拟化监控服务,然后查看状态

预期效果 :看到 active (running) 就表示正常运行了。

3、第一步:检查你的系统支不支持 "造隔间"

装完软件先别急着建容器,先确认一下你的 Linux 内核把该开的开关都打开了。这一步很重要,就像装修前先检查水电通不通。

3.1 执行环境检查命令

在哪操作 :宿主机终端 执行命令

bash 复制代码
lxc-checkconfig

做了什么:让 LXC 帮你做一次全身体检,看看内核的各项容器功能有没有开启

3.2 教你看懂检查报告

输出内容会很长,你重点看这几大块:

3.2.1 Namespaces 部分

看到下面这些项后面都是 enabled,就说明 "视觉隔离" 功能全开了:

  • Namespaces: enabled
  • Utsname namespace: enabled(主机名隔离)
  • Ipc namespace: enabled(进程间通信隔离)
  • Pid namespace: enabled(进程号隔离)
  • User namespace: enabled(用户隔离)
  • Network namespace: enabled(网络隔离)
3.2.2 Control groups 部分

这部分都是 enabled,说明 "资源限流" 功能也正常:

  • Cgroups: enabled
  • Cgroup memory controller: enabled(内存控制)
  • Cgroup cpu account: enabled(CPU 统计)
  • Cgroup blkio: enabled(磁盘 IO 控制)
3.2.3 Misc 部分

看到 Veth pair device: enabled, loadedBridges: enabled, loaded,说明网络桥接功能没问题,容器能正常上网。

一句话总结:只要大部分都是 enabled,你就可以放心往下走了。

4、第二步:看看都有哪些 "装修模板" 可选

LXC 自带了很多现成的系统模板,就像奶茶店的菜单,想喝什么口味直接点。

4.1 查看可用模板列表

在哪操作 :宿主机终端 执行命令

bash 复制代码
ls /usr/share/lxc/templates/

做了什么:列出 LXC 自带的所有系统模板文件

预期效果:你会看到一长串名字,比如:

  • lxc-ubuntu:Ubuntu 系统模板
  • lxc-centos:CentOS 系统模板
  • lxc-debian:Debian 系统模板
  • lxc-alpine:超轻量的 Alpine 模板
  • lxc-busybox:最小巧的 busybox 系统

咱们今天就用 Ubuntu 模板来演示,创建一个叫 lxchost1 的容器。

5、第三步:亲手创建第一个容器

激动人心的时刻到了,咱们正式 "搭隔间"。

5.1 执行创建命令

在哪操作 :宿主机终端 执行命令

bash 复制代码
lxc-create -t ubuntu -n lxchost1 -- -r xenial -a amd64

做了什么:咱们拆开讲,每个参数都是干啥的

  • -t ubuntu:指定用 ubuntu 模板,相当于 "我要装修成 Ubuntu 风格"
  • -n lxchost1:给容器起个名字叫 lxchost1,以后都用这个名字找它
  • -- -r xenial:指定系统版本是 xenial(也就是 Ubuntu 16.04)
  • -a amd64:指定架构是 64 位

小提示 :如果你的宿主机是 CentOS,想建 CentOS 容器,用这条命令: lxc-create -t centos --name centos1 -- --release 7 --arch x86_64

5.2 耐心等待下载过程

预期效果:命令执行后,屏幕会哗哗地滚日志,显示正在下载各种软件包。这个过程快慢取决于你的网速,慢的话可能要等几分钟。

5.3 创建成功的标志

当你看到下面这几行字,就说明容器创建成功了:

bash 复制代码
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.

划重点

  • 默认用户名:ubuntu
  • 默认密码:ubuntu
  • 进去之后可以用 sudo 获得 root 权限

5.4 容器文件存在哪了?

咱们来瞅一眼 Linux 把这个 "隔间" 的东西放哪了。

在哪操作 :宿主机终端 执行命令

bash 复制代码
ls -l /var/lib/lxc/lxchost1/

做了什么 :查看容器目录结构 预期效果:你会看到两个关键东西:

  • config:容器的配置文件,相当于 "隔间的设计图纸"
  • rootfs/:容器的根文件系统,相当于隔间里的所有文件都在这

再看看下载缓存:

bash 复制代码
ls -l /var/cache/lxc/

这里存着下载好的软件包,下次再建同样的容器就不用重新下载了,速度会快很多。

6、第四步:启动容器,看看它活了没

容器创建好了是 "关机状态",咱们把它开起来。

6.1 先看一眼当前状态

在哪操作 :宿主机终端 执行命令

bash 复制代码
lxc-ls -f

做了什么 :列出所有容器及其详细状态,-f 就是 fancy 的意思,显示完整信息

预期效果:输出大概长这样:

bash 复制代码
NAME      STATE    AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
lxchost1  STOPPED  0         -      -    -    false

STATE 那一栏显示 STOPPED,说明容器躺着呢,还没开机。

6.2 启动容器

在哪操作 :宿主机终端 执行命令

bash 复制代码
lxc-start -n lxchost1 -d

做了什么

  • -n lxchost1:指定启动哪个容器
  • -d:后台运行(daemon 模式),就像你平时开软件最小化到后台一样

6.3 再看状态,确认跑起来了

在哪操作 :宿主机终端 执行命令

bash 复制代码
lxc-ls -f

预期效果

bash 复制代码
NAME      STATE    AUTOSTART GROUPS IPV4       IPV6 UNPRIVILEGED
lxchost1  RUNNING  0         -      10.0.3.248 -    false

看到没?变化来了:

  • STATE 变成了 RUNNING:容器正在运行
  • IPV4 出现了 10.0.3.248:容器分到了一个内网 IP 地址

恭喜你,你的第一个容器成功跑起来了!

7、第五步:查看容器详细信息

咱们来扒一扒这个容器到底用了多少资源。

7.1 查看详细运行信息

在哪操作 :宿主机终端 执行命令

bash 复制代码
lxc-info -n lxchost1

做了什么:查看指定容器的详细状态数据

预期效果:你会看到一整套数据,咱们一个个解释:

bash 复制代码
Name:           lxchost1    # 容器名字
State:          RUNNING     # 运行状态
PID:            282127      # 容器一号进程在宿主机上的 PID 号
IP:             10.0.3.248  # 容器 IP 地址
CPU use:        0.59 seconds  # 累计用了多久 CPU
BlkIO use:      29.45 MiB    # 磁盘读写了多少数据
Memory use:     59.52 MiB    # 占用了多少内存
KMem use:       6.82 MiB     # 内核内存占用
Link:           vethbg8LKH   # 虚拟网卡名字
TX bytes:       1.73 KiB     # 发出去了多少数据
RX bytes:       6.61 KiB     # 收到了多少数据

是不是很神奇?宿主机清清楚楚地盯着这个容器用了多少资源,这就是 Cgroups 在干活。

8、第六步:钻进容器里,体验 "独立世界"

现在咱们进到容器里面去,亲身体验一下 "我就是一整台机器" 的错觉。

进入容器有两种方式,咱们都试试。

8.1 方式一:SSH 远程登录进去

这是最有 "远程服务器" 感觉的方式。

在哪操作 :宿主机终端 执行命令

bash 复制代码
ssh ubuntu@10.0.3.248

做了什么:用 ssh 命令连接容器的 IP 地址,用户名是 ubuntu

预期效果 :提示你输入密码,输入 ubuntu 回车。

登录成功后,你会发现命令提示符变了,变成了 ubuntu@lxchost1:~$。恭喜你,现在你已经身在容器之中了!

8.1.1 体验一:看看容器里的网络

在哪操作 :容器内部终端(刚 SSH 进去的这个窗口) 执行命令

bash 复制代码
ip addr

做了什么:查看容器里的网卡和 IP

预期效果:你会看到容器只有两块网卡:一个本地回环 lo,一个 eth0 网卡,IP 就是 10.0.3.248。它完全不知道宿主机还有多少块网卡。

8.1.2 体验二:看看容器里的进程

在哪操作 :容器内部终端 执行命令

bash 复制代码
ps -ef

做了什么:列出容器里所有正在运行的进程

预期效果 :你会发现进程号从 1 开始,一号进程是 /sbin/init。整个容器里也就十几个进程,它完全看不到宿主机上那上百个进程。

这就是 PID Namespace 的魔力 ------ 给你造一套全新的进程号体系,让你以为自己是系统一号进程。

8.1.3 体验三:看看容器里的文件系统

在哪操作 :容器内部终端 执行命令

bash 复制代码
ls /

做了什么:查看根目录下的文件

预期效果:你会看到 bin、boot、dev、etc、home 这些标准 Linux 目录,和一台真实的 Ubuntu 机器一模一样。

再看看磁盘:

bash 复制代码
df -h

你会看到根分区大小和宿主机一样,但这是共享宿主机的磁盘。以后我们可以通过配置限制容器最多用多少磁盘空间。

8.1.4 体验四:看看主机名

在哪操作 :容器内部终端 执行命令

bash 复制代码
hostname

做了什么:查看当前主机名

预期效果 :输出 lxchost1,就是你创建容器时起的名字。容器以为自己叫这个,完全不知道宿主机真名叫啥。

这就是 UTS Namespace 在起作用。

8.1.5 退出容器

体验完了,输入 exit 回车,就回到宿主机终端了。

8.2 方式二:用 lxc-attach 直接钻进去

除了 SSH,还有一种更直接的方式,不用输密码,一步到位。

在哪操作 :宿主机终端 执行命令

bash 复制代码
lxc-attach -n lxchost1

做了什么:直接进入指定容器,默认以 root 身份打开一个 shell

预期效果:提示符直接变成容器内的 root 提示符,你已经在容器里了。

咱们在容器里执行一条命令试试:

bash 复制代码
echo "Hello bit"

预期效果 :屏幕输出 Hello bit

输入 exit 退回宿主机。

小技巧:还可以不进去,直接在外面让容器执行命令:

bash 复制代码
lxc-attach -n lxchost1 --clear-env -- echo "Hello bit"

效果是一样的,适合写脚本的时候用。

9、第七步:停止和删除容器

玩够了咱们收拾一下,有始有终。

9.1 停止容器

在哪操作 :宿主机终端 执行命令

bash 复制代码
lxc-stop -n lxchost1

做了什么:优雅地关闭容器,相当于正常关机

验证一下

bash 复制代码
lxc-ls -f

预期效果 :STATE 又变回了 STOPPED,IP 地址也消失了。

9.2 删除容器

注意:容器必须是停止状态才能删,正在运行的删不掉。

在哪操作 :宿主机终端 执行命令

bash 复制代码
lxc-destroy -n lxchost1

做了什么:彻底删除容器,包括它的 rootfs 和配置文件,全部清干净

验证一下

bash 复制代码
lxc-ls -f

预期效果:什么都不输出,空空如也,说明容器已经被完全删除了。

10、复盘总结:你到底学会了啥?

敲了这么多命令,咱们回头捋一捋,把知识点串起来。

10.1 容器隔离的本质

今天你亲手验证了 Linux 容器的六大隔离:

  1. PID 隔离:容器里有自己的 1 号进程,看不到宿主机进程
  2. 网络隔离:容器有自己独立的网卡、IP、端口
  3. 主机名隔离:容器有自己的 hostname
  4. 文件系统隔离:容器有自己的根目录 /
  5. 用户隔离:容器里的 root 和宿主机的 root 不是一回事
  6. 进程间通信隔离:容器之间不能直接发消息

这六个,就是 Namespace 干的活。

10.2 资源控制的本质

你用 lxc-info 看到的 CPU、内存、磁盘 IO 使用量,背后都是 Cgroups 在统计和管控。

  • 想限制容器最多用 512M 内存?Cgroups 能做到
  • 想限制容器只能用 20% 的 CPU?Cgroups 能做到
  • 想限制容器磁盘读写速度?Cgroups 也能做到

这些就是 Linux 资源控制的核心能力,Docker、Kubernetes 这些花里胡哨的容器工具,底层全靠这俩东西撑着。

10.3 常用命令速查表

最后给你整理一份懒人清单,忘了就回来翻:

表格

命令 作用
lxc-checkconfig 检查内核是否支持容器
lxc-create -t 模板 -n 名字 创建容器
lxc-ls -f 列出所有容器状态
lxc-start -n 名字 -d 后台启动容器
lxc-info -n 名字 查看容器详细信息
lxc-attach -n 名字 进入容器
lxc-stop -n 名字 停止容器
lxc-destroy -n 名字 删除容器

写在最后

看到这里,你已经亲手完成了一次完整的 Linux 容器资源控制实战。从安装工具、检查环境、创建容器、启动、进入体验、到最后停止删除,走完全流程。

你可能会问:既然有 Docker 了,为啥还要学 LXC? 因为 Docker 是 "精装房",开箱即用但很多东西被包起来了,你看不见里面咋回事。而 LXC 是 "毛坯房",能让你清清楚楚看到容器技术最原始的样子。理解了 LXC,你再去学 Docker 就会有一种 "降维打击" 的感觉 ------ 原来不过如此嘛。

接下来你可以试着创建不同系统的容器玩玩,或者研究一下怎么给容器限制 CPU 和内存配额。Linux 的世界很大,慢慢来,你已经迈出了扎实的第一步。

相关推荐
allforgood1 小时前
管理网络安全
linux
xiaoxiangsiyan1 小时前
RHCE之2026年全套考点详解
运维·前端·网络·chrome·学习·rhce
love530love1 小时前
彻底清理 Windows 右键“打开方式“中的重复/失效程序项(PyCharm 多版本残留实战 + 自动化脚本)
运维·人工智能·windows·pycharm·jetbrains·toolbox
zhexunnb1 小时前
SAP赋能芯片封装行业,打造封测企业全链路数字化底座
运维
蓝速科技1 小时前
蓝速科技会议预约屏深度评测:为何安卓系统是智慧办公长期最优解
运维·人工智能·科技
2401_834636991 小时前
保姆级 K8s 运维:RBAC 认证 + Dashboard+Local/NFS 动态卷实战
运维·容器·kubernetes
灵晔君1 小时前
【Linux】进程控制(一)——进程创建、进程终止与进程等待
linux·c语言·算法
hyf3266332 小时前
低成本站群泛程序部署:单服务器托管百站稳定运行教程
运维·服务器·前端·搜索引擎·蜘蛛池
wsad05322 小时前
CentOS 10 上使用 Docker Compose 部署 Discuz X5.0 论坛完整教程
linux·docker·centos·discuz