1. 程式人生 > >【網路整理】udev 詳解

【網路整理】udev 詳解

如果你使用Linux比較長時間了,那你就知道,在對待裝置檔案這塊,Linux改變了幾次策略。在Linux早期,裝置檔案僅僅是是一些帶有適當的屬性 集的普通檔案,它由mknod命令建立,檔案存放在/dev目錄下。後來,採用了devfs,一個基於核心的動態裝置檔案系統,他首次出現在2.3.46 核心中。Mandrake,Gentoo等Linux分發版本採用了這種方式。devfs建立的裝置檔案是動態的。但是devfs有一些嚴重的限制,從 2.6.13版本後移走了。目前取代他的便是文字要提到的udev--一個使用者空間程式。

目前很多的Linux分發版本採納了udev的方式,因為它在Linux裝置訪問,特別是那些對裝置有極端需求的站點(比如需要控制上千個硬碟)和熱插拔 裝置(比如USB攝像頭和MP3播放器)上解決了幾個問題。下面我我們來看看如何管理udev裝置。

實際上,對於那些為磁碟,終端裝置等準備的標準配置檔案而言,你不需要修改什麼。但是,你需要了解udev配置來使用新的或者外來裝置,如果不修改配置, 這些裝置可能無法訪問,或者說Linux可能會採用不恰當的名字,屬組或許可權來建立這些裝置檔案。你可能也想知道如何修改RS-232串列埠,音訊裝置等文 件的屬組或者許可權。這點在實際的Linux實施中是會遇到的。


為什麼使用udev


在此之前的裝置檔案管理方法(靜態檔案和devfs)有幾個缺點:

* 不確定的裝置對映。特別是那些動態裝置,比如USB裝置,裝置檔案到實際裝置的對映並不可靠和確定。舉一個例子:如果你有兩個USB印表機。一個可能稱為 /dev/usb/lp0,另外一個便是/dev/usb/lp1。但是到底哪個是哪個並不清楚,lp0,lp1和實際的裝置沒有一一對應的關係,因為他 可能因為發現裝置的順序,印表機本身關閉等原因而導致這種對映並不確定。理想的方式應該是:兩個印表機應該採用基於他們的序列號或者其他標識資訊的唯一設 備檔案來對映。但是靜態檔案和devfs都無法做到這點。

*沒有足夠的主/輔裝置號。我們知道,每一個裝置檔案是有兩個8位的數字:一個是主裝置號 ,另外一個是輔裝置號來分配的。這兩個8位的數字加上裝置型別(塊裝置或者字元裝置)來唯一標識一個裝置。不幸的是,關聯這些身邊的的數字並不足夠。

*/dev目錄下檔案太多。一個系統採用靜態裝置檔案關聯的方式,那麼這個目錄下的檔案必然是足夠多。而同時你又不知道在你的系統上到底有那些裝置檔案是啟用的。

*命名不夠靈活。儘管devfs解決了以前的一些問題,但是它自身又帶來了一些問題。其中一個就是命名不夠靈活;你別想非常簡單的就能修改裝置檔案的名 字。預設的devfs命令機制本身也很奇怪,他需要修改大量的配置檔案和程式。;

*核心記憶體使用,devfs特有的另外一個問題是,作為核心驅動模組,devfs需要消耗大量的記憶體,特別當系統上有大量的裝置時(比如上面我們提到的系統一個上有好幾千磁碟時)

udev的目標是想解決上面提到的這些問題,他通採用使用者空間(user-space)工具來管理/dev/目錄樹,他和檔案系統分開。知道如何改變預設 配置能讓你之大如何定製自己的系統,比如建立裝置字元連線,改變裝置檔案屬組,許可權等。

udev配置檔案


主要的udev配置檔案是/etc/udev/udev.conf。這個檔案通常很短,他可能只是包含幾行#開頭的註釋,然後有幾行選項:

udev_root="/dev/"

udev_rules="/etc/udev/rules.d/"

udev_log="err"

上面的第二行非常重要,因為他表示udev規則儲存的目錄,這個目錄儲存的是以.rules結束的檔案。每一個檔案處理一系列規則來幫助udev分配名字給裝置檔案以保證能被核心識別。
你的/etc/udev/rules.d下面可能有好幾個udev規則檔案,這些檔案一部分是udev包安裝的,另外一部分則是可能是別的硬體或者軟體包 生成的。比如在Fedora Core 5系統上,sane-backends包就會安裝60-libsane.rules檔案,另外initscripts包會安裝60-net.rules文 件。這些規則檔案的檔名通常是兩個數字開頭,它表示系統應用該規則的順序。

