无垠之码

深度剖析代码之道


和我一起学vault

现代软件之所以能够安全、稳定地运行,离不开各种机密信息Secrets的支撑。这些机密信息包括访问凭证、加密密钥、认证证书以及其他关键安全数据,是应用程序实现持续运行与安全通信的基础。 Vault提供对这类机密数据的集中化、安全化管理能力,从而降低凭据泄露风险,并为应用系统构建统一的安全控制体系。

1.安装配置


wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install vault

# /etc/vault.d/vault.hcl
ui = true

# 后端支持: 
# 1. 内置存储系统(Vault集群中节点都存储数据副本,使用RAFT共识算法保证一致性)                  支持HA
# 2. 外部存储系统(亚马逊云,google云,微软云,MYSQL,包括数据库)                            可能支持HA 
# 3. 本地文件系统                                                                     不支持HA
# 4. 内存文件系统                                                                     不支持HA

storage "file" {
  path = "/opt/vault/data"
}

listener "tcp" {
  address       = "0.0.0.0:8200"
  tls_cert_file = "/opt/vault/tls/tls.crt"
  tls_key_file  = "/opt/vault/tls/tls.key"
}

这里使用vault的默认配置。默认情况下,Vault会在8200端口开启UI界面,首次打开页面需要进行初始化,需要设置Shamir密钥共享的参数。(1.master主密钥的分片数量 2.解封阈值) 设置成功后,Vault将生成root令牌以及关于master密钥的全部分片,随后只需要输入设置阈值的数量的分片密钥即可以解封数据,开启系统。

Read more...

图解机器学习 | 0. 绪论与学习路线

A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E. ——Tom Mitchell,Machine Learning

机器学习是人工智能的一个核心分支,致力于开发算法和技术,使计算机无需进行明确的显式编程,即可从数据中自动分析规律、获取经验,并通过构建模型对未知数据进行预测或决策。

0.人工智能里程碑

  1. 20世纪70~80年代,专家系统(知识库 + 推理引擎), 人工写规则模拟专家决策, 主要问题规则爆炸,泛化能力差,知识更新成本高
  2. 2000年前后,统计学习理论成熟,数据互联网化,机器学习成为研究主流方向
  3. 2012年, 在ImageNet竞赛中,Geoffrey Hinton团队用AlexNet大幅领先传统机器学习方法,全面神经网络化,深度学习转换为主流方向

机器学习的核心目标是获取泛化能力,这里的泛化指的是学习机器在经历了训练数据集之后,能够在新出现的、未曾见过的样本或任务上准确表现的能力。

机器学习方法传统上被划分为以下几类,对应不同的学习范式:

  1. 监督学习,训练集中的目标是由人标注的,带有预期的输出标签,模型的任务是学习输入与输出之间的映射关系
  2. 无监督学习,训练集没有人为标注的结果,模型需要在没有明确答案的情况下,自主发现其中的模式或结构
  3. 强化学习,为了达成特定目标,在与环境的不断交互中逐步调整行为策略,没有直接的标签告诉它“对错”,而是通过评估每个行动后获得的回馈(正向奖励或负向惩罚)来学习最优路径

1.问题域

通常可以将机器学习待解决的问题分为以下几种类型:

1.1回归问题

通过训练数据(监督学习),寻找一个函数f(x),使得这个函数生成的预测值与实际观察到的值之间的差距最小

针对参数化模型

  1. 参数非常多,无法书面化表达,(支持向量机,深度学习)
  2. 参数少,显式函数,简单的数学等式表达(线性回归,多项式回归,Ridge岭回归,Lasso岭回归)
  3. 过程性函数,通过规则或记忆来解决问题,(决策树,随机森林,K-近邻)

其中,岭回归形式上依然是f(x)=w^Tx+b,但在寻找w的过程中加入了约束,Ridge倾向于让所有权重w都变小,但不为0,Lasso倾向于让不重要的特征权重w直接变成0,意味特征选择。

1.2分类问题

