1. 程式人生 > >探索 OpenStack 之(7):Neutron 深入探索之 Open vSwitch (OVS) + GRE 之 Neutron節點篇

探索 OpenStack 之(7):Neutron 深入探索之 Open vSwitch (OVS) + GRE 之 Neutron節點篇

0. 測試環境

OpenStack配置:

  • tenant:三個tenant:demo,tenant-one,tenant-two
  • network:三個tenanet公用public network,每個tenant擁有自己的subnet,都有一個router連線自己的subnet到public net
  • 虛機:三個虛機,tenant-one一個,tenant-two兩個,都在compute node上

1. Neutron節點上的網路元件

可見:

  (1). 關於Neutron上的三種Agent的作用:

  • Neutron-OVS-Agent:從OVS-Plugin上接收tunnel和tunnel flow的配置,驅動OVS來建立GRE Tunnel
  • Neutron-DHCP-Agent:為每一個配置了DHCP的網路/子網配置dnsmasq,也負責把Mac地址/IP地址 資訊寫入dnsmasq dhcp lease 檔案
  • Neturon-L3-Agent:設定iptables/routing/NAT表

(2). Neutorn節點上同樣有OVS Tunnel bridge br-tun和OVS Integration bridge br-int,多了br-ex來提供外部網路連線,br-ex和物理網絡卡eth0繫結。這裡出現的一個問題是eth0的IP無法ping通,OVS提供的解決方法如下。究其原因,一塊物理乙太網卡如果作為 OpenvSwitch bridge 的一部分,則它不能擁有 IP 地址,如果有,也會完全不起作用。如果發生了上述情況,可以將 IP 地址繫結至某 OpenvSwitch “internal” 裝置來恢復網路訪問功能。

ifconfig eth0 0.0.0.0 
ifconfig br-ex 192.168.1.19

(3). Neutron使用Linux network namespace來實現tenant之間的網路隔離。本例中有三個network namespace,每個network namspace包括router,dhcp,interface,routing tables,iptable rules等。

[email protected]:/home/s1# ip netns
qdhcp-d24963da-5221-481e-adf5-fe033d6e0b4e
qrouter-e506f8fe-3260
-4880-bd06-32246225aeae qdhcp-d04a0a06-7206-4d05-9432-3443843bc199 qrouter-33e2b1bf-04cb-4811-9c58-7e03856022c1 qrouter-9ba04071-f32b-435e-8f44-e32936568102 qdhcp-0a4cd030-d951-401a-8202-937b788bea43

(4). Neutron 為每一個 network 分配一個本地的 VLAN ID,每個 network 分配一個 network namespace,該DHCP 通過一個 tap 連線在 br-int 上,該 tap 的 tag 為該 local VLAN IDH1/H2/H3埠上分佈有不同的VLAN ID。 

#在存在多個 network 的情況下,br-int 上DHCP namespace 埠的 tag 情況
       Port "tap0f45d165-9f"
            tag: 5
            Interface "tap0f45d165-9f"
                type: internal
        Port "tap89874f55-97"
            tag: 4
            Interface "tap89874f55-97"
                type: internal
        Port "tap5522533d-fe"
            tag: 3
            Interface "tap5522533d-fe"
                type: internal   
        Port "tap56c9730c-9c"
            tag: 4095
            Interface "tap56c9730c-9c"
                type: internal                            
        Port "tap1fd04a93-09"
            tag: 4095
            Interface "tap1fd04a93-09"
                type: internal
        Port "tap777c1047-ed"
            tag: 2
            Interface "tap777c1047-ed"
                type: internal  
        Port "tap3fca96e0-c6"
            tag: 1
            Interface "tap3fca96e0-c6"
                type: internal  
(5). 不知道為什麼br-ex和br-int之間還需要有直接的path。網上看到一些說法,似乎不是所有的環境都需要使用這條路徑,比如當前的環境,往外走的traffic都會經過router到br-ex,應該不會直接到從br-int到br-ex。也許是某些配置中需要用到。解釋之一是eth0是虛機網路的物理網絡卡,這麼說的話它就是必須要有的。   (6). Neutron-OVS-Agent會從Neutron db的表ml2_gre_endpoints中讀取GRE埠的資訊。如果其中出現錯誤的IP地址,Neutron上會出現錯誤的GRE Tunnel。解決方法是先刪除資料庫中的錯誤記錄,在重啟neutron-plugin-openvswitch-agent service.

