KVM 虚拟机磁盘扩容

一、镜像扩容 注意:需要先关闭虚拟机才能操作,+号前面有空格,后面没有空格。 qemu-img resize test.qcow2 +80G 原镜像磁盘大小20GB,扩容完成后可使用以下命令查看 qemu-img info test.qcow2 输出 image: test.qcow2 file format: qcow2 virtual size: 100G (107374182400 bytes) disk size: 885M cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: false refcount bits: 16 corrupt: false 二、Windows磁盘扩容 Windows磁盘扩容比较方便,进入 计算机管理>磁盘管理 找到新增的分区把它添加到需要的分区即可。 三、Linux磁盘扩容 启动虚拟机后,进入虚拟机控制台,使用fdisk -l命令查看磁盘信息。 Disk /dev/vda: 100 GiB, 107374182400 bytes, 209715200 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xe11f7f01 Device Boot Start End Sectors Size Id Type /dev/vda1 * 2048 2099199 2097152 1G 83 Linux /dev/vda2 2099200 41943039 39843840 19G 8e Linux LVM Disk /dev/mapper/cl-root: 17 GiB, 18249416704 bytes, 35643392 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/mapper/cl-swap: 2 GiB, 2147483648 bytes, 4194304 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes 可以看到这台虚拟机的磁盘大小已经有100GB了,但分区大小还是没有变化,只有初始大小20GB。 ...

五月 31, 2021 · 4 分钟 · dushixiang

Linux虚拟化技术KVM

在Windows平台上我们习惯于使用VmWare或者virtual box来实现虚拟化,虽然它们拥有Linux版本,但大多数企业都选择了使用KVM来做Linux平台的虚拟化,因此学习掌握KVM是一项必不可少的技能。 安装KVM 以centos为例,下面是安装KVM虚拟化的命令。 yum install -y qemu-kvm libvirt virt-install bridge-utils 这么多软件都是什么作用? 软件 作用 qemu-kvm 整合了QEMU 和 KVM 的一个软件。 libvirt 封装了QEMU的接口,可以更加方便的操作虚拟机,并且提供了很多种编程语言的SDK。 virt-install 用来创建虚拟机的命令行工具。 bridge-utils Linux网桥,用来配置虚拟机的桥接网络。 kvm、qemu、qemu-kvm和libvirt到底有什么关系? KVM(Kernel Virtual Machine)是Linux的一个内核驱动模块,它需要CPU的支持,采用硬件辅助虚拟化技术Intel-VT、AMD-V;内存相关如Intel的EPT和AMD的RVI技术,使得它能够让Linux主机成为一个Hypervisor(虚拟机监控器)。 QEMU是一个纯软件实现的虚拟机,它可以模拟CPU、内存、磁盘等其他硬件,让虚拟机认为自己底层就是硬件,其实这些都是QEMU模拟的,虚拟机的所有操作都要经过QEMU转译一层,也就导致了QEMU本身的性能较差。 qemu-kvm是QEMU整合了KVM,把CPU虚拟化和内存虚拟化交给了KVM来做,自己来模拟IO设备,例如网卡和磁盘。这一套组合拳打下来,性能损失大大降低,相较于直接使用硬件,带来的损耗大概在1%-2%之间。 libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和API。Libvirtd是一个daemon进程,可以被本地的virsh调用,也可以被远程的virsh调用,Libvirtd调用qemu-kvm操作虚拟机。 启动libvirt systemctl start libvirtd systemctl enable libvirtd 如果你不想使用命令行工具来管理虚拟机,可以安装 virt-manager 。 yum install -y virt-manager 在支持x11转发的ssh客户端(例如:MobaXterm)上可以直接输入 virt-manager 来启动。 虚拟网络类型 和vmware类型,kvm也支持多种类型的网络,主要分为三种。 NAT模式 虚拟机需要把流量发送到宿主机,宿主机器转换网络信息后再发出,外部机器无法感知到虚拟机的存在。此种方式宿主机器相当于一个路由器,因此宿主机上会有一个和虚拟机同网段的IP,并且虚拟机的网关地址是宿主机的这个IP。 主机模式 虚拟机只能互相访问,不能访问宿主机。此种方式与NAT模式类似,但它没有与虚拟机同网段的IP,因此虚拟机也不能借助于宿主机来访问外部网络。 桥接模式 虚拟机和宿主机都关联在一个网桥上,因此虚拟机可以与宿主机在同一个网段,并且外部机器可以直接访问到虚拟机,虚拟机也可以借助网桥来访问外部网络。 还有一种模式在openstack等云平台上使用较为广泛,网桥上绑定的物理网卡没有IP,对应交换机配置端口为trunk模式,虚拟机 端口连接到网桥上,并配置端口不同的VLAN tag以达到隔离和互联的目的。 NAT模式和主机模式都无需单独配置,接下来我们看下如何配置桥接网络。 配置桥接网络 物理网卡绑定到网桥上之后就会导致网络断开,因此我们需要把原IP配置到网桥上。 # 进入网卡配置文件夹 cd /etc/sysconfig/network-scripts/ # 拷贝原网卡配置文件作为桥接网卡 cp ifcfg-enp134s0f0 ifcfg-br0 修改 ifcfg-br0 中的 TYPE=Ethernet 为 TYPE=Bridge,最终效果如下: ...