与回归问题类似,只是将输出集合限制在有限的分类集合,回归问题的一个特殊受限版本

  1. 逻辑回归,线性数值$w^Tx + b$回归,然后通过一个Sigmoid函数把数值压缩到0到1之间,代表属于某一类的概率
  2. 支持向量机
  3. 朴素贝叶斯,基于贝叶斯定理,计算在当前特征下,属于各个类别的概率(假定所有特征之间是独立的)
  4. K-近邻(KNN),新数据通过计算到K个分类的距离, 判断属于所属的类簇
  5. 决策树与随机森林

1.3聚类问题

无监督学习,只给出输入样本空间$\left\{x_i\right\}_{i=1}^n$,判断各样本属于那个类簇,相同簇样本之间具有相似的性质

Read more...

consul爱的初体验

Consul是HashiCorp研发的一款服务发现与服务治理工具,常用于分布式系统、微服务和混合云环境。服务发现,指服务启动后向Consul注册自己,其他服务通过DNS或HTTP API查询可用实例报告服务位置。服务治理,在分布式微服务架构中,对大量独立服务进行统一管理、控制和优化的一整套机制与方法。

  • 服务注册与发现
  • 配置与策略管理,内置的KV数据库可以作为运行时的轻量级配置中心功能
  • 健康检查,支持TCP|HTTP|Script|TTL心跳的健康检查,监控服务状态
  • 服务通信与路由,基于标签的选路机制(相同服务的不同版本),基于名称的选路机制(web-v${x})
  • 容错与稳定性治理,服务崩溃策略(超时,重试,熔断,限流,降级)
  • 可观测性,提供服务的指标(Metrics),日志(Logs),链路追踪(Tracing)
  • 安全与访问控制,支持服务身份验证,零信任通信

consul运行模式: [应用服务] → [Consul客户端agent] → [Consul服务集群]

1.安装与配置

与其他hashicorp产品一样,consul的安装十分简单,官方网站基本针对每种操作系统都有详细的介绍。 以ubuntu系统举例,导入hashicorp的公钥,增加官方源后,软件管理工具即可快捷安装

wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install consul

consul运行于两种模式的一种,客户端与服务器

服务器配置

# consul.hcl
datacenter = "Datacenter-0"
data_dir = "/opt/consul"        # 数据存放位置,低版本该配置不生效,默认存放在/var/lib/consul中
client_addr = "0.0.0.0"
ui_config{
  enabled = true                # 内置ui界面
}
ports {
  grpc_tls = 8502
}
server = true
bind_addr = "192.168.5.225"    # consul服务器集群通信地址,一般多3-5server端同时运行,提供高可用服务
bootstrap_expect=1
connect {
  enabled = true
  ca_provider = "consul"
}
telemetry {
  prometheus_retention_time = "72h"
  disable_hostname = true
}
acl = {
  enabled = true               # 开启访问控制,控制运行连接的consul客户端
  default_policy = "deny"      # 默认禁止
  down_policy = "extend-cache" # 客户端与服务器连接断开,允许读取本地缓存
  tokens = {
    default = "d0c24029-fcf5-e83d-7876-acc18ac247f0"  # 允许查询
  }
}

consul acl bootstrap # 创建超级权限token
export CONSUL_HTTP_TOKEN=b9e0ee65-70d7-6586-677a-f545dcb5d2b0 (简化操作,下面操作遇到权限问题,都使用根权限)

# bootstrap-token,(root-token)无限权限
# agent-token,供agent的server或client在集群里注册自身、注册服务、更新sidecar配置时使用
# policy-token,即普通token,限定权限,例如某个namespace、KV、服务或connect路由的读写权限

# 在创建具体token时,需要提前创建token的策略,即在定义token的使用范围
# agent-policy.hcl, 该策略允许所有节点可被注册和访问,允许所有服务可读
node_prefix "" {
   policy = "write"
}
service_prefix "" {
   policy = "write"
}

consul acl policy create  -name "agent-token-policy" -description "Agent Token Policy" -rules @agent-policy.hcl
consul acl token create -description "Agent Token" -policy-name "agent-token-policy"

客户端配置

Read more...

去中心化的信任模型WOT

1.信任模型


1.1中心化信任体系