1.1 br-tun OpenFlow rules

插播Mac地址的基礎知識:

  • MAC地址是乙太網二層使用的一個48bit(6位元組十六進位制數)的地址,用來標識裝置位置。MAC地址分成兩部分,前24位是組織唯一識別符號(OUI, Organizationally unique identifier),後24位由廠商自行分配。48bit的MAC地址一般用6位元組的十六進位制來表示,如XX-XX-XX-XX-XX-XX。
  • 廣播地址:FF:FF:FF:FF:FF:FF
  • 組播地址:MAC組播地址的特徵是頭8位的最低位是1。例如01:80:C2:00:00:00是一個組播地址,表示802.1d網橋多播組。網橋就是使用這個地址,相互之間交換配置資訊,執行分散式生成樹演算法,消除網路拓撲結構中的環路。
  • 單播地址:單播地址的特徵是頭8位的最低位為0。每個網絡卡出廠時被分配唯一一個單播地址,頭24位是裝置製造廠商的編號,由IEEE(電氣與電子工程師協會)分配,後24位是裝置廠商為網絡卡制定的唯一編號。例如8C-70-5A-29-3A-48 是單播地址的例子 (8C = 10001100)。

[email protected]:/home/s1# ovs-ofctl dump-flows br-tun

NXST_FLOW reply (xid=0x4):

 cookie=0x0, duration=33.236s, table=0, n_packets=0, n_bytes=0, idle_age=33, priority=1,in_port=1 actions=resubmit(,2) //從H1進來的traffic,到table 2

cookie=0x0, duration=32.131s, table=0, n_packets=0, n_bytes=0, idle_age=32, priority=1,in_port=2 actions=resubmit(,3) //從GRE埠進來的traffic,到table 3

 cookie=0x0, duration=33.178s, table=0, n_packets=6, n_bytes=480, idle_age=24, priority=0 actions=drop

 cookie=0x0, duration=33.121s, table=2, n_packets=0, n_bytes=0, idle_age=33, priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20) //目的地址為單播地址,到table 20

 cookie=0x0, duration=33.066s, table=2, n_packets=0, n_bytes=0, idle_age=33, priority=0,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,22) //目的地址為組播(包括廣播)地址,到table 22

 cookie=0x0, duration=30.614s, table=3, n_packets=0, n_bytes=0, idle_age=30, priority=1,tun_id=0x1 actions=mod_vlan_vid:1,resubmit(,10) //Tunnel 1的traffic,修改VLAN ID 為 1, 再到 table 10

 cookie=0x0, duration=29.291s, table=3, n_packets=0, n_bytes=0, idle_age=29, priority=1,tun_id=0x2 actions=mod_vlan_vid:3,resubmit(,10) //Tunnel 2的traffic,修改VLAN ID 為 2, 再到 table 10

 cookie=0x0, duration=30.241s, table=3, n_packets=0, n_bytes=0, idle_age=30, priority=1,tun_id=0x3 actions=mod_vlan_vid:2,resubmit(,10) //Tunnel 3的traffic,修改VLAN ID 為 3, 再到 table 10

 cookie=0x0, duration=33.001s, table=3, n_packets=0, n_bytes=0, idle_age=33, priority=0 actions=drop

 cookie=0x0, duration=32.932s, table=4, n_packets=0, n_bytes=0, idle_age=32, priority=0 actions=drop

 cookie=0x0, duration=32.874s, table=10, n_packets=0, n_bytes=0, idle_age=32, priority=1 actions=learn(table=20,hard_timeout=300,priority=1,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]),output:1 //學習一條新的規則新增到table 20,發到埠1,進入br-int

 cookie=0x0, duration=32.815s, table=20, n_packets=0, n_bytes=0, idle_age=32, priority=0 actions=resubmit(,22) //到table 22

 cookie=0x0, duration=29.35s, table=22, n_packets=0, n_bytes=0, idle_age=29, dl_vlan=3 actions=strip_vlan,set_tunnel:0x2,output:2

 cookie=0x0, duration=30.293s, table=22, n_packets=0, n_bytes=0, idle_age=30, dl_vlan=2 actions=strip_vlan,set_tunnel:0x3,output:2

 cookie=0x0, duration=30.682s, table=22, n_packets=0, n_bytes=0, idle_age=30, dl_vlan=1 actions=strip_vlan,set_tunnel:0x1,output:2 //以上三條rule,根據目的VLAN ID,修改Tunnel ID,並去掉VLAN ID,發到GRE埠,經過GRE Tunnel到compute node

 cookie=0x0, duration=32.752s, table=22, n_packets=0, n_bytes=0, idle_age=32, priority=0 actions=drop

