热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:neutron相关知识

本文由编程笔记#小编为大家整理,主要介绍了neutron相关知识相关的知识,希望对你有一定的参考价值。Neutron对虚拟三层网络的实现是通过其L3Agent(neut
本文由编程笔记#小编为大家整理,主要介绍了neutron相关知识相关的知识,希望对你有一定的参考价值。


Neutron 对虚拟三层网络的实现是通过其 L3 Agent (neutron-l3-agent)。该 Agent 利用 Linux IP 栈、route 和 iptables 来实现内网内不同网络内的虚机之间的网络流量,以及虚机和外网之间网络流量的路由和转发。为了在同一个Linux 系统上支持可能的 IP 地址空间重叠,它使用了 Linux network namespace 来提供隔离的转发上下文。


namespace技术

每个 netns 拥有独立的 (virtual)network devices, IP addresses, IP routing tables, /proc/net directory, ports 等等

新创建的 netns 默认只包含 loopback device(回环设备)。除了这个设备,每个 network device,不管是物理的还是虚拟的网卡还是网桥等,都只能存在于一个 netns。而且,连接物理硬件的物理设备只能存在于 root netns。其它普通的网络设备可以被创建和添加到某个 netns。

[[email protected] ~]# ip netns add test_namespace
[[email protected] ~]# ip netns
test_namespace
[[email protected] ~]# ip netns list
test_namespace
[[email protected] ~]# ip netns exec test_namespace bash
[[email protected] ~]# ip a
1: lo: mtu 65536 qdisc noop state DOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
[[email protected] ~]#

添加 virtual interfaces 到 network namespace

[[email protected] ~]# ip link add veth-a type veth peer name veth-b#创建一对虚拟网卡veth-a 和 veth-b,两者由一根虚拟网线连接
[[email protected] ~]# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:0f:09:89 brd ff:ff:ff:ff:ff:ff
inet 192.168.246.138/24 brd 192.168.246.255 scope global dynamic ens33
valid_lft 1225637sec preferred_lft 1225637sec
inet6 fe80::20c:29ff:fe0f:989/64 scope link
valid_lft forever preferred_lft forever
3: [email protected]: mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 7e:75:c5:5a:70:0b brd ff:ff:ff:ff:ff:ff
4: [email protected]: mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 12:10:96:02:4c:f0 brd ff:ff:ff:ff:ff:ff

将 veth-b 添加到 network namespace

[[email protected] ~]# ip link set veth-b netns netns1
[[email protected] ~]# ip netns exec netns1 bash
[[email protected] ~]# ip a
1: lo: mtu 65536 qdisc noop state DOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: [email protected]: mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 7e:75:c5:5a:70:0b brd ff:ff:ff:ff:ff:ff link-netnsid 0
[[email protected] ~]#

Linux下的IP设备已经少了一个

[[email protected] ~]# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:0f:09:89 brd ff:ff:ff:ff:ff:ff
inet 192.168.246.138/24 brd 192.168.246.255 scope global dynamic ens33
valid_lft 1224076sec preferred_lft 1224076sec
inet6 fe80::20c:29ff:fe0f:989/64 scope link
valid_lft forever preferred_lft forever
4: [email protected]: mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 12:10:96:02:4c:f0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
[[email protected] ~]#

设置namespace的IP地址

[[email protected] ~]# ip addr add 10.0.0.2/24 dev veth-b
[[email protected] ~]# ip link set dev veth-b up
[[email protected] ~]# ip a
1: lo: mtu 65536 qdisc noop state DOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: [email protected]: mtu 1500 qdisc noqueue state LOWERLAYERDOWN qlen 1000
link/ether 7e:75:c5:5a:70:0b brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.0.2/24 scope global veth-b
valid_lft forever preferred_lft forever
[[email protected] ~]#

设置Linux下的vth-a的IP地址