規則檔案裡的規則有一系列的鍵/值對組成,鍵/值對之間用逗號(,)分割。每一個鍵或者是使用者匹配鍵,或者是一個賦值鍵。匹配鍵確定規則是否被應用,而賦 值鍵表示分配某值給該鍵。這些值將影響udev建立的裝置檔案。賦值鍵可以處理一個多值列表。匹配鍵和賦值鍵操作符解釋見下表:


                       udev 鍵/值對操作符
操作符     匹配或賦值t                         解釋
----------------------------------------
==            匹配              相等比較
!=            匹配             不等比較
=            賦值              分配一個特定的值給該鍵,他可以覆蓋之前的賦值。
+=      賦值              追加特定的值給已經存在的鍵
:=            賦值                  分配一個特定的值給該鍵,後面的規則不可能覆蓋它。


這有點類似我們常見的程式語言,比如C語言。只是這裡的鍵一次可以處理多個值。有一些鍵在udev規則檔案裡經常出現,這些鍵的值可以使用萬用字元(*,?,甚至範圍,比如[0-9]),這些常用鍵列舉如下:


常用udev鍵
鍵        含義
ACTION         一個時間活動的名字,比如add,當裝置增加的時候
KERNEL         在核心裡看到的裝置名字,比如sd*表示任意SCSI磁碟裝置
DEVPATH       核心裝置錄進,比如/devices/*
SUBSYSTEM       子系統名字,比如sound,net
BUS         匯流排的名字,比如IDE,USB
DRIVER         裝置驅動的名字,比如ide-cdrom
ID           獨立於核心名字的裝置名字
SYSFS{ value}       sysfs屬性值,他可以表示任意
ENV{ key}       環境變數,可以表示任意
PROGRAM       可執行的外部程式,如果程式返回0值,該鍵則認為為真(true)
RESULT         上一個PROGRAM呼叫返回的標準輸出。
NAME         根據這個規則建立的裝置檔案的檔名。注意:僅僅第一行的NAME描述是有效的,後面的均忽略。
                                  如果你想使用使用兩個以上的名字來訪問一個裝置的話,可以考慮SYMLINK鍵。
SYMLINK       根據規則建立的字元連線名
OWNER         裝置檔案的屬組
GROUP         裝置檔案所在的組。
MODE         裝置檔案的許可權,採用8進位制
RUN         為裝置而執行的程式列表
LABEL         在配置檔案裡為內部控制而採用的名字標籤(下下面的GOTO服務)
GOTO         跳到匹配的規則(通過LABEL來標識),有點類似程式語言中的GOTO
IMPORT{ type}     匯入一個檔案或者一個程式執行後而生成的規則集到當前檔案
WAIT_FOR_SYSFS   等待一個特定的裝置檔案的建立。主要是用作時序和依賴問題。
PTIONS         特定的選項: last_rule 對這類裝置終端規則執行; ignore_device 忽略當前規則; ignore_remove 忽略接下來的並移走請求。
           all_partitions 為所有的磁碟分割槽建立裝置檔案。


我們給出一個列子來解釋如何使用這些鍵。下面的例子來自Fedora Core 5系統的標準配置檔案。

KERNEL=="*", OWNER="root" GROUP="root", MODE="0600"
KERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"
KERNEL=="scd[0-9]*", SYMLINK+="cdrom cdrom-%k"
KERNEL=="hd[a-z]", BUS=="ide", SYSFS{removable}=="1", SYSFS{device/media}=="cdrom", SYMLINK+="cdrom cdrom-%k"
ACTION=="add", SUBSYSTEM=="scsi_device", RUN+="/sbin/modprobe sg"

上面的例子給出了5個規則,每一個都是KERNEL或者ACTION鍵開頭:

*第一個規則是預設的,他匹配任意被核心識別到的裝置,然後設定這些裝置的屬組是root,組是root,訪問許可權模式是0600(-rw------ -)。這也是一個安全的預設設定保證所有的裝置在預設情況下只有root可以讀寫。
*第二個規則也是比較典型的規則了。它匹配終端裝置(tty),然後設定新的許可權為0600,所在的組是tty。它也設定了一個特別的裝置檔名:%K。 在這裡例子裡,%k代表裝置的核心名字。那也就意味著核心識別出這些裝置是什麼名字,就建立什麼樣的裝置檔名。

*第三行開始的KERNEL=="scd[0-9]*",表示 SCSI CD-ROM 驅動. 它建立一對裝置符號連線:cdrom和cdrom-%k。

*第四行,開始的 KERNEL=="hd[a-z]", 表示ATA CDROM驅動器。這個規則建立和上面的規則相同的符號連線。ATA CDROM驅動器需要sysfs值以來區別別的ATA裝置,因為SCSI CDROM可以被核心唯一識別。.

*第五行以 ACTION=="add"開始,它告訴udev增加 /sbin/modprobe sg 到命令列表,當任意SCSI裝置增加到系統後,這些命令將執行。其效果就是計算機應該會增加sg核心模組來偵測新的SCSI裝置。

當然,上面僅僅是一小部分例子,如果你的系統採用了udev方式,那你應該可以看到更多的規則。如果你想修改裝置的許可權或者建立信的符號連線,那麼你需要熟讀這些規則,特別是要仔細注意你修改的那些與之相關的裝置。

修改你的udev配置


在修改udev配置之前,我們一定要仔細,通常的考慮是:你最好不要修改系統預置的那些規則,特別不要指定影響非常廣泛的配置,比如上面例子中的第一行。 不正確的配置可能會導致嚴重的系統問題或者系統根本就無法這個正確的訪問裝置。

而我們正確的做法應該是在/etc/udev/rules.d/下建立一個信的規則檔案。確定你給出的檔案的字尾是rules檔名給出的數字序列應該比 標準配置檔案高。比如,你可以建立一個名為99-my-udev.rules的規則檔案。在你的規則檔案中,你可以指定任何你想修改的配置,比如,假設你 修改修改floppy裝置的所在組,還準備建立一個信的符號連線/dev/floppy,那你可以這麼寫:
KERNEL=="fd[0-9]*", GROUP="users",   SYMLINK+="floppy"


有些發行版本,比如Fedora,採用了外部指令碼來修改某些特定裝置的屬組,組關係和許可權。因此上面的改動可能並不見得生效。如果你遇到了這個問題,你就 需要跟蹤和修改這個指令碼來達到你的目的。或者你可以修改PROGRAM或RUN鍵的值來做到這點。

某些規則的修改可能需要更深的挖掘。比如,你可能想在一個裝置上使用sysfs資訊來唯一標識一個裝置。這些資訊最好通過udevinfo命令來獲取。
$ udevinfo –a –p $(udevinfo –q path –n /dev/hda)

上面的命令兩次使用udevinfo:一次是返回sysfs裝置路徑(他通常和我們看到的Linux裝置檔名所在路徑--/dev/hda--不同); 第二次才是查詢這個裝置路徑,結果將是非常常的syfs資訊彙總。你可以找到最夠的資訊來唯一標誌你的裝置,你可以採用適當的替換udev配置檔案中的 SYSFS選項。下面的結果就是上面的命令輸出

[[email protected] rules.d]# udevinfo -a -p $(udevinfo -q path    -n /dev/hda1)

Udevinfo starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

looking at device '/block/hda/hda1':
   KERNEL=="hda1"
   SUBSYSTEM=="block"
   DRIVER==""
   ATTR{stat}=="    1133     2268        2        4"
   ATTR{size}=="208782"
   ATTR{start}=="63"
   ATTR{dev}=="3:1"

looking at parent device '/block/hda':
   KERNELS=="hda"
   SUBSYSTEMS=="block"
   DRIVERS==""
   ATTRS{stat}=="   28905    18814 1234781   302540    34087   133247   849708   981336        0   218340 1283968"
   ATTRS{size}=="117210240"
   ATTRS{removable}=="0"
   ATTRS{range}=="64"
   ATTRS{dev}=="3:0"

looking at parent device '/devices/pci0000:00/0000:00:1f.1/ide0/0.0':
   KERNELS=="0.0"
   SUBSYSTEMS=="ide"
   DRIVERS=="ide-disk"
   ATTRS{modalias}=="ide:m-disk"
   ATTRS{drivename}=="hda"
   ATTRS{media}=="disk"

looking at parent device '/devices/pci0000:00/0000:00:1f.1/ide0':
   KERNELS=="ide0"
   SUBSYSTEMS==""
   DRIVERS==""

looking at parent device '/devices/pci0000:00/0000:00:1f.1':
   KERNELS=="0000:00:1f.1"
   SUBSYSTEMS=="pci"
   DRIVERS=="PIIX_IDE"
   ATTRS{broken_parity_status}=="0"
   ATTRS{enable}=="1"
   ATTRS{modalias}=="pci:v00008086d000024CAsv0000144Dsd0000C009bc01sc01i8a"
   ATTRS{local_cpus}=="1"
   ATTRS{irq}=="11"
   ATTRS{class}=="0x01018a"
   ATTRS{subsystem_device}=="0xc009"
   ATTRS{subsystem_vendor}=="0x144d"
   ATTRS{device}=="0x24ca"
   ATTRS{vendor}=="0x8086"

looking at parent device '/devices/pci0000:00':
   KERNELS=="pci0000:00"
   SUBSYSTEMS==""
   DRIVERS==""


舉一個例子:假設你想修改USB掃描器的配置。通過一系列的嘗試,你已經為這個掃描器標識了Linux裝置檔案(每次開啟掃描器時,名字都會變)。你可以 使用上面的命令替換這個正確的Linux裝置檔名,然後定位輸出的採用SYSFS{idVendor}行和SYSFS{idProduct}行。最後你 可以使用這些資訊來為這個掃描器建立新的選項。


SYSFS{idVendor}=="0686", \

SYSFS{idProduct}=="400e", \

SYMLINK+="scanner", MODE="0664", \

group="scanner"

上面的例子表示將掃描器的組設定為scanner,訪問許可權設定為0664,同時建立一個/dev/scanner的符號連線。

Udev (簡體中文)
From ArchWiki
Jump to: navigation, search


i18n
English
Русский
繁體中文
簡體中文

注意: 如果您是從DevFS升級到Udev, 請檢視 DevFS to Udev.

這篇文件將介紹udev的一些新的變化。從084版開始,udev能夠代替hotplug和coldplug的所有功能。正因為這樣,hotplug包已經從Arch倉庫中去掉了。
Contents
[hide]

    * 1 重要提示
    * 2 基本需求
    * 3 最近更新
    * 4 模組禁用列表
    * 5 load_modules: 有用的啟動引數
    * 6 已知的硬體問題
    * 7 自動載入帶來的一些問題
          o 7.1 CPUFreq模組
          o 7.2 聲音問題和一些不能自動載入的模組
          o 7.3 多個同類型裝置(網絡卡,音效卡)每次啟動的都不同
    * 8 自己編譯核心造成的一些已知問題
          o 8.1 Udev無法啟動
          o 8.2 CD/DVD符號和許可權錯誤
    * 9 Udev小竅門
          o 9.1 自動載入usb裝置

重要提示

...切記,在使用udev載入任何modules(核心模組)之前(無論是否是啟動時自動載入),您必須在/etc/rc.conf將 MOD_AUTOLOAD選項設定為yes ,否則您必須手動載入這些modules。您可以修改rc.conf中的MODULES或者使用modprobe命令來手動載入您所需要的 modules。另一種方法是用hwdetect --modules生成系統硬體的modules列表,然後將這個列表新增到rc.conf中讓系統啟動時自動載入這些modules。

基本需求

    * 核心: 2.6.15或更高版本。
    * 您將無法在fstab和bootloader設定中再使用DevFS格式的裝置名稱! 更多相關內容請檢視DevFS to Udev。

最近更新

    * startudev程式被取出。如果需要重新載入udev規則請使用 /etc/start_udev。
    * Udev代替了hotplug和hwdetect的功能。同時我們儲存了hwdetect,並且只在 mkinitrd程式生成initrd的時候用到。
    * Udev可以同時載入多個模組,這樣可以加快啟動速度,然而,這樣做的結果是她不能保證每次載入的順序,所以當你使用多音效卡或網絡卡的時候就會出現問題,這個問題下面將會再討論。

模組禁用列表

udev也會犯錯或載入錯誤的模組。為了防止錯誤的發生,你可以使用模組禁用列表 。一旦加入該列表的模組,無論是啟動時,或者時執行時(如usb硬碟等)udev都不會載入這些模組。

只需在您在 rc.conf的MODULES中對應模組前加上感嘆號(!)就可禁用該模組。

例如,

MODULES=(!moduleA !moduleB)

load_modules: 有用的啟動引數

如果您在核心啟動引數中加入load_modules=off,那麼udev會停止任何自動載入工作. 如果系統出現問題時,這個功能會十分有用。如果udev載入了有問題的模組導致系統掛起或者其它嚴重的問題時,你可以使用這個引數來禁用自動載入,以此來 防止載入有問題的模組。

已知的硬體問題

- BusLogic裝置被損壞而且導致啟動時宕機。

這是一個核心的Bug目前還沒有修正。

- PCMCIA讀卡器被認為是可移除裝置.

把它們加入到/etc/pmount.allow中,使用hal的pmount來讀取

自動載入帶來的一些問題

CPUFreq模組

我門還沒有找到一個很好的方法載入不同的CPUFreq控制器,所以我們把從自動載入程序裡把它去掉了。如果您需要測量CPU頻率,你必須在rc.conf的MODULES佇列中顯式的加入合適的模組。

聲音問題和一些不能自動載入的模組

一些使用者跟蹤發現問題出在/etc/modprobe.conf中一些舊的部分,試著去掉這些舊的部分再試試看。
多個同類型裝置(網絡卡,音效卡)每次啟動的都不同

因為udev同時載入所有模組,所以一些裝置可能初始化順序不同。例如同時有兩個網絡卡時,它們總是在eth0和eth1之間變來變去。

常用的解決辦法是在您的rc.conf檔案中通過修改MODULES佇列來指明順序。這個佇列裡的模組將在udev自動載入之前由系統載入,因此您可以控制模組在啟動時載入順序。

# 在e100之前載入8139too
MODULES=(8139too e100)

另一個解決網絡卡的方法是使用udev-sanctified方法為每個網絡卡靜態命名。建立檔案/etc/udev/rules.d/10-network.rules然後將不同的網絡卡通過MAC地址繫結到不同的名字上:

SUBSYSTEM=="net", SYSFS{address}=="aa:bb:cc:dd:ee:ff", NAME="lan0"
SUBSYSTEM=="net", SYSFS{address}=="ff:ee:dd:cc:bb:aa", NAME="wlan0"

同時,您需要注意以下內容:

    * 您可以通過下面的命令獲得網絡卡的MAC地址:: udevinfo -a -p /sys/class/net/<你的網絡卡>
    * 注意在udev規則檔案中使用小寫的16進位制MAC地址,因為udev無法識別大寫的MAC地址。
    * 一些使用者在使用舊的命名方式時出現問題,例如: eth0, eth1, 等等. 如果出現這個問題,試試使用 "lan"或者"wlan"之類的名字.

注意不要忘記修改您的/dec/rc.conf和其它使用ethX命名的配置檔案。

自己編譯核心造成的一些已知問題

Udev無法啟動

請確定您的核心版本大於或等於2.6.15。較早的核心沒有udev自動裝載所需要的uevent功能。

CD/DVD符號和許可權錯誤

如果您使用2.6.15的核心的話,您需要安裝ABS的uevent補丁(它從2.6.16核心中抽取了一些uevent功能)。您可以使用abs命令來 同步ABS樹,然後您就可以在/var/abs/kernels/kernel26/下找到abs補丁。

Udev小竅門

自動載入usb裝置

KERNEL=="sd[a-z]", NAME="%k", SYMLINK+="usb%m", GROUP="users", OPTIONS="last_rule"
ACTION=="add", KERNEL=="sd[a-z][0-9]", SYMLINK+="usb%n", GROUP="users", NAME="%k"
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mkdir -p /mnt/usb%n"
ACTION=="add", KERNEL=="sd[a-z][0-9]", PROGRAM=="/lib/udev/vol_id -t %N", RESULT=="vfat", RUN+="/bin/mount -t vfat -o rw,noauto,sync,dirsync,noexec,nodev,noatime,dmask=000,fmask=111 /dev/%k /mnt/usb%n", OPTIONS="last_rule"
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mount -t auto -o rw,noauto,sync,dirsync,noexec,nodev,noatime /dev/%k /mnt/usb%n", OPTIONS="last_rule"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/umount -l /mnt/usb%n"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rmdir /mnt/usb%n", OPTIONS="last_rule"

把這些udev規則放到/etc/udev/rules.d/下任何一個檔名以.rules結尾的檔案中,例如/etc/udev/rules.d/sda.rules。

如果想同時建立/media到/mnt符號連線,可以使用下面的版本:

KERNEL=="sd[a-z]", NAME="%k", SYMLINK+="usbhd-%k", GROUP="users", OPTIONS="last_rule"
ACTION=="add", KERNEL=="sd[a-z][0-9]", SYMLINK+="usbhd-%k", GROUP="users", NAME="%k"
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mkdir -p /media/usbhd-%k"
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/ln -s /media/usbhd-%k /mnt/usbhd-%k"
ACTION=="add", KERNEL=="sd[a-z][0-9]", PROGRAM=="/lib/udev/vol_id -t %N", RESULT=="vfat", RUN+="/bin/mount -t vfat -o rw,noauto,sync,dirsync,noexec,nodev,noatime,dmask=000,fmask=111 /dev/%k /media/usbhd-%k", OPTIONS="last_rule"
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mount -t auto -o rw,noauto,sync,dirsync,noexec,nodev,noatime /dev/%k /media/usbhd-%k", OPTIONS="last_rule"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rm -f /mnt/usbhd-%k"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/umount -l /media/usbhd-%k"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rmdir /media/usbhd-%k", OPTIONS="last_rule"

注意!如果你是用的其它的固定裝置(例如SATA的硬碟,您可以從/etc/fstab中檢視)被識別為/dev/sdX,您必須從sd[a-z] 中去掉你的那個sdX。例如,如果您的SATA硬碟被是識別為/dev/sda,您就需要把所有的“sd[a-z]”替換成“sd[b-z]”。在規則文 件的檔名前加上數字(如:010.udev.rules)是個很好的主意,這樣udev在讀取標準規則前,將會讀取這個規則檔案。這些規則設定後不需要 修改/etc/fstab檔案。請檢視mount命令的引數來修改許可權等特性(您可以從論壇搜尋檢視mount命令的引數,然後根據您的需要修改它們)。

相關推薦

網路整理udev

如果你使用Linux比較長時間了,那你就知道,在對待裝置檔案這塊,Linux改變了幾次策略。在Linux早期,裝置檔案僅僅是是一些帶有適當的屬性 集的普通檔案,它由mknod命令建立,檔案存放在/dev目錄下。後來,採用了devfs,一個基於核心的動態裝置檔案系統,他首次出

linux csetsockopt

多層 count 設置 例如 select() log struct rec 查找 轉自:http://blog.csdn.net/zhonglinzhang/article/details/9183229 功能描述: 獲取或者設置與某個套接字關聯的選

(轉)虛擬路由器冗余協議原理篇VRRP

基礎上 vrrp 終端 外網 targe 多少 res 虛擬 ini 原文:http://blog.51cto.com/zhaoyuqiang/1166840 為什麽要使用VRRP技術 我們知道,為了實現不同子網之間的設備通信,需要配置路由。目前常用的指定路由方法有兩種

Android 動畫動畫之補間動畫(一)

前言 :之前很早就想寫寫Android 的動畫,最近剛好有時間,大概聊一聊安卓動畫。 我個人習慣將動畫分為:補間動畫(透明度、旋轉、位移、縮放)、幀動畫、和屬性動畫,這一篇,我們先說說補間動畫。 補間動畫這個詞出於flash,在兩個關鍵幀(可以理解成動畫開始和結束)中間需要做“補

Android 動畫動畫之屬性動畫(三)

大家好,在前兩篇中,我們介紹了Android的補間動畫和插值器,這一篇,我們來說下屬性動畫。 【Android 動畫】動畫詳解之補間動畫(一) 【Android 動畫】動畫詳解之插值器(二) 前言 通過前兩篇,我們已經熟悉了對View進行移動、縮放、旋轉和

Android 動畫動畫之插值器(二)

大家好,在上一篇中,我們介紹了Android 的補間動畫,這一篇我們來說說動畫的另外一個公共屬性插值器Interpolator 【Android 動畫】動畫詳解之補間動畫(一) 在上一節中,實現的旋轉、位移動畫等動畫,我們會發現它一直是勻速的,但如果我們需要做一個加

技術指標MACD

MACD指標 演算法原理       一、DIF的實質 DIF=收盤價的短期指數移動平均與長期指數移動平均的差值,當兩條EMA線交叉時,DIF線正好穿越0軸。 1、DIF上穿0軸,表明EMA(CLOSE,SHORT)線上穿EMA(CLOSE,LO

ML_Preparation 2 Anaconda 及多 Python 版本切換實現

1 Anaconda具體是用來幹什麼的 根據其主頁介紹:https://www.anaconda.com/what-is-anaconda/ Anaconda - The Most Popular Python Data Science Platform Anaconda Distr

基礎操作FFT

1. 2. 點值表示法 假設兩個多項式相乘後得到的多項式 的次數(最高次項的冪數)為 $n$。(這個很好求,兩個多項式的最高次項的冪數相加就得到了) 對於每個點,要用 $O(n)$ 的時間 把 $x$ 分別代入兩個多項式,得到兩個結果 $z_1,z_2$,兩者相乘得到 $z$,才能知道相乘後的多項式在代

linux技術nginx

1 配置檔案 # worker程序數,通常設定成和cpu的數量相等 worker_processes auto; # 設定worker程序最大檔案開啟數;避免出現too many open files worker_rlimit_nofile 65535; # ng

java基礎++ -- 運算子

++ -- 運算子詳解 ## 關於自增自減運算的問題《java程式設計思想》中是這樣說的: a、(i++,i--)運算子在運算元後面,先賦值,再運算 b、(++i, --i)運算子在運算元前面,先運算,再賦值 例: int i = 1; System.out.println(i-- - ++

100.JAVA程式設計列舉

列舉:是有界集合體 public class EnumDemo { enum SexEnum { MAN, WOMAN } public static void main(String[] args){ for(Se

Shell程式設計變數

一、什麼是變數 在我們上學時,我們就接觸資料方程式;例如:已知x=1 y=x+1 那麼y等於多少,我們毫不猶豫的會算出來2,但是在shell中x就是變數名,那麼對應的1就是變數值,在這裡的等於號,在shell中稱為賦值! x=1      x(變數名)   =(賦值)   

深度學習TensorFlow

TensorFlow 是一個用於人工智慧的開源神器 TensorFlow 是谷歌的第二代機器學習系統,按照谷歌所說,在某些基準測試中,TensorFlow的表現比第一代的DistBelief快了2倍。 TensorFlow 內建深度學習

微信支付——呼叫微信客戶端支付之服務端開發

最近準備上網頁的微信支付,大家可以參考後續教程: 2015-09-12 更新: 因微信支付已經升級到V3版本,請大家參考官網的幫助文件。 之前一篇提到微信支付的開發過程,寫得有點亂,現在重新整理一下。 好了,說說到底該怎樣一步一步分享處理。 先把服務端d

Java集合LinkedList中篇

rst 需要 源碼 -o linked 興趣 app equal 頭節點 這是關於LinkedList的第二篇文章,我將會源碼分析LinkedList的部分重要代碼,關鍵地方我都有註釋說明,希望大家能比較明白的看懂! 分析源碼按照順序分析: 變量 構造方法 方法 一、變

Spring MVCDispatcherServlet(容器初始化超詳細過程原始碼分析)

DispatcherServlet類相關的結構圖DispatcherServlet的初始化程式DispatcherServlet初始化了什麼,可以在其initStrategies()方法中知曉,這個方法如下: protected void initStrategies(App

git配置配置&快捷命令(自定義短命令)

開發十年,就只剩下這套架構體系了! >>>   

經典案例Python設計模式:策略模式

src 手動 pri 依賴 同學 ice als pass concrete 完成一項任務往往有多種方式,我們將其稱之為策略。 比如,超市做活動,如果你的購物積分滿1000,就可以按兌換現金抵用券10元,如果購買同一商品滿10件,就可以打9折,如果如果購買的金額超過500,

網路程式設計滑動視窗 (TCP流量控制)

滑動視窗 (TCP流量控制) 介紹UDP時我們描述了這樣的問題:如果傳送端傳送的速度較快,接收端接收到資料後處理的速度較慢,而接收緩衝區的大小是固定的,就會丟失資料。TCP協議通過“滑動視窗(Slid