總之,br-tun會:

  • 把從GRE埠來的traffic設定相應的VLAN ID,發到br-int
  • 把從br-int/patch-int來的traffic,去掉VLAN ID,設定相應的Trunne ID,經過GRE埠H1 發到Compute節點

2. Router Server

2.1 以tenant-one (有一個虛機)的router為例,先看看它的interface (略去lo)

[email protected]:/home/s1# ip netns exec qrouter-33e2b1bf-04cb-4811-9c58-7e03856022c1 ip addr
22: qr-d3d3e235-d4: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
    link/ether fa:16:3e:b3:06:e8 brd ff:ff:ff:ff:ff:ff
    inet 10.0.11.1/24 brd 10.0.11.255 scope global qr-d3d3e235-d4
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:feb3:6e8/64 scope link
       valid_lft forever preferred_lft forever
26: qg-6c06581b-bd: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
    link/ether fa:16:3e:0b:ac:82 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.114/24 brd 192.168.1.255 scope global qg-6c06581b-bd
       valid_lft forever preferred_lft forever
    inet 192.168.1.115/32 brd 192.168.1.115 scope global qg-6c06581b-bd
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe0b:ac82/64 scope link
       valid_lft forever preferred_lft forever
可見:
  • qg-6c06581b-bd 連線 br-ex
  • qr-d3d3e235-d4連線br-int

再看看它的route規則:

[email protected]:/home/s1# ip netns exec qrouter-33e2b1bf-04cb-4811-9c58-7e03856022c1 route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 qg-6c06581b-bd 

//預設路由,所有目的地址不在本網路中的traffic都要通過 qg-d3657c7f-28 interface 發到外網閘道器192.168.1.1 

10.0.11.0       0.0.0.0         255.255.255.0   U     0      0        0 qr-d3d3e235-d4 

//目的為本子網內的traffic 經過 qr-d3d3e235-d4 發到子網閘道器 10.0.11.1

192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 qg-6c06581b-bd

//目的為 192.168.1.0/24 的traffic通過 qg-6c06581b-bd 發到閘道器192.168.1.100

2.2 Neutorn Floating IP 實現原理

Router namespace中的 netfilter NAT 表負責 Neutron Floating IP 的實現。下面是tenant-two (有兩個虛機)的router的NAT表:

[email protected]:/home/s1# ip netns exec qrouter-e506f8fe-3260-4880-bd06-32246225aeae  iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N neutron-l3-agent-OUTPUT
-N neutron-l3-agent-POSTROUTING
-N neutron-l3-agent-PREROUTING
-N neutron-l3-agent-float-snat
-N neutron-l3-agent-snat
-N neutron-postrouting-bottom
-A PREROUTING -j neutron-l3-agent-PREROUTING
-A OUTPUT -j neutron-l3-agent-OUTPUT
-A POSTROUTING -j neutron-l3-agent-POSTROUTING
-A POSTROUTING -j neutron-postrouting-bottom
-A neutron-l3-agent-OUTPUT -d 192.168.1.118/32 -j DNAT --to-destination 10.0.22.200
-A neutron-l3-agent-OUTPUT -d 192.168.1.117/32 -j DNAT --to-destination 10.0.22.202
-A neutron-l3-agent-POSTROUTING ! -i qg-cba7b139-04 ! -o qg-cba7b139-04 -m conntrack ! --ctstate DNAT -j ACCEPT
-A neutron-l3-agent-PREROUTING -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697
-A neutron-l3-agent-PREROUTING -d 192.168.1.118/32 -j DNAT --to-destination 10.0.22.200
-A neutron-l3-agent-PREROUTING -d 192.168.1.117/32 -j DNAT --to-destination 10.0.22.202
-A neutron-l3-agent-float-snat -s 10.0.22.200/32 -j SNAT --to-source 192.168.1.118
-A neutron-l3-agent-float-snat -s 10.0.22.202/32 -j SNAT --to-source 192.168.1.117
-A neutron-l3-agent-snat -j neutron-l3-agent-float-snat
-A neutron-l3-agent-snat -s 10.0.22.0/24 -j SNAT --to-source 192.168.1.116
-A neutron-postrouting-bottom -j neutron-l3-agent-snat
  • SNAT (源地址轉換) 負責把從虛機來的traffic的 IP源地址 即fixed ip 10.0.22.200/202 轉化為 floating ip 192.168.1.118/117,然後該traffic被路由到 br-ex 再到外網
  • DNAT (目的地址轉換)負責把從外網來的traffic的 IP目的地址 即floating ip 192.168.1.118/117 轉化為虛機所使用的 fixed ip 10.0.22.200/202,然後該traffic被路由到br-int 再到虛機

 3. DHCP Server

