kvm网络虚拟化管理
1. Linux Bridge网桥管理
一个网桥上添加多个虚拟机,虚拟机之间是可以相互通信的的,同时虚拟机也都可以通外网。
kvm的网桥管理可以通过brctl命令
[root@localhost ~]# brctl
.......
#桥 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
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.0050562266e7 no ens33
virbr0 .5254009483b2 yes virbr0-nic
2. VLAN
LAN 表示 Local Area Network,本地局域网,通常使用 Hub 和 Switch 来连接 LAN 中的计算机。一般来说,两台计算机连入同一个 Hub 或者 Switch 时,它们就在同一个 LAN 中。
一个 LAN 表示一个广播域。 其含义是:LAN 中的所有成员都会收到任意一个成员发出的广播包。
VLAN 表示 Virtual LAN。一个带有 VLAN 功能的switch 能够将自己的端口划分出多个 LAN。计算机发出的广播包可以被同一个 LAN 中其他计算机收到,但位于其他 LAN 的计算机则无法收到。 简单地说,VLAN 将一个交换机分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的 VLAN 中。
比方说,有两组机器,Group A 和 B,我们想配置成 Group A 中的机器可以相互访问,Group B 中的机器也可以相互访问,但是 A 和 B 中的机器无法互相访问。 一种方法是使用两个交换机,A 和 B 分别接到一个交换机。 另一种方法是使用一个带 VLAN 功能的交换机,将 A 和 B 的机器分别放到不同的 VLAN 中。
VLAN 的隔离是二层上的隔离,A 和 B 无法相互访问指的是二层广播包(比如 arp)无法跨越VLAN 的边界。但在三层上(比如IP)是可以通过路由器让 A 和 B 互通的。
现在的交换机几乎都是支持 VLAN 的。 通常交换机的端口有两种配置模式: Access 和 Trunk。如下图
Access 口
access端口只允许一个VLAN通过。这些端口被打上了 VLAN 的标签,表明该端口属于哪个 VLAN。 不同 VLAN 用 VLAN ID 来区分,VLAN ID 的 范围是 1-4096。 Access 口都是直接与计算机网卡相连的,这样从该网卡出来的数据包流入 Access 口后就被打上了所在 VLAN 的标签。 Access 口只能属于一个 VLAN。
Trunk 口
假设有两个交换机 A 和 B。 A 上有 VLAN1(红)、VLAN2(黄)、VLAN3(蓝);B 上也有 VLAN1、2、3,那如何让 AB 上相同 VLAN 之间能够通信呢?
办法是将 A 和 B 连起来,而且连接 A 和 B 的端口要允许 VLAN1、2、3 三个 VLAN 的数据都能够通过。这样的端口就是Trunk口了。 VLAN1, 2, 3 的数据包在通过 Trunk 口到达对方交换机的过程中始终带着自己的VLAN 标签。
trunk端口可以允许多个VLAN通过。
3. Linux Bridge实现VLAN原理
对于物理设备来说,路由连接交换机,交换机上设置access接口实现不同的VLAN连接,设置trunk端口实现交换机之间的连接,物理机直接与这些交换机相连,但在kvm虚拟机上,如下图所示,宿主机物理网卡之上有虚拟接口eth0.10,虚拟接口就是VLAN设备,虚拟接口连接在虚拟网桥之上,在通过虚拟网卡vent0来连接虚拟机。与物理连接方式不同的是,kvm实现VLAN必须具备虚拟网卡和网
同样的,对于多个虚拟机,需要多个VLAN来连接物理网卡。
4. Linux Bridge实现VLAN
1> 检查核心是否提供VLAN功能
通过dmesg命令来查看物理配置,看是否有802字段,同时查看/proc/net/vlan目录是否存在。如果没有提供VLAN功能,该目录是不存在的。
[root@localhost ~]# dmesg | grep -i
[ 0.380228] pci ::11.0: PCI bridge to [bus ] (subtractive decode)
[ 0.380255] pci ::11.0: bridge window [io 0x2000-0x3fff]
[ 0.380281] pci ::11.0: bridge window [mem 0xfd500000-0xfdffffff]
[ 0.580240] pci ::17.6: bridge window [io 0x1000-0x0fff] to [bus ] add_size
[ 1.221802] pcieport ::15.7: irq for MSI/MSI-X
[ 1.228025] pciehp ::18.5:pcie04: Slot # AttnBtn+ PwrCtrl+ MRL- AttnInd- PwrInd- HotPlug+ Surprise- Interlock- NoCompl+ LLActRep+
[ 1.249802] hp_sw: device handler registered
[ 2.917802] systemd[]: Inserted module 'ip_tables'
若8021模块没有载入系统。则可以使用 modprobe模块组命令载入8021q模块,再利用lsmod命令查看模块是否载入到核心内。
[root@localhost ~]# modprobe 8021q
[root@localhost ~]# lsmod | grep 8021q
8021q
garp 8021q
mrp 8021q
[root@localhost ~]#
设置开机载入8021q模块(可选)
在/etc/sysconfig/modules下增加一个8021q.modules文件,文件内容为modprobe 8021q
vim /etc/sysconfig/modules/8021q.modules
modprobe 8021q
2> 安装VLAN管理工具vconfig
[root@localhost ~]# rz
[root@localhost ~]# ls
vconfig-1.9-.el7.x86_64.rpm
[root@localhost ~]# yum localinstall vconfig-1.9-.el7.x86_64.rpm -y
3> 创建VLAN接口
创建VLAN接口前,在设备上添加一块网卡,并配置为静态,在ens37这块网卡上设置VLAN。
添加网卡
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# ls
[root@localhost network-scripts]# nmtui
修改网卡配置文件
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vim ifcfg-ens37
BOOTPROTO=static #只改这一行即可
[root@localhost network-scripts]# systemctl restart network #由于无法获取ip,重启有可能起不来,由于该网卡只用作VLAN,起不来也可以
[root@localhost ~]# ip a
....
: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :0c::cc:: brd ff:ff:ff:ff:ff:ff
inet6 fe80::4d27:24e8:e097:435c/ scope link
valid_lft forever preferred_lft forever
......
添加VLAN。用命令vconfig add
[root@localhost ~]# vconfig add ens37
Added VLAN with VID == to IF -:ens37:-
[root@localhost ~]# ip a
..
: ens37.@ens37: <BROADCAST,MULTICAST,M-DOWN> mtu qdisc noop state DOWN qlen
link/ether :0c::cc:: brd ff:ff:ff:ff:ff:ff
.....
[root@localhost ~]# vconfig add ens37
Added VLAN with VID == to IF -:ens37:-
给两个VLAN端口进行配置,写入网桥brvlan
[root@localhost network-scripts]# cp ifcfg-ens37 ifcfg-ens37.
[root@localhost network-scripts]# vim ifcfg-ens37.
VLAN=yes
TYPE=vlan
PHYSDEV=ens37
VLAN_ID=
NAME=ens37.
ONBOOT=yes
ZONE=trusted
DEVICE=ens37.
BRIDGE=brvlan-
[root@localhost network-scripts]# cp ifcfg-ens37. ifcfg-ens37.
[root@localhost network-scripts]# vim ifcfg-ens37.
VLAN=yes
TYPE=vlan
PHYSDEV=ens37
VLAN_ID=
NAME=ens37.
ONBOOT=yes
ZONE=trusted
DEVICE=ens37.
BRIDGE=brvlan-
:%s///g 结果:
VLAN=yes
TYPE=vlan
PHYSDEV=ens37
VLAN_ID=
NAME=ens37.
ONBOOT=yes
ZONE=trusted
DEVICE=ens37.
BRIDGE=brvlan-
添加两块网桥
[root@localhost ~]# brctl addbr brvlan-
[root@localhost ~]# brctl addbr brvlan-
配置网桥
[root@localhost network-scripts]# vim ifcfg-brvlan-
TYPE=bridge
BOOTPROTO=static
NAME=brvlan-
DEVICE=brvlan-
ONBOOT=yes
[root@localhost network-scripts]# vim ifcfg-brvlan-
TYPE=bridge
BOOTPROTO=static
NAME=brvlan-
DEVICE=brvlan-
ONBOOT=yes
将网桥brvlan-10 接到网口ens37.10,brvlan-20 接到网口ens37.20,用命令brctl addif
[root@localhost network-scripts]# brctl addif brvlan- ens37.
[root@localhost network-scripts]# brctl addif brvlan- ens37.
重启,查看,
[root@localhost network-scripts]# systemctl stop NetworkManager
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a
: ens37.@ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue master brvlan- state UP qlen
link/ether :0c::cc:: brd ff:ff:ff:ff:ff:ff
: ens37.@ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue master brvlan- state UP qlen
link/ether :0c::cc:: brd ff:ff:ff:ff:ff:ff
: brvlan-: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue state UP qlen
link/ether :0c::cc:: brd ff:ff:ff:ff:ff:ff
inet6 fe80::20c:29ff:fecc:/ scope link
valid_lft forever preferred_lft forever
: brvlan-: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue state UP qlen
link/ether :0c::cc:: brd ff:ff:ff:ff:ff:ff
inet6 fe80::20c:29ff:fecc:/ scope link
valid_lft forever preferred_lft forever
4> 克隆虚拟机
实验会用到两台虚拟机,但由于宿主机192.168.16.3仅有一台虚拟机centos7.0,因此需要克隆一份虚拟再做实验。
克隆虚拟机的两种方式:图形界面直接克隆、代码界面利用命令 virsh -clone进行克隆。
1) 图形化界面克隆
将要克隆的虚拟机关机,右键进行克隆。
2) 命令行界面克隆
下载virt
[root@localhost ~]# mount /dev/cdrom /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost ~]# yum install virt* -y
克隆
[root@localhost ~]# virt-clone -o centos7. -n vm2 -f /var/lib/libvirt/vm2.qcow2
成功克隆 'vm2'。
查看
[root@localhost ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- centos7. 关闭
- vm1 关闭
- vm2 关闭
5> 虚拟机连接网桥
VM1连brvlan-10,VM2连brvlan-20
6> 开启两台虚拟机。此时我们的框架已经搭好了。
7> 测试两台虚拟机是否能通信
为了能够测试,先手动给两个虚拟机设置ip
vm1:10.10.10.10 ;vm2:10.10.10.20
此时两台虚拟机是互不相通的,因为brvlan-10和brvlan-20不在同一个网段,将其改到以同一个网段再测试
若两台虚拟机想通外网,只需加一块网卡即可
由于在配置文件/etc/resove.conf含有域名解析,因此能访问百度。
5. 网卡配置bond(绑定)
1>
网卡bond(绑定),也称作网卡捆绑。就是将两个或者更多的物理网卡绑定成一个虚拟网卡。网卡是通过把多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在应用部署中是一种常用的技术。
多网卡绑定实际上需要提供一个额外的软件的bond驱动程序实现。通过驱动程序可以将多块网卡屏蔽。对TCP/IP协议层只存在一个Bond网卡,在Bond程序中实现网络流量的负载均衡,即将一个网络请求重定位到不同的网卡上,来提高总体网络的可用性。
2> 网卡绑定的目的
提高网卡的吞吐量。
增强网络的高可用,同时也能实现负载均衡。
3> 网卡配置bond(绑定)bond模式:
1)Mode=0(balance-rr) 表示负载分担round-robin,平衡轮询策略,具有负载平衡和容错功能;
bond的网卡MAC为当前活动的网卡的MAC地址(bond0),需要交换机设置聚合模式,将多个网卡绑定为一条链路。
2)Mode=1(active-backup) 表示主备模式,具有容错功能,只有一块网卡是active,另外一块是备的standby,这时如果交换机配的是捆绑,将不能正常工作,因为交换机往两块网卡发包,有一半包是丢弃的。
3) Mode=2(balance-xor) 表示XOR Hash负载分担(异或平衡策略),具有负载平衡和容错功能。每个slave接口传输每个数据包和交换机的聚合强制不协商方式配合。(需要xmit_hash_policy)。
4) Mode=3(broadcast) 表示所有包从所有interface发出,广播策略,具有容错能力,这个不均衡,只有冗余机制...和交换机的聚合强制不协商方式配合。
5)Mode=4(802.3ad) 表示支持802.3ad协议(IEEE802.3ad 动态链接聚合) 和交换机的聚合LACP方式配合(需要xmit_hash_policy)。
6)Mode=5(balance-tlb) 适配器传输负载均衡,并行发送,无法并行接收,解决了数据发送的瓶颈。 是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave。
7) Mode=6(balance-alb) 在5的tlb基础上增加了rlb。适配器负载均衡模式并行发送,并行接收数据包。
5)和6)不需要交换机端的设置,网卡能自动聚合。4需要支持802.3ad。0,2和3理论上需要静态聚合方式,但实测中0可以通过mac地址欺骗的方式在交换机不设置的情况下不太均衡地进行接收。
常用的有三种:
mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。
mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。
mode=6:平衡负载模式,有自动备援,不必”Switch”支援及设定。
4> 以模式6为例演示bond
实验需要两台宿主机,每台宿主机需要五张网卡。
1) 添加四块网卡,并克隆一台宿主机
网卡1设置为nat模式连外网,网卡2~5设置为vmnat1仅主机模式进行bond(绑定)
克隆虚拟机
2) 解绑实验环境
先将3. linux bridge实验的ens37网卡进行解绑
1)) 关闭虚拟机,从网桥脱离网口
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 .0050563d215c no ens33
brvlan- .000c2942c3f7 no ens37.
brvlan- .000c2942c3f7 no ens37.
virbr0 .5254009483b2 yes virbr0-nic
[root@localhost ~]# brctl delif brvlan- ens37.
[root@localhost ~]# brctl delif brvlan- ens37.
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 .0050563d215c no ens33
brvlan- 8000.000000000000 no
brvlan- 8000.000000000000 no
2))删除网桥
[root@localhost ~]# brctl delbr brvlan-
bridge brvlan- is still up; can't delete it #命令行无法进行删除,使用图形化界面进行删除
[root@localhost ~]# nmtui
3)) 删除虚拟网口
[root@localhost ~]# vconfig rem ens37.
Removed VLAN -:ens37.:-
[root@localhost ~]# vconfig rem ens37.
Removed VLAN -:ens37.:-
3)将ens37、38、39、40都配置绑定为bond0
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vim ifcfg-ens37
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens37
ONBOOT=yes
MASTER=bond0
SLAVE=yes
[root@localhost network-scripts]# vim ifcfg-ens38
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens38
ONBOOT=yes
MASTER=bond0
SLAVE=yes [root@localhost network-scripts]# vim ifcfg-ens39
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens39
ONBOOT=yes
MASTER=bond0
SLAVE=yes [root@localhost network-scripts]# vim ifcfg-ens40
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens40
ONBOOT=yes
MASTER=bond0
SLAVE=yes
4) 加载bonding模块
[root@localhost network-scripts]# modprobe bonding
5) 创建bond0网卡配置文件
[root@localhost network-scripts]# vim ifcfg-bond0
DEVICE=bond0
TYPE=Bond
NAME=bond0
BONDING_MASTER=yes #设置为 绑定网卡主
BOOTPROTO=static
USERCTL=no
ONBOOT=yes
BONDING_OPTS="mode=6 miimon=100" #模式6,检测100秒网卡的状态
BRIDGE=br1
6) 配置网桥br1
[root@localhost network-scripts]# vim ifcfg-br1
TYPE=Bridge
DEVICE=br1
ONBOOT=yes
BOOTPROTO=static
NAME=br1
7) 在br1上创建虚拟网口br1.10、br1.20
[root@localhost network-scripts]# brctl addbr br1 #添加虚拟网口
[root@localhost network-scripts]# brctl addbr br2
[root@localhost network-scripts]# vconfig add br1 #添加VLAN
Added VLAN with VID == to IF -:br1:-
[root@localhost network-scripts]# vconfig add br1
Added VLAN with VID == to IF -:br1:-
[root@localhost network-scripts]# ip a
: br1: <BROADCAST,MULTICAST> mtu qdisc noop state DOWN qlen
link/ether :::::2f brd ff:ff:ff:ff:ff:ff
: br2: <BROADCAST,MULTICAST> mtu qdisc noop state DOWN qlen
link/ether :1c:df:::3a brd ff:ff:ff:ff:ff:ff
: br1.@br1: <BROADCAST,MULTICAST,M-DOWN> mtu qdisc noop state DOWN qlen
link/ether :::::2f brd ff:ff:ff:ff:ff:ff
: br1.@br1: <BROADCAST,MULTICAST,M-DOWN> mtu qdisc noop state DOWN qlen
link/ether :::::2f brd ff:ff:ff:ff:ff:ff
8) 创建虚拟网桥brvlan-10、brvlan-20
[root@localhost network-scripts]# brctl addbr brvlan-
[root@localhost network-scripts]# brctl addbr brvlan-
9) 连接虚拟网桥和VLAN接口
[root@localhost network-scripts]# brctl addif brvlan- br1.
[root@localhost network-scripts]# brctl addif brvlan- br1.
[root@localhost network-scripts]# brctl show
brvlan- 8000.62272604332f no br1.
brvlan- 8000.62272604332f no br1.
10) 配置虚拟网口
[root@localhost network-scripts]# vim ifcfg-br1.
VLAN=yes
TYPE=vlan
PHYSDEV=br1
VLAN_ID=
NAME=br1.
ONBOOT=yes
ZONE=trusted
DEVICE=br1.
BRIDGE=brvlan- [root@localhost network-scripts]# vim ifcfg-br1.
VLAN=yes
TYPE=vlan
PHYSDEV=br1
VLAN_ID=
NAME=br1.
ONBOOT=yes
ZONE=trusted
DEVICE=br1.
BRIDGE=brvlan-
11) 配置虚拟网桥
[root@localhost network-scripts]# vim ifcfg-brvlan-
TYPE=bridge
BOOTPROTO=static
NAME=brvlan-
DEVICE=brvlan-
ONBOOT=yes [root@localhost network-scripts]# vim ifcfg-brvlan-
TYPE=bridge
BOOTPROTO=static
NAME=brvlan-
DEVICE=brvlan-
ONBOOT=yes
12) 重启网络
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a
.......
: br1.@br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue master brvlan- state UP qlen
link/ether :::::2f brd ff:ff:ff:ff:ff:ff
: br1.@br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue master brvlan- state UP qlen
link/ether :::::2f brd ff:ff:ff:ff:ff:ff
13) 打开虚拟机,连接测试
修改网卡连接
用vm1 ping vm2,由于vm1处在brvlan-10而vm2处在brvlan-20,不在同一网段,因此无法ping通。
如果将vm1、vm2设置为同一个VLAN,则两台虚拟机可以ping通
kvm网络虚拟化管理的更多相关文章
- kvm网络虚拟化(vlan,bond,vlan+bond)(3)
一.Linux Bridge网桥管理 网络虚拟化是虚拟化技术中最复杂的部分,也是非常重要的资源. VM2 的虚拟网卡 vnet1 也连接到了 br0 上. 现在 VM1 和 VM2 之间可以通信,同时 ...
- KVM 网络虚拟化基础 - 每天5分钟玩转 OpenStack(9)
网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大. 但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来. 为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图 这是 Open ...
- kvm网络虚拟化
网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大. 但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来. 为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图 这是 Open ...
- KVM 网络虚拟化基础
网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大. 但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来. 为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图 这是 Open ...
- O009、KVM 网络虚拟化基础
参考https://www.cnblogs.com/CloudMan6/p/5289590.html 网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大. 但因为网络是虚拟化中非常重要的资源, ...
- 收藏 —— KVM网络虚拟化
http://www.cnblogs.com/CloudMan6/p/5240770.html http://www.cnblogs.com/CloudMan6/p/5289590.html
- [原创]KVM虚拟化管理平台的实现
KVM虚拟化管理平台的实现 源码链接:https://github.com/wsjhk/IaaS_admin.git 根据KVM虚拟化管理的要求,设计并实现网页操作管理KVM虚拟机.设计原理架构如下图 ...
- kvm虚拟化管理
虚拟化 KVM (kernel-based virtual machine) 常见的一些虚拟化的软件xen kvm vmware esx openVZ Oracle VM VirtualBox vsp ...
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(3)
继下面三篇文章完成了kvm虚拟化管理平台webvirtmgr环境的部署安装:kvm虚拟化管理平台WebVirtMgr部署-虚拟化环境安装-完整记录(0)kvm虚拟化管理平台WebVirtMgr部署-完 ...
随机推荐
- 黑马MySQL数据库学习day02 表数据CRUD 约束CRUD
/* 基础查询练习: 1.字段列表查询 当查询全部字段时,一种简便方式,使用*代替全部字段(企业中不推荐使用) 2.去除重复行 DISTINCT,注意修饰的是行,也就是整个字段列表,而不是单个字段. ...
- 51 Nod 1640 天气晴朗的魔法( Kruskall )
#include <bits/stdc++.h> typedef long long LL; using namespace std; ; struct node{ LL u,v,w; n ...
- SpringBoot | idea新建项目
1.new ----> Spring Initializr 2.设置相应文件名 3.选择需要配置
- UItableView动态行高 用这两句实现(可以自己计算数据来实现,一般在model中计算)
// 动态行高 self.tableView.rowHeight = UITableViewAutomaticDimension; // 预估行高 self.tableView.estimatedRo ...
- [题解](次短路)luogu_P2865路障(未)
好像是个不需要vis数组的次短路,跑到收敛,然而给我脑袋弄炸了......到现在还没懂.......究竟次短路应该怎么求a...... 抄题解: #include<bits/stdc++.h&g ...
- Github开源项目单
以下涉及到的数据统计与 2019 年 5 月 1 日 12 点,数据来源:https://github.com/trending/java?since=monthly . 下面的内容从 Java 学习 ...
- js获取窗口参数
window.onscroll=function getScrollTop(){ console.log(scrollTop) if(document.documentElement&& ...
- 创建Maven项目出错 pom出错
错误为 org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.a ...
- JavaScript 获取浏览器版本
//获取IE版本function GetIEVersions(){ var iejson={ isIE:false,safariVersion:0 }; var ua = navigator.user ...
- 事件对象,arguments、事件的兼容问题
一.事件对象 1.每个元素身上是天生存在的,不需要我们去定义,只需要我们给这个事件绑定一个方法,当事件触发的时候,就会执行这个方法 2.事件绑定的方法: (1).DOM0级绑定:div . oncli ...