[[email protected] ~]# ip addr add 10.0.0.1/24 dev veth-a
[[email protected] ~]# ip link set dev veth-a up
[[email protected] ~]# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:0f:09:89 brd ff:ff:ff:ff:ff:ff
inet 192.168.246.138/24 brd 192.168.246.255 scope global dynamic ens33
valid_lft 1223891sec preferred_lft 1223891sec
inet6 fe80::20c:29ff:fe0f:989/64 scope link
valid_lft forever preferred_lft forever
4: [email protected]: mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 12:10:96:02:4c:f0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.0.1/24 scope global veth-a
valid_lft forever preferred_lft forever
inet6 fe80::1010:96ff:fe02:4cf0/64 scope link
valid_lft forever preferred_lft forever
[[email protected] ~]#

ping

[[email protected] ~]# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.065 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.038 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.072 m

查看路由表和IPtables

[[email protected] ~]# ip netns exec netns1 bash
[[email protected] ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 veth-b
[[email protected] ~]# iptables -F
[[email protected] ~]#

Iptables

?Neutron 主要用到 filter 表和 nat 表,其中, filter 用来实现安全组(Security Group)和 防火墙(FWaas);nat 主要用来实现 router。

技术分享图片

INPUT

可见在INPUT接受所有的数据包

[[email protected] ~]# iptables --line-numbers -vnL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 neutron-l3-agent-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0
[[email protected] ~]# iptables --line-numbers -vnL neutron-l3-agent-INPUT
Chain neutron-l3-agent-INPUT (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x1/0xffff
2 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8775
[[email protected] ~]#

OUTPUT

[[email protected] ~]# iptables --line-numbers -vnL OUTPUT
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 neutron-filter-top all -- * * 0.0.0.0/0 0.0.0.0/0
2 0 0 neutron-l3-agent-OUTPUT all -- * * 0.0.0.0/0 0.0.0.0/0
[[email protected] ~]# iptables --line-numbers -vnL neutron-filter-top
Chain neutron-filter-top (2 references)
num pkts bytes target prot opt in out source destination
1 0 0 neutron-l3-agent-local all -- * * 0.0.0.0/0 0.0.0.0/0
[[email protected] ~]# iptables --line-numbers -vnL neutron-l3-agent-local
Chain neutron-l3-agent-local (1 references)
num pkts bytes target prot opt in out source destination
[[email protected] ~]# iptables --line-numbers -vnL neutron-l3-agent-OUTPUT
Chain neutron-l3-agent-OUTPUT (1 references)
num pkts bytes target prot opt in out source destination
[[email protected] ~]#

OUTPUT链没有什么规则


FORWARD

[[email protected] ~]# iptables --line-numbers -vnL FORWARD
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 neutron-filter-top all -- * * 0.0.0.0/0 0.0.0.0/0
2 0 0 neutron-l3-agent-FORWARD all -- * * 0.0.0.0/0 0.0.0.0/0
[[email protected] ~]# iptables --line-numbers -vnL neutron-filter-top
Chain neutron-filter-top (2 references)
num pkts bytes target prot opt in out source destination
1 0 0 neutron-l3-agent-local all -- * * 0.0.0.0/0 0.0.0.0/0
[[email protected] ~]# iptables --line-numbers -vnL neutron-l3-agent-local
Chain neutron-l3-agent-local (1 references)
num pkts bytes target prot opt in out source destination
[[email protected] ~]# iptables --line-numbers -vnL neutron-l3-agent-FORWARD
Chain neutron-l3-agent-FORWARD (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 neutron-l3-agent-iv4a7700495 all -- * qr-+ 0.0.0.0/0 0.0.0.0/0
2 0 0 neutron-l3-agent-ov4a7700495 all -- qr-+ * 0.0.0.0/0 0.0.0.0/0
3 0 0 neutron-l3-agent-fwaas-defau all -- * qr-+ 0.0.0.0/0 0.0.0.0/0
4 0 0 neutron-l3-agent-fwaas-defau all -- qr-+ * 0.0.0.0/0 0.0.0.0/0
在之前没有创建防火墙规则之前只有neutron-l3-agent-fwaas-defau两条规则 一进一出
[[email protected] ~]# iptables --line-numbers -vnL neutron-l3-agent-iv4a7700495
Chain neutron-l3-agent-iv4a7700495 (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
2 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 0 0 DROP tcp -- * * 2.2.2.0/24 3.3.3.0/24 tcp dpts:1:65535
4 0 0 DROP icmp -- * * 10.0.0.0/24 0.0.0.0/0
[[email protected] ~]# iptables --line-numbers -vnL neutron-l3-agent-ov4a7700495
Chain neutron-l3-agent-ov4a7700495 (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
2 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 0 0 DROP tcp -- * * 2.2.2.0/24 3.3.3.0/24 tcp dpts:1:65535
4 0 0 DROP icmp -- * * 10.0.0.0/24 0.0.0.0/0
一条规则下发后分别存在进出两条规则在router中,即neutron-l3-agent-iv4a7700495 ,neutron-l3-agent-ov4a7700495 ,用于进数据网络的包的默认处理和出数据网络的包的默认处理。 neutron-l3-agent-fwaas-defau用于默认丢弃没有被以上规则处理的所有包。

所以默认neutron是丢弃所有的数据包


lbaas分析


haproxy

haproxy 配置中分成五部分内容,分别如下: global:参数是进程级的,通常是和操作系统相关。这些参数一般只设置一次,如果配置无误,就不需要再次进行修改。 defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件。 frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend。 backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器。 Listen Fronted和backend的组合体。

LBaasv2 可以看做 OpenStack Neutron 对各种物理负载均衡器的虚拟化。它的概念可以和 HAProxy 中的概念进行类比:





































HAProxy 的概念LBaasv2 的概念说明
DriverLBaas v2也是采取 driver 模型来支持多种物理的负载均衡器。LBaasv2 默认实现了 HAProxy driver,同时,它也支持多个其他 Vendor driver。厂商驱动
FrontendListenerLBaasv2采用Listener方式将流量转移到不同的pool中的member。
BackendPool代表Listener所监听的负载后端的虚拟机池。
Backend serverMemberMember 对应的是 pool 里面处理网络请求的一个 OpenStack Nova 虚机
Health checkHealth monitor它用来监测 pool 里面 member 的状态,支持 HTTP, TCP, 和 ping 等多种检测方法。在 Nuetron 中这是可选的,如果没有 Health monitor,pool 会一直认为所有的 member 都是 ACTIVE 状态,这样所有的 member 会一直出现在 VIP 的分发列表中,哪怕 member 对应的实例不能响应网络请求。这在实际应用中会造成负载均衡的响应异常。

neutron-lbaas

技术分享图片

网络节点上,neutron-lbaas-agent

(1)为每个带有 active VIP 的 pool 创建了一个 network namespace,它以 qlbaas-

命名

技术分享图片

(2)该 interface 挂载 OVS br-int 上并被打上了它所在的 network(pool -> subnet -> network) 对应的本地 VLAN ID:

技术分享图片

(3) ps -elf | grep -v agent | grep haproxy

技术分享图片

(4) 根据步骤4查看haproxy.conf 如 /var/lib/neutron/lbaas/v2/5735af3c-11bc-49b6-a3e1-dc1c1b4ebd37

技术分享图片


floating IP原理

当 router 接收到 instance 的数据包,并将其转发到外网时: router 会修改包的源地址为自己的外网地址,这样确保数据包转发到外网,并能够从外网返回。 router 修改返回的数据包,并转发给真正的 instance。 这个行为被称作 Source NAT。

floating IP 提供静态 NAT 功能,建立外网 IP 与 instance 租户网络 IP 的一对一映射。

floating IP 是配置在 router 提供网关的外网 interface 上的,而非 instance 中。

router 会根据通信的方向修改数据包的源或者目的地址。

进入路由的namespace iptables -t nat -S 查看nat表

技术分享图片

技术分享图片


DHCP

neutron dhcp为租户网络提供DHCP服务,即IP地址动态分配,另外还会提供metadata请求服务。

3个主要的部件:

DHCP agent scheduler:负责DHCP agent与network的调度。

DHCP agent:为租户网络提供DHCP的功能,提供metadata request服务。

DHCP driver:即dnsmasq,用于管理DHCP server。

Dnsmasq 是被 Neutron 用来提供 DHCP 和 DNS 服务的一个开源程序,即DHCP driver部分。它提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为DHCP 服务器,dnsmasq 可以为局域网电脑提供内网ip地址和路由。DNS和DHCP两个功能可以同时或分别单独实现。dnsmasq轻量且易配置,适用于主机较少的网络。

根据整个dhcp处理的流程,dhcp模块主要由Neutron api、core plugin(如linux bridge plugin,ovs plugin等)、dhcp agent scheduler、dhcp agent、dhcp driver(dnsmasq)构成。

技术分享图片

对应架构图中数字,有以下几个接口: 1.network/subnet/port的操作 2.agent management/agent scheduler的操作 3.network/subnet/port操作会发送rpc请求到dhcp agent。 4.agentscheduler db发送rpc请求到dhcp agent。 5.dhcp agent通过DhcpPluginApi发送rpc请求到core plugin,操作相应的数据库。 6.dhcp agent调用dhcp driver进行dhcp相关操作。

虚机获取固定IP (Fixed IP)主要分为两个步骤:

在创建虚机过程中,Neutron 随机生成 MAC 和 从配置数据中分配一个固定IP 地址,并保存到 Dnsmasq 的 hosts 文件中,让 Dnsmasq 做好准备。

虚机在启动时向 Dnsmasq 获取 IP 地址

红色为创建虚拟机的数据流

绿色为虚拟机启动的数据流

技术分享图片

创建虚机时的数据流

Controller 节点上的 Neutron Server 接到该请求后,会开始下面的过程

技术分享图片

步骤 2 ~ 6:Neutron Server 生成 MAC 和 IP。 其中 MAC 是由任意数组成的;Fixed IP 是从保存在数据库中的管理员配置的网络和地址数据生成的。

步骤 7 ~ 10: 调用 L3 Agent 和 OVS 执行一些操作。

步骤 12 ~ 14:通过 AMQP 的 cast 消息给 Neutron 节点上的 DHCP Agent,告诉它 Port 创建结束以及 新分配的 Port 的数据。

步骤 13:返回Port 给 nova-compute。

步骤 15:Neturon 节点上的 DHCP Agent 根据接收到的 Port 创建完成通知,重新生成 Dnsmasq 的 hosts 文件,然后让 Dnsmasq 重新加载该文件。Nova 拿到 Port 的数据后,会写入虚机的 libvirt.xml 文件。


安全组

技术分享图片

其中id的前10位数字被用作虚机对外连接的qbr(同时也是tap口)的id。i或o加上前9位数字被用作安全组chain的id。所有的规则默认都在Compute节点上的filter表(默认表)中实现,分别来查看filter表的INPUT、OUTPUT、FORWARD三条链上的规则。

技术分享图片

跟安全组相关的规则被重定向到neutron-openvswi-INPUT。 查看其规则,只有一条

技术分享图片

技术分享图片

某个vm的安全组相关规则的chain的名字,跟vm的id的前9个字符有关。

因此,要快速查找qbr-XXX上相关的iptables规则,可以用iptables -S列出(默认是filter表)所有链上的规则,其中含有id的链即为虚拟机相关的安全组规则。其中–physdev-in表示即将进入某个网桥的端口,–physdev-out表示即将从某个网桥端口发出。

iptables -S | grep tap4ca9818f-53

参考:http://www.cnblogs.com/wanstack/tag/Neutron/


推荐阅读
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文主要介绍了gym102222KVertex Covers(高维前缀和,meet in the middle)相关的知识,包括题意、思路和解题代码。题目给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,要求所有点覆盖的权值之和膜qn小于等于36。文章详细介绍了解题思路,通过将图分成两个点数接近的点集L和R,并分别枚举子集S和T,判断S和T能否覆盖所有内部的边。文章还提到了使用位运算加速判断覆盖和推导T'的方法。最后给出了解题的代码。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了源码分析--ConcurrentHashMap与HashTable(JDK1.8)相关的知识,希望对你有一定的参考价值。  Concu ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
author-avatar
冷尔岚钰_820
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有