每一個有DHCP的網路都在Neutron節點上有一個DHCP服務,每個DHCP Server都是一個執行在一個network namespace中的dnsmasq程序。 dnsmasq是一個用在Linux上的輕型DNS和DHCP服務,具體見 http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html.

3.1 每個DHCP在neutron host上都有一個process,其ID是qdhcp-<net id>:

nobody    2049     1  0 06:43 ?        00:00:00 dnsmasq --no-hosts --no-resolv --strict-order --bind-interfaces --interface=tap15865c29-9b --except-interface=lo --pid-file=/var/lib/neutron/dhcp/d24963da-5221-481e-adf5-fe033d6e0b4e/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/d24963da-5221-481e-adf5-fe033d6e0b4e/host --addn-hosts=/var/lib/neutron/dhcp/d24963da-5221-481e-adf5-fe033d6e0b4e/addn_hosts --dhcp-optsfile=/var/lib/neutron/dhcp/d24963da-5221-481e-adf5-fe033d6e0b4e/opts --leasefile-ro --dhcp-range=set:tag0,10.0.22.0,static,86400s --dhcp-lease-max=256 --conf-file= --domain=openstacklocal

說明:

1.  --interface=tap15865c29-9b: 該process繫結/監聽一個TAP裝置,即上圖中的 H3

2.  --dhcp-hostsfile=/var/lib/neutron/dhcp/d24963da-5221-481e-adf5-fe033d6e0b4e/host:

[email protected]:/home/s1# cat /var/lib/neutron/dhcp/d24963da-5221-481e-adf5-fe033d6e0b4e/host

fa:16:3e:4d:6b:44,host-10-0-22-201.openstacklocal,10.0.22.201 //本子網DHCP Server自己(M3)的Mac地址以及IP

fa:16:3e:79:07:5e,host-10-0-22-1.openstacklocal,10.0.22.1 //本子網Router Server ( N3) 的Mac地址,名字和 IP

fa:16:3e:bf:69:36,host-10-0-22-200.openstacklocal,10.0.22.200 //本子網虛機1的Mac地址,虛機的主機名字,虛機的fixed IP

fa:16:3e:19:65:62,host-10-0-22-202.openstacklocal,10.0.22.202 //本子網虛機2的Mac地址,虛機的主機名字,虛機的fixed IP

fa:16:3e:88:99:c1,host-10-0-0-116.openstacklocal,10.0.0.116 //子網1的DHCP Server (H1)的Mac地址,以及IP地址。那麼這裡為什麼沒H2的相應資訊?

在虛機的建立過程中,Neutron會把這些資訊(應該是從neutron db中拿到一個可用的IP地址)寫到該檔案中,這樣,當虛機使用Mac地址向DHCP Server查詢IP地址的時候,dnsmasq會讀取該檔案把IP地址返回給它。

3.2 DHCP的interface (省去lo)

[email protected]:/home/s1# ip netns exec qdhcp-0a4cd030-d951-401a-8202-937b788bea43 ip addr

18: tap6356d532-32: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default 

    link/ether fa:16:3e:88:99:c1 brd ff:ff:ff:ff:ff:ff

    inet 10.0.0.116/24 brd 10.0.0.255 scope global tap6356d532-32

       valid_lft forever preferred_lft forever

    inet6 fe80::f816:3eff:fe88:99c1/64 scope link 

       valid_lft forever preferred_lft forever

[email protected]:/home/s1# ip netns exec qdhcp-d04a0a06-7206-4d05-9432-3443843bc199 ip addr