信任由一个或少数几个中心权威实体提供,所有参与方默认信任该中心 在中心化的信任体系中存在明确的信任根也就是信任锚点,同时信任关系呈星型结构,身份、权限、规则由中心统一管理,用户之间不直接建立信任,而是通过中心背书

典型实现

  • PKI/CA体系HTTPS、TLS
  • Kerberos
  • OAuth/OpenID Connect
  • 企业IAM、LDAP、AD
  • 云厂商账号体系AWS/GCP/Azure

适用于企业内部系统,强合规、强治理,封闭或半封闭网络的中心化信任模型,存在明显的单点故障SPOF,单点风险,以及强控制审查的缺点。

1.2去中心化信任网络

OpenPGP不同于传统的中心化信任模型,它采用Web of Trust的去中心化信任网络,通过多方相互验证来建立和维护信任关系

  • 没有中心化机构
  • 每个用户可以签署他人公钥
  • 通过签署来建立信任链
  • 形成一个类似社交网络WOT(Web of Trust)的信任体系

OpenPGP不仅支持对原始数据的数字签名以验证其完整性与来源,更核心的特性在于支持密钥认证Key Certification——即通过对公钥-身份UID绑定关系的签署,构建去中心化的信任网

OpenPGP定义了两类概念(使用gpg --edit-key 36604E4252411821629DCC589270DF719D5C345A可以看到validity和trust属性):

签名级别:validity,表示你认为某把公钥是否真的属于这个用户

  等级:
  unknown:尚未为该密钥指定所有者信任,或信任关系尚未完成计算
  expired:信任计算失败,有可能是过期
  undefined: 没有足够的信息计算
  marginal:部分信任(Web of Trust中有限签名支持)
  full:完全信任(有多个信任签名支持)
  ultimate:终极信任
  revoked: 撤销

信任级别:trust,表示你认为这个密钥持有者是否有能力去签署其他公钥(给别人背书的能力)

  例:
  你信任Alice能签署Bob的密钥,你就把Alice标记为fully trusted
  这样Bob的密钥就可以被间接信任

2.GPG软件


91年,程序员Phil Zimmermann为了避开政府监视,开发了加密软件PGP(Pretty Good Privacy)。这个软件非常好用,迅速流传开来,成了许多程序员的必备工具。由于软件专利授权问题,98年,IETF互联网工程任务组将PGP的核心机制标准化,协议标准OpenPGP。99年GNU项目基于OpenPGP标准,实现开源,完全自由、无专利风险的软件实现GnuPG(GNU Privacy Guard)

2.1软件安装

apt install gnupg

# 配置文件介绍, GPG配置文件目录: ~/.gnupg
~/.gnupg/gpg.conf                         – 配置文件
~/.gnupg/trustdb.gpg                      – 信任库, 存储你对每个公钥的信任等级
~/.gnupg/private-keys-v1.d/               - 私钥文件, 加密保存
~/.gnupg/pubring.kbx                      - 公钥环, 存放你的公钥和导入的他人公钥
~/.gnupg/crls.d/                          - 吊销证书, 存放X.509证书的撤销列表
~/.gnupg/openpgp-revocs.d/                - 密钥撤销证书

2.2秘钥构建

在OpenPGP体系中,主密钥作为信任锚点,负责对用户身份和子密钥进行签名;实际的数据加密、签名和认证操作由用途受限的子密钥承担,从而降低主密钥暴露风险

Read more...

packer-工具使用

Packer是hashicorp公司开源的虚拟机镜像构建工具,与之类似的工具还有OpenStack diskimage-builder、AWS EC2 Image Builder,但后者只支持自家的云平台,Packer更强调平台无关性与统一的镜像构建流程,更关注系统级与基础环境的可复现构建,强调不可变的基础设施(Immutable Infrastructure)。Packer最典型的用途是制作VM镜像,如AMI-Amazon Machine Image、QCOW2、VMDK等,同时也支持Docker镜像构建,能够覆盖主流公有云、私有云以及混合云环境下的镜像构建需求,这种预制镜像Golden Image可以缩短扩容时间Auto-scaling毫秒级启动,并确保测试环境与生产环境的操作系统底座完全一致,消除"Works on my machine"的问题。