五月 29, 2021 · 2 分钟 · dushixiang

Linux 环回网络接口

在开发或者调试时,我们经常需要和本地的服务器进行通信,例如启动nginx之后,在浏览器输入lcoalhost或者127.0.0.1就可以访问到本机上面的http服务。 Linux是如何访问本机IP的? 大多数操作系统都在网络层实现了环回能力,通常是使用一个虚拟的环回网络接口来实现。这个虚拟的环回网络接口看着像是一个真实的网卡,实际上是操作系统用软件模拟的,它可以通过TCP/IP与同一台主机上的其他服务进行通信,以127开头的IPv4地址就是为它保留的,主流Linux操作系统为环回网卡分配的地址都是127.0.0.1,主机名是localhost。 环回网络接口之所以被称之为环回网络接口,是因为从本机发送到本机任意一个IP的数据报文都会在网络层交给环回网络接口,不再下发到数据链路层进行处理,环回网络接口直接发送回网络层,最终交由应用层软件程序进行处理。这种方式对于性能测试非常有用,因为省去了硬件的开销,可以直接测试协议栈软件所需要的时间。 那环回网络接口是如何判断目的IP是否为本机地址的呢? 答案就是网络层在进行路由转发的时候会先查本地的路由表,发现是本机IP后交给环回网络接口。查看本地路由表的命令如下: ip route show table local 输出内容如下: broadcast 10.141.128.0 dev eth0 proto kernel scope link src 10.141.155.131 local 10.141.155.131 dev eth0 proto kernel scope host src 10.141.155.131 broadcast 10.141.191.255 dev eth0 proto kernel scope link src 10.141.155.131 broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 其中local开头的便是本地IP,dev后面是网卡名称。 ...

一月 28, 2021 · 1 分钟 · dushixiang

Linux 修改最大文件描述符

echo "fs.file-max=655350" >>/etc/sysctl.conf echo "* soft nofile 655350" >> /etc/security/limits.conf echo "* hard nofile 655350" >> /etc/security/limits.conf ulimit -n 655350

一月 11, 2021 · 1 分钟 · dushixiang

服务器不允许上网并且需要跳板机才能访问?学会使用这个工具,轻松让服务器使用yum。

前言 你是否遇到过这样的场景,服务器不能上网,但是又需要安装某个软件,面对如蛛网般杂乱的rpm包依赖关系,放弃或许是最好的选择,这样你就不必再为无法完成工作而痛苦又懊恼。 但是今天,你有了一个更好的选择。 4DNAT 4DNAT取名源自4和DNAT。这个工具工作在OSI模型的第四层传输层,同时4和for谐音,意为专门为目标地址转换而服务的工具。4DNAT使用go语言开发,具有天然的跨平台性,并且完全使用go标准库开发,没有任何的第三方依赖,编译之后只有一个二进制可执行文件。它有4种工作模式: 转发模式 接受两个参数,监听端口和目标地址,在监听端口接收到请求后会主动连接目标地址,示例: ./4dnat -forward 2222 192.168.1.100:22 监听模式 接受两个参数,监听端口1和监听端口2,并交换两个端口接收到的数据,示例: ./4dnat -listen 10000 10001 代理人模式 接受两个参数,目标地址1和目标地址2,启动后会主动连接这两个目标地址,并交换两个端口接收到的数据,示例: ./4dnat -agent 127.0.0.1:10000 127.0.0.1:22 http/https代理模式 接受两个参数或四个参数,代理类型、监听端口、证书路径和私钥路径,示例: http代理 ./4dnat -proxy http 1080 https代理 ./4dnat -proxy https 1080 server.crt server.key 使用场景 场景一 期望可以在用户电脑上直接访问目标服务器上的3306端口,跳板机器是一台Windows机器,没办法做ssh端口转发。 单向虚线箭头表示可以单向访问,反之不行。 使用4DNAT在跳板机器上执行如下命令做端口转发 # 本地监听3307端口,接收到请求后主动连接10.1.0.40的3306端口 ./4dnat -forward 3307 10.1.0.40:3306 在用户电脑上访问172.16.0.30:3307即等同于访问10.1.0.40:3306,于是就可以在用户电脑愉快的访问目标机器上的服务啦。 场景二 期望目标目标机器可以上网,如使用yum安装软件。 在用户电脑上开启一个http代理 ./4dnat -proxy http 1080 在跳板机器上使用监听模式监听两个端口,用于交换数据 ./4dnat -listen 10000 10001 在目标机器上使用监听模式监听两个端口,用于交换数据 ./4dnat -listen 20000 20001 在用户电脑上使用代理人模式主动连接两个目标地址,用于交换数据 ./4dnat -agent 127.0.0.1:1080 172.16.0.30:10000 在跳板机器上使用代理人模式主动连接两个目标地址,用于交换数据 ./4dnat -agent 127.0.0.1:10001 10.1.0.40:20000 在目标机器上修改代理 cat <<EOF >> /etc/profile http_proxy=http://127.0.0.1:20001 https_proxy=http://127.0.0.1:20001 export http_proxy https_proxy EOF source /etc/profile 在目标机器上测试访问互联网 curl https://typesafe.cn 最后奉上项目地址 https://github.com/dushixiang/4dnat ...