17: tap8dfd0bd8-45: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default 

    link/ether fa:16:3e:82:fd:26 brd ff:ff:ff:ff:ff:ff

    inet 10.0.11.101/24 brd 10.0.11.255 scope global tap8dfd0bd8-45

       valid_lft forever preferred_lft forever

    inet6 fe80::f816:3eff:fe82:fd26/64 scope link 

       valid_lft forever preferred_lft forever


[email protected]:/home/s1# ip netns exec qdhcp-d24963da-5221-481e-adf5-fe033d6e0b4e ip addr 19: tap15865c29-9b: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default link/ether fa:16:3e:4d:6b:44 brd ff:ff:ff:ff:ff:ff inet 10.0.22.201/24 brd 10.0.22.255 scope global tap15865c29-9b valid_lft forever preferred_lft forever inet6 fe80::f816:3eff:fe4d:6b44/64 scope link valid_lft forever preferred_lft forever

DHCP使用fix ip range的第一個可用IP地址做為其IP地址。它的interface的MAC地址 fa:16:3e:4d:6b:44 會出現在br-tun的rules裡面。

3.3 虛機向DHCP Server申請/查詢Fixed IP

具體步驟在下一篇博文中詳細描述。

相關推薦

探索 OpenStack 7Neutron 深入探索 Open vSwitch (OVS) + GRE Neutron節點

0. 測試環境 OpenStack配置: tenant:三個tenant:demo,tenant-one,tenant-two network:三個tenanet公用public network,每個tenant擁有自己的subnet,都有一個router連線自己的subnet到public n

探索 OpenStack 8Neutron 深入探索 OVS + GRE 完整網路流程

前兩篇博文分別研究了Compute節點和Neutron節點內部的網路架構。本文通過一些典型流程案例來分析具體網路流程過程。 0. 環境 簡單總結一下: Compute 節點上由Neutron-OVS-Agent負責: br-int:每個虛機都通過一個Linux brige連到該OVS橋上

學習OpenStack6Neutron 深入學習 OVS + GRE Compute node

0.環境 OpenStack網路配置:一個tenant, 2個虛機 Type driver: GRE, Mechanism driver: OVS 一個public network: ext-net 和相應的subnet ext-subnet 一個VM network:demo-net 和相應

Java學習7同步問題生產者與消費者的問題