0.Packer安装


export HASHICORP_URL=https://apt.releases.hashicorp.com
wget -O- ${HASHICORP_URL}/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] ${HASHICORP_URL} $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install packer

1.基础命令


Packer和Terraform一样使用申明式语言编写(题外话:相较于命令式语言,其描述目标状态,可读性更强,易实现幂等性,易于维护、版本控制,但抽象高,调试困难,对复杂流程不友好,强依赖执行引擎能力)

peter@peter-Legion-Y9000P-IAH7H:~$ packer --help
Usage: packer [--version] [--help] <command> [<args>]

Available commands are:
    build           build image(s) from template                                        // 执行构建任务
    console         creates a console for testing variable interpolation                // 调试使用
    fix             fixes templates from old versions of packer
    fmt             Rewrites HCL2 config files to canonical format                      // 文件格式化
    hcl2_upgrade    transform a JSON template into an HCL2 configuration                // 将json结构的配置,转换为hcl语言
    init            Install missing plugins or upgrade plugins                          // 插件的安装和升级
    inspect         see components of a template
    plugins         Interact with Packer plugins and catalog
    validate        check that a template is valid                                      // 验证语法正确性           
    version         Prints the Packer version

2.简单案例


Packer通过读取并应用HCL模板文件中定义的配置来完成构建,而HCL模板以简洁的方式刻画生成构建产物所需的过程。Packer build命令接受一个参数,当参数为文件夹时,其下所有以.pkr.hcl和.pkr.json后缀的文件都将被使用HCL2格式解析。当参数是单独文件时,若文件后缀为.pkr.hcl或者.pkr.json都使用HCL2 schema解析器解析,对于不符合上述命名规则的情况,为了兼容历史配置,Packer将采用旧版仅支持JSON的配置解析方式。

Read more...

gvisor容器运行时-入门篇

在介绍gvisor相关技术架构之前,这里简单介绍一下什么是容器运行时。

0.容器运行时


根据OCI Runtime Specification的定义,容器运行时Container Runtime是指一种软件实现,负责在宿主机上创建、启动、运行并管理容器进程的整个生命周期。runc、runsc、kata-runtime等均属于OCI容器运行时规范下的具体实现,通常被称为低层Low-level容器运行时,主要负责容器进程的创建与隔离。

container-runtime

在实际系统中,这些低层运行时通常由更高层的容器运行时进行调用和管理,例如containerd或CRI-O。高层运行时负责镜像的拉取与解压、容器生命周期管理,并通过OCI或CRI接口与底层运行时协作完成容器的启动。从实现方式和安全隔离模型的不同出发,OCI容器运行时通常可以粗略分为两类:

  1. 经典底层
名称 语言 特点 使用场景
runc Go + C OCI 标准参考实现 Docker、containerd默认
crun C 轻量、高性能、低内存 适合资源受限环境(嵌入式、IoT)
runv 淘汰停止维护 Go + QEMU 支持轻量虚拟化 安全隔离要求高的场景

这里runV不是典型的OCI低层容器运行时,它更像是把VM包装成容器运行时接口的一次早期实验,现在已经废弃。

  1. 安全隔离增强型
名称 核心技术 特点 使用场景
runsc Go + 用户态内核 用户态模拟Linux系统调用,增加隔离 多租户安全容器
kata-runtime QEMU + KVM 每个容器一个轻量级 VM 高安全隔离场景
firecracker Rust + KVM 超轻量微 VM Serverless(AWS Lambda, Fargate)

在实际运行中,用户操作的docker-cli会经过dockerd调用高层运行时containerd,然后通过containerd-shim调用低层运行时如 runc、runsc 或 kata-runtime创建容器进程。 例如Docker28.02版本(不同版本可能存在差异),普通容器的调用链为:docker-cli->dockerd->containerd->containerd-shim-runc-v2->runc

1.gVisor容器运行时


相比普通容器,gVisor提供的runsc是一种安全隔离增强型容器运行时,其在容器应用软件与宿主机系统间增加隔离层。作为用户态内核,gVisor使用内存安全的golang语言实现了类Linux内核的相关接口,承载容器内进程的系统调用执行。gVisor中的OCI规范定义的容器运行时runsc,gVisor既可以快速无缝的与docker,Kubernetes对接,使得应用运行于沙箱容器中,也使用专家模式独立运行。

