VPS是什么?Root权限、虚拟机与共享资源详解
VPS是在共享硬件上隔离出的服务器分区,通常提供独立内存、磁盘、IP和管理员权限。本文解释Root权限、KVM与容器差异,以及资源共享限制。
什么是 VPS?
VPS(虚拟专用服务器)是数据中心一台实体计算机中的一个分区。您可以租用这个分区,并像使用自己的整台机器一样使用它。该计算机上的软件会将其划分为多个相互独立的服务器,您获得其中一个服务器:专属内存配额、专属磁盘空间、一个 IP 地址,以及在套餐限制内安装软件的管理员权限。它会持续运行,面向公网的套餐会通过互联网地址提供响应。
拆开这三个词,产品含义就很清楚了。Server 是一台持续运行并通过网络响应请求的计算机。Virtual 表示它由软件创建。您的服务器是较大实体计算机中的一个分区。Private 表示该分区仅供您使用。租用您旁边分区的用户无法看到您的文件和正在运行的程序。
如果您从未在任何设备上获得过 root 权限,最后一点最重要。VPS 会为您提供服务器环境的管理员访问权限。系统中已预先配置的内容,以及您可以修改的内容,取决于镜像、虚拟化技术和套餐。
虚拟机监控程序如何划分资源,以及哪些资源会共享
在基于虚拟机的 VPS 上,负责划分资源的程序称为虚拟机监控程序(hypervisor)。它运行在物理机上,物理机称为宿主机。它会向每个客户提供一组虚拟硬件:处理器、内存块、磁盘和网卡。操作系统安装在这组虚拟硬件上,并像拥有一台真实计算机一样启动。这个客户机系统就是您的 VPS。KVM(基于内核的虚拟机)、Xen、VMware ESXi 和 Microsoft Hyper-V 都执行此任务。OpenVZ 等容器 VPS 则使用宿主机操作系统内核中的虚拟化层,不使用独立的客户机内核。
内存和磁盘按空间划分。处理器按时间划分。这个差异解释了后续大多数令人意外的情况。分配的内存不一定已经预留了物理 RAM:KVM 支持内存超分配,宿主机也可以将客户机内存交换到磁盘。您的磁盘是宿主机存储上的文件或逻辑卷,除非您删除它,否则它始终归您使用。您的虚拟 CPU 核心实际上是指向宿主机物理核心的队列,虚拟机监控程序会调度下一个要运行的客户机。
使用一条命令即可识别检测到的虚拟化类型。
systemd-detect-virt
uname -r在 KVM VPS 上,systemd-detect-virt 会输出 kvm,这表示完整的虚拟机监控程序已启动一个仅属于您的内核。对于这些容器技术,它会输出 lxc 或 openvz。这表示您的服务器是宿主机自身操作系统中的隔离区域,并且与该主机上的其他容器共享内核;container-other 表示检测到了另一种容器环境。未检测到虚拟化时,它会输出 none。这个差异会产生实际影响,因为共享的内核无法由您更改。在共享内核的容器中,模块加载由宿主机控制,因此像WireGuard VPN 模块这样的内核功能需要宿主机提供支持。在共享内核的容器中,uname -r 通常会报告宿主机的内核版本,但不同容器运行时的行为不同:gVisor 运行容器时不与宿主机共享内核,其官方示例会报告 5.15.0-gvisor。在 KVM 服务器上,同一条命令会显示安装在您自己的客户机中的内核;您可以像在其他机器上一样升级或替换该内核。
这里的“虚拟”是什么意思?
由于服务器由软件构成,创建实例时不需要有人为您安装新的物理服务器。没有人会为您把硬件装入机架。它根据模板镜像构建,因此重建会恢复一个干净的 Ubuntu,但也会擦除现有磁盘内容。大多数服务商控制面板还支持在尝试高风险操作前创建磁盘快照、通过重启调整套餐大小,并在底层宿主机需要维护时将您的虚拟机迁移到其他硬件。
价格也源于同一个事实:一台物理机同时由多个客户付费使用,因此与租用整台服务器相比,VPS 的价格由此而来。
成本与收益相伴而来。底层硬件是共享的,因此邻居实例繁忙也会影响您。下面介绍限制的部分包含用于测量这一点的命令。
这里的“私有”是什么意思?
私有意味着隔离。需要具体说明隔离的范围。您拥有自己的根文件系统、用户账户和进程列表;基于虚拟机的 VPS 还拥有自己的内核,而 OpenVZ 容器与主机共享内核。同一主机上的其他客户无法列出您的进程或读取您的文件,因为其客户机无法访问您的内存或虚拟磁盘。虚拟机运行独立的操作系统,而共享内核的容器则在同一个操作系统内隔离用户和程序。不过,隐私隔离止于主机本身:运行 hypervisor 的人员可以随时读取您客户机的内存。要消除这一最后的隔离缺口,需要使用 VPS 上的机密计算中介绍的加密内存硬件。
共享主机的工作方式正好相反。您获得的是一台为数百个其他网站提供服务的机器上的一个目录、一个控制面板,以及服务提供商选择安装的软件。那里没有 apt install,因为安装软件包会修改整台机器,而整台机器并不属于您,您无权修改。共享主机与 VPS 的比较会详细介绍这种取舍。概括来说:共享主机租给您一个账户,而 VPS 租给您一台计算机。
逐项解读一份 VPS 规格表
每台 VPS 的规格通常都由一小组数字组成。下面以一个中端方案为例。这些数字仅用于说明,不代表报价,也不是某个日期的市场调查结果。
此图表背后的数据
[
{
"plan": "Example mid-range VPS",
"vcpu_cores": 4,
"ram_gb": 16,
"nvme_gb": 160,
"bandwidth_tb": 8,
"ipv4_addresses": 1
}
]这一行就是产品的全部信息。请从左到右阅读。
4 个 vCPU。 vCPU(虚拟中央处理器)是由虚拟机管理程序调度到宿主机处理器上的虚拟处理器。除非方案明确标注为独享,否则它只是共享处理器线程的一部分,而不是预留的处理器资源。在服务器内,nproc 通常会输出 4。它表示当前进程可用的处理器数量;CPU 亲和性和受支持的 cgroup CPU 配额可能使该值降低,而 OMP_NUM_THREADS 和 OMP_THREAD_LIMIT 分别设置其返回值的最小值和最大值,nproc --all 则统计所有已安装的处理器。lscpu 显示处理器型号名称。根据宿主机的配置,该名称可能是真实的宿主机 CPU,也可能是通用的 QEMU 型号。
16 GB RAM。 方案指定的是内存分配量或限制,但这本身不保证宿主机上为其预留了物理 RAM。free -h 以二进制单位报告可用内存,并排除内核和预留内存区域,因此比较差异前,应先确认服务商使用的是 GB 还是 GiB。超出分配量的额外内存取决于方案和虚拟化配置。
160 GB NVMe。 NVMe(非易失性内存标准)表示磁盘在宿主机内的连接方式,速度远高于旧方案使用的 SATA SSD。你的存储份额会显示为虚拟磁盘,在 KVM 下通常是 /dev/vda。df -h / 以二进制单位报告根文件系统,因此显示容量会不同于以十进制 GB 宣传的磁盘容量,同时还会排除其他分区和文件系统元数据占用的空间。可用容量还会更低,因为 ext4 默认会为 root 保留文件系统容量的 5 percent。SSD VPS 中的 SSD 实际表示什么 和 如何验证你购买的磁盘 会进一步说明这些内容。
8 TB 流量。 这是每月传输的数据量,通常只统计出站流量。它表示数据总量,端口速度则是方案单独指定的另一项参数。超过流量额度后,服务商可能收费或限速,因此在托管视频前应先阅读这一项。sudo apt install vnstat 会通过 vnstat -m 为你提供独立的流量统计,统计从安装当天开始。
1 个 IPv4 地址。 只要你租用这台服务器,该地址就归你使用。你可以将域名指向该地址,并在防火墙和服务商网络策略允许的端口上接收流量;反向 DNS 设置也取决于服务商。价格很低的方案有时会让多个客户共享一个地址,这称为 NAT VPS。此时,ip -4 addr show 会报告类似 10.0.0.5 的私有地址,入站端口也会受到限制。
下面 4 条命令可以确认你实际获得的资源。
nproc
free -h
df -h /
ip -4 addr show如果其中任何一项与规格表的差异超过上述舍入造成的范围,那么在这台机器上部署任何内容前,建议先提交支持工单。
实际使用中的 root 访问权限
root 是 Linux 中的管理员账户,用户 ID 为 0。作为 root 用户运行 id -u 时,输出为 0。root 可以为整个系统安装软件包,打开 1024 以下的端口(默认情况下,内核将这些端口保留给 root 或具有 CAP_NET_BIND_SERVICE 的进程,因此具有该能力的非 root 进程可以绑定到端口 80,而无需降低 net.ipv4.ip_unprivileged_port_start),读取和修改系统文件,也可能因一条疏忽的命令破坏整个系统;加载模块和替换内核需要控制内核,而共享内核的容器不具备这种能力。没有人会替您撤销这些操作。
实际差异很简单。在共享主机上,您需要提交支持工单来请求安装某个软件。在 VPS 上,您可以直接运行以下命令。
sudo apt update
sudo apt install -y nginx
systemctl status nginx在使用 systemd 的 Ubuntu 镜像上,安装完成后,systemctl status nginx 应输出 active (running);如果端口 80 可访问,在浏览器中打开服务器的 IP 地址应显示默认的 nginx 页面。如果状态输出 failed,请运行 journalctl -u nginx -n 50 并查看末尾几行,因为服务会记录拒绝启动的原因。常见原因是配置文件中存在拼写错误,或其他程序已经监听端口 80。
root 也是整个系统的安全边界,而访问权限通过服务器配置的登录方式获得,例如 SSH 密钥或密码。新服务器上的首次会话不应立即用于安装应用程序。请创建普通用户,将登录方式改为 SSH 密钥,并在这些端口前配置防火墙。新 VPS 上的前 10 分钟按顺序列出了这份检查清单,SSH 密钥基础介绍登录本身,ufw 防火墙基础介绍端口配置,最小权限用户介绍之后服务应以哪个用户身份运行。使用 journalctl -u ssh -f 监控 SSH 服务日志中的登录尝试。
VPS 有哪些限制?
处理器是共享的,而且可以测量共享程度。 Steal time 表示虚拟 CPU 已准备好运行,但没有获得执行时间的比例,因为虚拟机监控程序将物理核心分配给了其他客户机。
vmstat 1 5st 列表示 steal time。在共享主机上,短暂的 steal time 峰值很常见。如果您自己的进程处于空闲状态,但该数值持续为两位数,通常说明主机超额分配了资源。由于等待发生在您的服务器之外,在服务器内部进行调优无法解决这个问题。Hostinger 将 CPU steal 与其 CPU credit 系统区分开来;CPU 使用量下降且 credit 恢复到恢复阈值后,其 CPU credit policy 会恢复完整容量。在将问题归咎于邻居之前,请先阅读套餐的 CPU policy。正确测试 VPS 性能介绍了如何在向提供商反馈之前证明这一点。KVM 和 Xen 客户机都会报告 steal。对于容器,报告的数值取决于 CPU 统计信息的暴露方式,不能可靠地衡量容器受到的 CPU 限流。
内存是固定的,而且上限会突然生效。 内存耗尽且内存回收无法释放足够空间时,内核的 OOM(out of memory)killer 会选择一个进程,并使用 SIGKILL 终止它。
sudo dmesg -T | grep -i "out of memory"下面这一行可以解释一次原本看似毫无原因的中断:
Out of memory: Killed process 2412 (mysqld) total-vm:2183104kB, anon-rss:1897224kB, file-rss:0kB应用自身的日志通常完全没有记录,因为 SIGKILL 不会给进程写入任何内容的机会。请在内核日志中查找原因;容器能否访问该日志取决于主机配置。在添加 swap 文件之前,请先确认是否已配置 swap;如果使用容器 VPS,还应检查主机的相关规则。
磁盘速度快,但也是共享的。 主机的 NVMe 速度很快,但您的存储切片需要与其他所有客户机竞争输入输出操作。在低负载时段进行的基准测试,不代表同一台机器在峰值负载时的性能。
硬件不属于您,也无法由您接入设备。 您不能插入任何设备。除非套餐明确提供直通功能,否则不能使用 USB 设备、采集卡或显卡;这属于单独的产品:带 GPU 的 VPS。
它只有一份。 VPS 是一台独立的机器。主机故障可能导致您的服务器中断;提供商是否将其迁移或在其他位置重启,取决于具体服务,而应用故障转移仍需自行配置。备份由您负责,因此从 VPS 执行 restic 备份应列入部署清单。提供商快照很方便,但其保护能力取决于存储位置和保留方式;您还应保留独立备份。
支持范围止于虚拟机监控程序。 对于非托管套餐,提供商负责保持硬件、网络和虚拟化层正常运行。从操作系统开始向上的所有内容都由您负责,包括安全更新。托管与非托管主机服务的区别说明了这一界限,而在 Ubuntu 上启用无人值守升级是最值得启用的基础功能。
VPS 与容易混淆的对象有何不同
虚拟机是拥有虚拟硬件和独立操作系统内核的客户机;VPS 是一种租用的服务器产品,可以基于虚拟机或容器构建,通常带有公网地址和已连接的网络。VPC(虚拟私有云)是更大云环境中的私有网络,服务器位于其中,因此它回答的是完全不同的问题。VPS、虚拟机与 VPC 的区别会准确区分这3个术语。
专用服务器是为您保留的整台物理机,不与其他客户的客户机共享;您可以自行安装虚拟机监控程序。当 steal time 或磁盘争用成为真正的瓶颈时,专用服务器就是一种选择。VPS 与专用服务器的区别列出了决策要点。
VPN(虚拟专用网络)只是在名称中与 VPS 共享两个字母,除此之外没有其他共同点。VPN 是机器之间的加密隧道。VPS 是一台机器,而运行您自己的 VPN 是 VPS 的一种常见用途,混淆也由此产生。VPS 与 VPN 的区别会说明这两个术语的差异。
您拥有的硬件,或家中机器上运行的 Proxmox 等虚拟机监控程序,能让您控制硬件,并提供许多服务会谨慎对待的住宅网络连接。它还将宿主机本身交给您,因此在您在 Proxmox 中启用嵌套虚拟化后,客户机可以运行自己的虚拟机监控程序;租用的 VPS 也必须明确支持这一功能。Proxmox 与 VPS 的对比会权衡功耗、噪声和正常运行时间与月费之间的取舍。
VPS 上可以运行什么?
准确地说,运行的应是与 VPS 的操作系统、架构、资源以及服务商规则相匹配的软件。常见选择包括带数据库的网站、私有 VPN、游戏服务器、状态监控服务、邮件服务器、媒体库,或在笔记本电脑合上后仍可继续运行的编码代理。运行邮件服务前,必须先检查服务商政策。例如,DigitalOcean 默认会在 Droplets 上封锁 SMTP 端口 25、465 和 587。网络服务会监听端口,因此接下来值得了解 Linux 中的端口是什么;VPS 可以做什么则提供了更完整的用途列表,并说明每种用途的资源成本。
FAQ
VPS 和虚拟机是一回事吗?
VPS 是公司租给您的服务器,配有操作系统,通常还有公网 IP 地址,并按一定价格计费。它可以是拥有独立内核的虚拟机,也可以是与宿主机共享内核的容器,例如 OpenVZ VPS。这两个术语的范围不同:“虚拟机”指运行在虚拟机管理程序上的任何客户机,包括您自己笔记本电脑上的客户机;“VPS”指您购买的产品。VPC 则是另一种东西,是云服务提供商内部的私有网络,而不是服务器。
使用 VPS 需要了解 Linux 吗?
您需要了解一些,也可以在使用过程中继续学习。入门所需内容包括使用 ssh 连接,使用 cd 和 ls 浏览目录,使用 nano 编辑文件,使用 apt 安装软件,以及使用 journalctl 查看日志。非托管 VPS 默认由您自行处理更新和防火墙。如果这超出了您的需求,请比较托管方案或控制面板的价格和职责范围。
为什么我的 VPS 显示的 RAM 少于方案承诺的容量?
Linux 报告的是可用内存,而方案宣传的是分配的内存。内核映像和多个保留内存区域会在计算 free -h 中的总量前被扣除;此外,free -h 使用的二进制单位也不同于十进制 GB,因此请确认提供商使用的单位。判断差异前,请比较分配的容量、单位和保留内存。如果存在无法解释的容量缺口,建议提交支持请求。
什么是 steal time?需要担心吗?
steal time 是虚拟 CPU 已准备运行、但因虚拟机管理程序将物理 CPU 核分配给其他客户机而必须等待的时间百分比。vmstat 1 的 st 列会显示该值。在共享硬件上,steal time 短暂升高是正常现象。如果您自身负载较低时该值持续达到两位数,通常表示物理宿主机超售严重。解决方法是更换宿主机或更换方案,因为服务器内部无法控制宿主机的调度器。CPU 使用率上限也会限制性能;恢复方式遵循提供商的策略,必要时包括重建 CPU credits。
一台 VPS 可以运行多个服务吗?
可以。这正是拥有 root 的意义:该机器是通用服务器,只要内存足够,并且每个服务监听不同的端口,多个服务就可以共存。内存通常是首先遇到的限制,磁盘速度通常是第二个限制。邮件服务是一个特殊情况,因为邮件投递不仅取决于邮件服务器本身,还取决于 IP 地址的信誉和提供商的 SMTP 策略。