con runnable pop pre 標記 this auth style about 生產者生產饅頭,消費者消費饅頭。一個籃子,生產者往籃子中放饅頭,消費者從籃子中取饅頭。 /** * 這是一個籃子類 * * @author xcx * @time 2017

iptables詳解7iptables擴展udp擴展與icmp擴展

hive proto 進入 internet 根據 tar 有一個 多個 ive 前文中總結了iptables的tcp擴展模塊,此處,我們來總結一下另外兩個跟協議有關的常用的擴展模塊,udp擴展與icmp擴展。 udp擴展 我們先來說說udp擴展模塊,這個擴展模塊中能用

ApolloStudio高手7用Python輕鬆連線SQLServer/Oracle/MySQL/SQLite/MS Access等關係型資料庫

關係型資料庫,是建立在關係模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的資料。現實世界中的各種實體以及實體之間的各種聯絡均用關係模型來表示。關係模型是由埃德加·科德於1970年首先提出的,並配合“科德十二定律”。現如今雖然對此模型有一些批評意見,但它還是資料儲存的傳統標準。標

python學習7python爬蟲爬取動態載入的圖片,以百度圖片為例

前言: 前面我們爬取圖片的網站都是靜態的,在頁面中右鍵檢視原始碼就能看到網頁中圖片的位置。這樣我們用requests庫得到頁面原始碼後,再用bs4庫解析標籤即可儲存圖片到本地。 當我們在看百度圖片時,右鍵–檢查–Elements,點選箭頭,再用箭頭點選圖片時

學習OpenStack5在Mac上部署Juno版本OpenStack節點環境

0. 前沿 經過一段時間的折騰,終於在自己的Mac上裝好了Juno版本的四節點環境。這過程中,花了大量的時間,碰到了許多問題,學到不少知識,折騰過不少其實不需要折騰的東西,本文試著來對這過程做個總結。 1. 初始環境 說明: 安裝的是14.04 server 版本,裝好後: (1)修改

java程式設計師的大資料7基於檔案的資料結構

SequenceFile 介紹 由於日誌檔案中每一條日誌記錄是一行文字。如果想記錄二進位制型別,純文字是不合適的。這種情況下,Hadoop的SequenceFile類非常合適。SequenceFile可以作為小檔案容器。而HDFS和MapReduce是針

樹莓派3學習筆記77分辨率800 480顯示器配置

樹莓派、顯示器配置樹莓派3學習筆記(7):7寸(分辨率800 480)顯示器配置 樹莓派搭載分辨率為800X480的顯示器在顯示的時候可能會遇到無法全屏顯示的問題, 顯示器只有部分能夠顯示,有一部分是黑邊,對於這一種情況,我們只需進入系統的boot目錄,找到config.txt文件,或者直接在命

Windows Phone開發7當好總舵主

發的 content 數據 new 窗口 sdn 內容 str 剛才 吹完了頁面有關的話題,今天我們來聊一下頁面之間是如何導航的,在更多情況下,我們的應用程序不會只有一個頁面的,應該會有N個,就像我們做桌面應 用開發那樣,我們一個應用程序中可能不止一個窗體(極簡單的程序除外

springBoot7web開發-錯誤處理

spring boot 錯誤處理 處理方式一:實現ErrorController接口原理:Spring Boot 將所有的錯誤默認映射到/error, 實現ErrorController接口代碼:package com.example.demo.controller; import org.sp

springCloud7Ribbon實現客戶端側負載均衡-消費者整合Ribbon

spring cloud ribbon 消費者整合ribbon 一、簡介 Ribbon是Netfix發布的負載均衡器,它有助於控制HTTP和TCP客戶端的行為。為Ribbon配置服務提供者地址列表後,Ribbon就可基於某種負載均衡算法,自動地幫助服務消費者去請求。Ribbon默認為我們提供了很

七步從AngularJS菜鳥到專家7Routing

們的 cat idt pan post 好的 書簽 廣播電臺 快速 這是"AngularJS – 七步從菜鳥到專家"系列的第七篇。在第一篇,我們展示了如何開始搭建一個AngularaJS應用。在第四、五篇我們討論了Angular內建的directives。上一篇了解了se

python基礎7元祖類型賦值補充

pre 定義 index orm python 報錯 {} 兩個 子字符串 前面學了列表和字典,今天我們看一個和列表相似的類型元祖。 預習: 簡單購物車   實現打印商品詳細信息,用戶輸入商品名和購買個數,則將商品名,價格,購買個數加入購物列表,如果輸入為空或其他非法輸入則

Linux kernel中斷子系統驅動申請中斷API

思路 esc 設計師 數組 還需 申請 進一步 time num 一、前言本文主要的議題是作為一個普通的驅動工程師,在撰寫自己負責的驅動的時候,如何向Linux Kernel中的中斷子系統註冊中斷處理函數?為了理解註冊中斷的接口,必須了解一些中斷線程化(threaded i

Linux kernel的中斷子系統綜述

lock www. api cdc 電平 還需 結構 現在 ces 一、前言一個合格的linux驅動工程師需要對kernel中的中斷子系統有深刻的理解,只有這樣,在寫具體driver的時候才能:1、正確的使用linux kernel提供的的API,例如最著名的request

Python基礎7基本數據類型dict

sel open name sta allow zed items 格式 鍵值對 字典(dict):   說明:字典是另一種可變容器模型,且可存儲任意類型對象。字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括號{

《Linux學習並不難》文件/目錄管理7rmdir命令刪除空目錄

Linux 目錄 7.7 《Linux學習並不難》文件/目錄管理(7):rmdir命令刪除空目錄使用rmdir命令可以在Linux系統中刪除空目錄。命令語法:rmdir [選項] [目錄]命令中各選項的含義如表所示。選項 選項含義 -p遞歸刪除目錄,當子目錄刪除後其父目錄為空時,也一同被刪除

Linux常用操作命令7date命令顯示或設置系統日期和時間

Linux 日期 date 8.7 《Linux學習並不難》Linux常用操作命令(7):date命令顯示或設置系統日期和時間 使用date命令可以顯示和設置計算機系統的日期和時間。只有超級用戶才有權限使用date命令設置 日期和時間,而一般用戶只能使用date命令顯示日期和時間。