十一月 19, 2020 · 1 分钟 · dushixiang

Linux Bridge 详解

Linux Bridge 详解 Linux Bridge(网桥)是用纯软件实现的虚拟交换机,有着和物理交换机相同的功能,例如二层交换,MAC地址学习等。因此我们可以把tun/tap,veth pair等设备绑定到网桥上,就像是把设备连接到物理交换机上一样。此外它和veth pair、tun/tap一样,也是一种虚拟网络设备,具有虚拟设备的所有特性,例如配置IP,MAC地址等。 Linux Bridge通常是搭配KVM、docker等虚拟化技术一起使用的,用于构建虚拟网络,因为此教程不涉及虚拟化技术,我们就使用前面学习过的netns来模拟虚拟设备。 如何使用Linux Bridge? 操作网桥有多种方式,在这里我们介绍一下通过bridge-utils来操作,由于它不是Linux系统自带的工具,因此需要我们手动来安装它。 # centos yum install -y bridge-utils # ubuntu apt-get install -y bridge-utils 使用brctl help查看使用帮助 never heard of command [help] Usage: brctl [commands] commands: addbr <bridge> add bridge delbr <bridge> delete bridge addif <bridge> <device> add interface to bridge delif <bridge> <device> delete interface from bridge hairpin <bridge> <port> {on|off} turn hairpin on/off setageing <bridge> <time> set ageing time setbridgeprio <bridge> <prio> set bridge priority setfd <bridge> <time> set bridge forward delay sethello <bridge> <time> set hello time setmaxage <bridge> <time> set max message age setpathcost <bridge> <port> <cost> set path cost setportprio <bridge> <port> <prio> set port priority show [ <bridge> ] show a list of bridges showmacs <bridge> show a list of mac addrs showstp <bridge> show bridge stp info stp <bridge> {on|off} turn stp on/off 常用命令如 ...

十一月 13, 2020 · 4 分钟 · dushixiang

Linux veth pair 详解

Linux veth pair 详解 veth pair是成对出现的一种虚拟网络设备接口,一端连着网络协议栈,一端彼此相连。如下图所示: 由于它的这个特性,常常被用于构建虚拟网络拓扑。例如连接两个不同的网络命名空间(netns),连接docker容器,连接网桥(Bridge)等,其中一个很常见的案例就是OpenStack Neutron底层用它来构建非常复杂的网络拓扑。 如何使用? 创建一对veth ip link add <veth name> type veth peer name <peer name> 实验 我们改造上一节完成的netns实验,使用veth pair将两个的隔离netns连接起来。如下图所示: 我们首先创建一对veth设备,将veth设备分别移动到两个netns中并启动。 # 创建一对veth ip link add veth0 type veth peer name veth1 # 将veth移动到netns中 ip link set veth0 netns ns0 ip link set veth1 netns ns1 # 启动 ip netns exec ns0 ip link set veth0 up ip netns exec ns1 ip link set veth1 up 接下来我们测试一下。 ...

十一月 9, 2020 · 3 分钟 · dushixiang

Linux Network Namespace (netns) 详解

Network Namespace (以下简称netns)是Linux内核提供的一项实现网络隔离的功能,它能隔离多个不同的网络空间,并且各自拥有独立的网络协议栈,这其中便包括了网络接口(网卡),路由表,iptables规则等。例如大名鼎鼎的docker便是基于netns实现的网络隔离,今天我们就来手动实验一下netns的隔离特性。 使用方式 使用ip netns help查看使用帮助 Usage: ip netns list ip netns add NAME ip netns set NAME NETNSID ip [-all] netns delete [NAME] ip netns identify [PID] ip netns pids NAME ip [-all] netns exec [NAME] cmd ... ip netns monitor ip netns list-id 开始实验 我们将要构建如下图的网络 首先我们添加两个tap设备并配置上IP信息,然后添加两个netns,最后将tap设备移动到netns中 # 添加并启动虚拟网卡tap设备 ip tuntap add dev tap0 mode tap ip tuntap add dev tap1 mode tap ip link set tap0 up ip link set tap1 up # 配置IP ip addr add 10.0.0.1/24 dev tap0 ip addr add 10.0.0.2/24 dev tap1 # 添加netns ip netns add ns0 ip netns add ns1 # 将虚拟网卡tap0,tap1分别移动到ns0和ns1中 ip link set tap0 netns ns0 ip link set tap1 netns ns1 在宿主机器上使用ping 10.0.0.1测试与tap0的网络连通性 ...