注意: gVisor并未完整复刻Linux内核,而是以最小可用内核接口为目标,仅实现容器运行所需的系统调用子集,其余调用要么被拒绝,要么通过受控路径转发给宿主机内核。具体信息使用runsc help syscalls查阅

Read more...

libcurl-指北针

libcurl是一个易用免费的http客户端库,其支持众多应用层传输协议,如DICT(dict://dict.org/d:computer,RFC2229定义的基于TCP的字典查询协议)、FILE、FTP, FTPS、GOPHER(诞生于1980年代末期的早期互联网协议,用于浏览和检索文本文档,已淘汰)、GOPHERS、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、MQTT、POP3、POP3S、RTMP、RTMPS、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、TELNET、TFTP、WS和WSS等协议。并且在功能特性上libcurl支持SSL证书,以及POST|PUT|FTP等上传,各种代理隧道模式,身份认证方式,文件传输中断恢复等。libcurl支持各种操作系统平台,如常见的Linux,Windows,FreeBSD, OpenBSD,甚至不常见的UnixWare, HURD, Windows, Amiga, OS/2等

接口类型


easy接口

libcurl提供简单高效同步的easy接口簇供开发者快速上手,目前大量开源软件依赖这些接口。按照libcurl的官方文档,该使用模式只需要调用curl_easy_init获取curl句柄(后续调用easy函数簇入参),再设置相关的curl句柄的options(其中必须设置CURLOPT_URL,该参数决定后续模式和对象),最后调用curl_easy_perform执行操作,如果没有后续操作,或者并不需要长连接,记得调用curl_easy_cleanup销毁句柄。


typedef CURL* (*curl_easy_init_func)();
typedef CURLcode (*curl_easy_setopt_func)(CURL*, CURLoption, ...);
typedef CURLcode (*curl_easy_perform_func)(CURL*);
typedef void (*curl_easy_cleanup_func)(CURL*);
typedef const char* (*curl_easy_strerror_func)(CURLcode errornum);
typedef struct curl_slist* (*curl_slist_append_func)(struct curl_slist* list, const char* string);
typedef void (*curl_slist_free_all_func)(struct curl_slist* list);

typedef struct {
  curl_easy_init_func init;
  curl_easy_setopt_func setopt;
  curl_easy_perform_func perform;
  curl_easy_cleanup_func cleanup;
  curl_easy_strerror_func strerror;
  curl_slist_append_func slist_append;
  curl_slist_free_all_func slist_free_all;
} CurlInterface;

int onvif_auth_lack_verify(CurlInterface *ci, int argc, const char **argv) {
  int res = -1;
  CURL *curl = NULL;

  if (argc < 1) {
    log_error("onvif_auth_lack poc verify require url");
    goto done;
  }

  const char *url = argv[0];
  onvif_auth_resp_body_t chunk = {0};

  curl = ci->init();
  if (!curl) {
    log_error("onvif_auth_lack failed to initialize curl");
    goto done;
  }

  CHECK_F2_LABEL((ci->setopt(curl, CURLOPT_URL, url) == CURLE_OK), done, "set url fail");
  CHECK_F2_LABEL((ci->setopt(curl, CURLOPT_TIMEOUT, 5L)) == CURLE_OK, done, "set timeout failed");
  CHECK_F2_LABEL((ci->setopt(curl, CURLOPT_WRITEFUNCTION, onvif_resp_callback) == CURLE_OK), done, "set write func fail");
  CHECK_F2_LABEL((ci->setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk)) == CURLE_OK, done, "set write data fail");

  CURLcode curl_res = ci->perform(curl);
  if (curl_res != CURLE_OK) {
    log_error("CURL error: %s", ci->strerror(curl_res));
    goto done;
  }

  if (memcmp(chunk.data + 2048 - 10, ONVIF_AUTH_LACK_MAGIC_STRING, 10) == 0) {
    log_trace("Vulnerability found at URL: %s", url);
  }

  res = 0;  // success
done:
  if (curl) ci->cleanup(curl);
  return res;
}