十一月 8, 2020 · 3 分钟 · dushixiang

Linux tun/tap 详解

在计算机网络中,tun与tap是操作系统内核中的虚拟网络设备。不同于普通靠硬件网络适配器实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。 tun/tap是什么? tun是网络层的虚拟网络设备,可以收发第三层数据报文包,如IP封包,因此常用于一些点对点IP隧道,例如OpenVPN,IPSec等。 tap是链路层的虚拟网络设备,等同于一个以太网设备,它可以收发第二层数据报文包,如以太网数据帧。Tap最常见的用途就是做为虚拟机的网卡,因为它和普通的物理网卡更加相近,也经常用作普通机器的虚拟网卡。 如何操作tun/tap? Linux tun/tap可以通过网络接口和字符设备两种方式进行操作。 当应用程序使用标准网络接口socket API操作tun/tap设备时,和操作一个真实网卡无异。 当应用程序使用字符设备操作tun/tap设备时,字符设备即充当了用户空间和内核空间的桥梁直接读写二层或三层的数据报文。在 Linux 内核 2.6.x 之后的版本中,tun/tap 对应的字符设备文件分别为: tun:/dev/net/tun tap:/dev/tap0 当应用程序打开字符设备时,系统会自动创建对应的虚拟设备接口,一般以tunX和tapX方式命名,虚拟设备接口创建成功后,可以为其配置IP、MAC地址、路由等。当一切配置完毕,应用程序通过此字符文件设备写入IP封包或以太网数据帧,tun/tap的驱动程序会将数据报文直接发送到内核空间,内核空间收到数据后再交给系统的网络协议栈进行处理,最后网络协议栈选择合适的物理网卡将其发出,到此发送流程完成。而物理网卡收到数据报文时会交给网络协议栈进行处理,网络协议栈匹配判断之后通过tun/tap的驱动程序将数据报文原封不动的写入到字符设备上,应用程序从字符设备上读取到IP封包或以太网数据帧,最后进行相应的处理,收取流程完成。 注意:当应用程序关闭字符设备时,系统也会自动删除对应的虚拟设备接口,并且会删除掉创建的路由等信息。 tun/tap的区别 tun/tap 虽然工作原理一致,但是工作的层次不一样。 tun是三层网络设备,收发的是IP层数据包,无法处理以太网数据帧,例如OpenVPN的路由模式就是使用了tun网络设备,OpenVPN Server重新规划了一个网段,所有的客户端都会获取到该网段下的一个IP,并且会添加对应的路由规则,而客户端与目标机器产生的数据报文都要经过OpenVPN网关才能转发。 tap是二层网络设备,收发以太网数据帧,拥有MAC层的功能,可以和物理网卡通过网桥相连,组成一个二层网络。例如OpenVPN的桥接模式可以从外部打一条隧道到本地网络。进来的机器就像本地的机器一样参与通讯,丝毫看不出这些机器是在远程。如果你有使用过虚拟机的经验,桥接模式也是一种十分常见的网络方案,虚拟机会分配到和宿主机器同网段的IP,其他同网段的机器也可以通过网络访问到这台虚拟机。 使用方式 Linux 提供了一些命令行程序方便我们来创建持久化的tun/tap设备,但是如果没有应用程序打开对应的文件描述符,tun/tap的状态一直会是DOWN,还好的是这并不会影响我们把它当作普通网卡去使用。 使用ip tuntap help查看使用帮助 Usage: ip tuntap { add | del | show | list | lst | help } [ dev PHYS_DEV ] [ mode { tun | tap } ] [ user USER ] [ group GROUP ] [ one_queue ] [ pi ] [ vnet_hdr ] [ multi_queue ] [ name NAME ] Where: USER := { STRING | NUMBER } GROUP := { STRING | NUMBER } 示例 # 创建 tap ip tuntap add dev tap0 mode tap # 创建 tun ip tuntap add dev tun0 mode tun # 删除 tap ip tuntap del dev tap0 mode tap # 删除 tun ip tuntap del dev tun0 mode tun tun/tap 设备创建成功后可以当作普通的网卡一样使用,因此我们也可以通过ip link命令来操作它。 ...

十一月 8, 2020 · 1 分钟 · dushixiang