multi接口

The multi interface is the asynchronous brother in the family and it also offers multiple transfers using a single thread and more. Get a grip of how to work with it in the multi interface overview.

Read more...

出埃及记

埃及新王压迫以色列人


:1 以色列的众子,各带家眷和雅各一同来到埃及。他们的名字记在下面:
1:2 有流便、西缅、利未、犹大、
1:3 以萨迦、西布伦、便雅悯、
1:4 但、拿弗他利、迦得、亚设。
1:5 凡从雅各而生的,共有七十人;约瑟已经在埃及。
1:6 约瑟和他的弟兄,并那一代的人都死了。
1:7 以色列人生养众多,并且繁茂,极其强盛,满了那地。
1:8 有不认识约瑟的新王起来,治理埃及。
1:9 对他的百姓说:“看哪,这以色列民比我们还多,又比我们强盛。
1:10 来吧!我们不如用巧计待他们,恐怕他们多起来,日后若遇什么争战的事,就连合我们的仇敌攻击我们,离开这地去了。”
1:11 于是埃及人派督工的辖制他们,加重担苦害他们。他们为法老建造两座积货城,就是比东和兰塞。
1:12 只是越发苦害他们,他们越发多起来,越发蔓延,埃及人就因以色列人愁烦。
1:13 埃及人严严地使以色列人做工,
1:14 使他们因做苦工觉得命苦;无论是和泥,是做砖,是做田间各样的工,在一切的工上都严严地待他们。
1:15 有希伯来的两个收生婆,一名施弗拉,一名普阿。埃及王对她们说:
1:16 “你们为希伯来妇人收生,看她们临盆的时候,若是男孩,就把他杀了;若是女孩,就留她存活。”
1:17 但是收生婆敬畏 神,不照埃及王的吩咐行,竟存留男孩的性命。
1:18 埃及王召了收生婆来说:“你们为什么做这事,存留男孩的性命呢?”
1:19 收生婆对法老说:“因为希伯来妇人与埃及妇人不同,希伯来妇人本是健壮的(注:原文作"活泼的”),收生婆还没有到,她们已经生产了。"
1:20 神厚待收生婆。以色列人多起来,极其强盛。
1:21 收生婆因为敬畏 神, 神便叫她们成立家室。
1:22 法老吩咐他的众民说:“以色列人所生的男孩,你们都要丢在河里;一切的女孩,你们要存留她的性命。

qemu网络配置

0.Qemu虚拟机网络


Qemu虚拟机网络包含两部分:

  • 网络前端,提供给虚拟机的虚拟网卡部分
  • 网络后端,与虚拟网卡交互部分,实现数据包与宿主机通信
  1. the virtual network device that is provided to the guest, a PCI network card
  2. interacts with the emulated NIC, puts packets onto the host’s network

默认情况下,qemu将创建一个SLiRP网络后端,同时为虚拟机创建合适的网络前端。例如针对大多数x86虚拟机,qemu将创建e1000-pci网络前端。取消默认的网络配置,可以使用-nic none(使用-nodefaults也可以取消默认网络配置,但会影响其他设备的默认选项)。

注意,使用默认的SLiRP网络后端,ICMP协议不被支持,TCP/UDP没有影响。在SLiRP下不能使用ping测试网络联通性

通过命令行的指定的任何网络参数,Qemu要求同时提供足够的信息定义网络前端和后端。忘记指定网络前端或后端,Qemu在运行过程中会提示警告信息。例如,“Warning:netdev net0 has no peer”, “Warning: hub 0 is not connected to host network” “Warning: hub 0 with no nics” Qemu虚拟机将正常启动,但不能提供正常网络服务

1.Qemu虚拟机网卡


Qemu虚拟机支持板载和可插拔两种类型的网卡。

  • 板载网卡,板载网卡一般指主板自带的网络适配器(Onboard NIC basically means a Network interfaces controller built into the motherboard of a PC or a laptop, etc. You don’t have to insert or purchase it separately)。

    Read more...
1 of 5 Next Page