溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux下udev詳細(xì)介紹

發(fā)布時(shí)間:2020-07-13 21:50:09 來(lái)源:網(wǎng)絡(luò) 閱讀:1660 作者:SEianG 欄目:關(guān)系型數(shù)據(jù)庫(kù)


每次在搭建OracleRAC環(huán)境中,遇到問(wèn)題最多的就是關(guān)于ASM磁盤的的問(wèn)題,通過(guò)查看網(wǎng)上許多搭建RAC的文檔,發(fā)現(xiàn)Oracle10g RAC大家普遍的修改/etc/udev/rules.d/60-raw.rules,而一些搭建Oracle11R2RAC,大家都在配置的是/etc/udev/rules.d/99-oracle-asmdevices.rules這個(gè)文件,面對(duì)這樣一種情況,我不是很明白,這兩個(gè)文件到底有什么區(qū)別,這個(gè)問(wèn)題困擾了我很久,直到今天遇到這樣一個(gè)問(wèn)題:使用udev管理asmdisk執(zhí)行/sbin/scsi_id不顯示UUID。通過(guò)查詢相關(guān)的資料才算是對(duì)這個(gè)問(wèn)題有了更深層次的理解。

    

         Linux平臺(tái)通過(guò)udev的方式將塊設(shè)備轉(zhuǎn)換為字符設(shè)備,并固定設(shè)備的權(quán)限和所有者,這種需求只在安裝11gR1之前的RAC數(shù)據(jù)庫(kù)的時(shí)候需要這樣做,安裝11gR2RAC,ASM可以直接使用塊設(shè)備。udev除了用于將塊設(shè)備轉(zhuǎn)換為字符設(shè)備外,還可用于固定設(shè)備文件名稱。

 

之后,通過(guò)實(shí)驗(yàn)來(lái)驗(yàn)證這個(gè)結(jié)論:

 

詳細(xì)的步驟請(qǐng)參考我的另一篇博文:

使用udev管理asmdisk執(zhí)行/sbin/scsi_id不顯示UUID

 

目錄

一、udev簡(jiǎn)介... 1

二、udev的優(yōu)勢(shì)... 2

2.1 動(dòng)態(tài)管理... 2

2.2 自定義命名規(guī)則... 2

2.3 設(shè)定設(shè)備的權(quán)限和所有者/ ... 2

2.4 下面的流程圖顯示udev 添加/刪除設(shè)備文件的過(guò)程。... 3

三、配置和使用udevCentOS6.4... 4

3.1 檢查udevCentOS6.5中的版本和運(yùn)行情況... 4

3.2 udev的配置文件... 4

3.3 通過(guò)udev設(shè)定設(shè)備文件的權(quán)限... 5

3.4 udev的規(guī)則和規(guī)則文件... 5

四、制定udev 規(guī)則和查詢?cè)O(shè)備信息的實(shí)例... 8

4.1 查找設(shè)備的信息(屬性)來(lái)制定udev規(guī)則... 8

4.2 udev的簡(jiǎn)單規(guī)則... 10

4.3 其他常用的udev命令... 11

 

一、udev簡(jiǎn)介

udev Linux2.6內(nèi)核里的一個(gè)功能,它替代了原來(lái)的devfs,成為當(dāng)前Linux 默認(rèn)的設(shè)備管理工具。udev以守護(hù)進(jìn)程的形式運(yùn)行,通過(guò)偵聽(tīng)內(nèi)核發(fā)出來(lái)的uevent來(lái)管理/dev目錄下的設(shè)備文件。不像之前的設(shè)備管理工具,udev在用戶空間(userspace) 運(yùn)行,而不在內(nèi)核空間(kernel space) 運(yùn)行。

 

二、udev的優(yōu)勢(shì)

2.1 動(dòng)態(tài)管理

當(dāng)設(shè)備添加/刪除時(shí),udev的守護(hù)進(jìn)程偵聽(tīng)來(lái)自內(nèi)核的uevent,以此添加或者刪除/dev下的設(shè)備文件,所以udev只為已經(jīng)連接的設(shè)備產(chǎn)生設(shè)備文件,而不會(huì)在/dev下產(chǎn)生大量虛無(wú)的設(shè)備文件。

 

2.2 自定義命名規(guī)則

通過(guò)Linux默認(rèn)的規(guī)則文件,udev/dev/里為所有的設(shè)備定義了內(nèi)核設(shè)備名稱,比如/dev/sda、/dev/hda、/dev/fd等等。由于udev是在用戶空間(user space) 運(yùn)行,Linux用戶可以通過(guò)自定義的規(guī)則文件,靈活地產(chǎn)生標(biāo)識(shí)性強(qiáng)的設(shè)備文件名,比如/dev/boot_disk、/dev/root_disk、/dev/color_printer等等。

 

2.3 設(shè)定設(shè)備的權(quán)限和所有者/

udev可以按一定的條件來(lái)設(shè)置設(shè)備文件的權(quán)限和設(shè)備文件所有者/組。在不同的udev 版本中,實(shí)現(xiàn)的方法不同。

 

2.4 下面的流程圖顯示udev 添加/刪除設(shè)備文件的過(guò)程。

Linux下udev詳細(xì)介紹 

PS

1.設(shè)備文件:由于本文以較通俗的方式講解udev,所以設(shè)備文件是泛指在/dev/下,可被應(yīng)用程序用來(lái)和設(shè)備驅(qū)動(dòng)交互的文件。而不會(huì)特別地區(qū)分設(shè)備文件、設(shè)備節(jié)點(diǎn)或者設(shè)備特殊文件。

 

2.sysfssysfsLinux2.6 內(nèi)核里的一個(gè)虛擬文件系統(tǒng)(/sys)。它把設(shè)備和驅(qū)動(dòng)的信息從內(nèi)核的設(shè)備模塊導(dǎo)出到用戶空間(userspace)。從該文件系統(tǒng)中,Linux用戶可以獲取很多設(shè)備的屬性。

 

3.devpath本文的devpath是指一個(gè)設(shè)備在sysfs文件系統(tǒng)(/sys)下的相對(duì)路徑,該路徑包含了該設(shè)備的屬性文件。udev里的多數(shù)命令都是針對(duì)devpath操作的。例如:sdadevpath/block/sdasda2devpath/block/sda/sda2。

 

4.內(nèi)核設(shè)備名稱:設(shè)備在sysfs里的名稱,是udev默認(rèn)使用的設(shè)備文件名。


三、配置和使用udevCentOS6.4

3.1 檢查udevCentOS6.5中的版本和運(yùn)行情況

[root@testboot]# rpm -qa |grep -i udev

udev-147-2.46.el6.x86_64

libgudev1-147-2.46.el6.x86_64

python-gudev-147.1-4.el6_0.1.x86_64

libudev-147-2.46.el6.x86_64

system-config-printer-udev-1.1.16-23.el6.x86_64

 

[root@testboot]# ps -ef |grep -i udev

root     27957    1  0 10:23 ?        00:00:00 /sbin/udevd -d

root     28584 27957  0 10:34 ?        00:00:00 /sbin/udevd -d

root     29017 1955  0 13:28 pts/0    00:00:00 grep -i udev 

 

3.2 udev的配置文件

[root@test~]# cat/etc/udev/udev.conf

#The initial syslog(3) priority: "err", "info","debug" or its

#numerical equivalent. For runtime debugging, the daemons internal

#state can be changed with: "udevadm control--log-priority=<value>".

udev_log="err"

 

udev_logsyslog記錄日志的級(jí)別,默認(rèn)值是err。如果改為info或者debug的話,會(huì)有冗長(zhǎng)的udev日志被記錄下來(lái)。

實(shí)際上在CentOS里,除了配置文件里列出的參數(shù)udev_log外,Linux用戶還可以修改參數(shù)udev_rootudev_rules,只不過(guò)這2個(gè)參數(shù)是不建議修改的,所以沒(méi)顯示在udev.conf 里。syslog默認(rèn)會(huì)記錄udev的日志,Linux用戶只能修改日志的級(jí)別(err、info、degub);設(shè)備的權(quán)限不能在udev.conf里設(shè)定,而是要在規(guī)則文件(*.rules) 里設(shè)定。

 

3.3 通過(guò)udev設(shè)定設(shè)備文件的權(quán)限

CentOS6.4 udev,已經(jīng)沒(méi)有權(quán)限文件,所有的權(quán)限都是通過(guò)規(guī)則文件(*.rules)來(lái)設(shè)置,在下面的規(guī)則文件配置過(guò)程會(huì)介紹到。

 

3.4 udev的規(guī)則和規(guī)則文件

規(guī)則文件是udev里最重要的部分,默認(rèn)是存放在/etc/udev/rules.d/下。所有的規(guī)則文件必須以“.rules”為后綴名。CentOS有默認(rèn)的規(guī)則文件,這些默認(rèn)規(guī)則文件不僅為設(shè)備產(chǎn)生內(nèi)核設(shè)備名稱,還會(huì)產(chǎn)生標(biāo)識(shí)性強(qiáng)的符號(hào)鏈接。例如:

 

[root@test~]# ls/dev/disk/by-uuid/

18f9b7a4-f6a9-4a87-a63b-2660b12c87db  8ac6170e-8e4d-4385-a166-92c2aaeb75ca

5e2405ac-1cb5-4a90-a6c9-67c2c245667b  c42b1176-beaf-4e52-98e3-1b6d386908c0

 

但這些鏈接名較長(zhǎng),不易調(diào)用,所以通常需要自定義規(guī)則文件,以此產(chǎn)生易用且標(biāo)識(shí)性強(qiáng)的設(shè)備文件或符號(hào)鏈接。

udev按照規(guī)則文件名的字母順序來(lái)查詢?nèi)恳?guī)則文件,然后為匹配規(guī)則的設(shè)備管理其設(shè)備文件或文件鏈接。雖然udev不會(huì)因?yàn)橐粋€(gè)設(shè)備匹配了一條規(guī)則而停止解析后面的規(guī)則文件,但是解析的順序仍然很重要。通常情況下,建議讓自己想要的規(guī)則文件最先被解析。比如,創(chuàng)建一個(gè)名為/etc/udev/rules.d/10-myrule.rules的文件,并把你的規(guī)則寫入該文件,這樣udev就會(huì)在解析系統(tǒng)默認(rèn)的規(guī)則文件之前解析到你的文件。

在規(guī)則文件里,除了以“#”開(kāi)頭的行(注釋),所有的非空行都被視為一條規(guī)則,但是一條規(guī)則不能擴(kuò)展到多行。規(guī)則都是由多個(gè)鍵值對(duì)(key-valuepairs)組成,并由逗號(hào)隔開(kāi),鍵值對(duì)可以分為條件匹配鍵值對(duì)(以下簡(jiǎn)稱匹配鍵”)和賦值鍵值對(duì)(以下簡(jiǎn)稱賦值鍵”),一條規(guī)則可以有多條匹配鍵和多條賦值鍵。匹配鍵是匹配一個(gè)設(shè)備屬性的所有條件,當(dāng)一個(gè)設(shè)備的屬性匹配了該規(guī)則里所有的匹配鍵,就認(rèn)為這條規(guī)則生效,然后按照賦值鍵的內(nèi)容,執(zhí)行該規(guī)則的賦值。下面是一個(gè)簡(jiǎn)單的規(guī)則:

KERNEL=="sda",NAME="my_root_disk",MODE="0660"

KERNEL是匹配鍵,NAMEMODE是賦值鍵。這條規(guī)則的意思是:如果有一個(gè)設(shè)備的內(nèi)核設(shè)備名稱為sda,則該條件生效,執(zhí)行后面的賦值:在/dev下產(chǎn)生一個(gè)名為my_root_disk的設(shè)備文件,并把設(shè)備文件的權(quán)限設(shè)為0660

僅當(dāng)操作符是“==”或者“!=”時(shí),其為匹配鍵;若為其他操作符時(shí),都是賦值鍵。

 

udev規(guī)則的所有操作符:

“==”:比較鍵、值,若等于,則該條件滿足;

“!=”:比較鍵、值,若不等于,則該條件滿足;

“=”:對(duì)一個(gè)鍵賦值;

“+=”:為一個(gè)表示多個(gè)條目的鍵賦值。

“:=”:對(duì)一個(gè)鍵賦值,并拒絕之后所有對(duì)該鍵的改動(dòng)。目的是防止后面的規(guī)則文件對(duì)該鍵賦值。

 

udev規(guī)則的匹配鍵:

ACTION:事件(uevent)的行為,例如:add(添加設(shè)備)、remove(刪除設(shè)備)

KERNEL:內(nèi)核設(shè)備名稱,例如:sda,cdrom。

DEVPATH:設(shè)備的devpath路徑。

SUBSYSTEM:設(shè)備的子系統(tǒng)名稱,例如:sda的子系統(tǒng)為block

BUS:設(shè)備在devpath 里的總線名稱,例如:usb。

DRIVER:設(shè)備在devpath 里的設(shè)備驅(qū)動(dòng)名稱,例如:ide-cdrom

ID:設(shè)備在devpath 里的識(shí)別號(hào)。

SYSFS{filename}:設(shè)備的devpath 路徑下,設(shè)備的屬性文件“filename”里的內(nèi)容。

例如:SYSFS{model}==“ST936701SS”表示:如果設(shè)備的型號(hào)為ST936701SS,則該設(shè)備匹配該匹配鍵。

在一條規(guī)則中,可以設(shè)定最多五條SYSFS的匹配鍵。

ENV{key}:環(huán)境變量。在一條規(guī)則中,可以設(shè)定最多五條環(huán)境變量的匹配鍵。

PROGRAM:調(diào)用外部命令。

RESULT:外部命令PROGRAM 的返回結(jié)果。例如:

PROGRAM=="/lib/udev/scsi_id-g -s $devpath", RESULT=="35000c50000a7ef67"

調(diào)用外部命令/lib/udev/scsi_id查詢?cè)O(shè)備的SCSIID,如果返回結(jié)果為35000c50000a7ef67,則該設(shè)備匹配該匹配鍵。

 

udev 的重要賦值鍵:

NAME:在/dev下產(chǎn)生的設(shè)備文件名。只有第一次對(duì)某個(gè)設(shè)備的NAME的賦值行為生效,之后匹配的規(guī)則再對(duì)該設(shè)備的NAME賦值行為將被忽略。如果沒(méi)有任何規(guī)則對(duì)設(shè)備的NAME賦值,udev將使用內(nèi)核設(shè)備名稱來(lái)產(chǎn)生設(shè)備文件。

SYMLINK:為/dev/下的設(shè)備文件產(chǎn)生符號(hào)鏈接。由于udev只能為某個(gè)設(shè)備產(chǎn)生一個(gè)設(shè)備文件,所以為了不覆蓋系統(tǒng)默認(rèn)的udev規(guī)則所產(chǎn)生的文件,推薦使用符號(hào)鏈接。

OWNER, GROUP, MODE:為設(shè)備設(shè)定權(quán)限。

ENV{key}:導(dǎo)入一個(gè)環(huán)境變量。

 

udev 的值和可調(diào)用的替換操作符:

在鍵值對(duì)中的鍵和操作符都介紹完了,最后是值(value)。Linux用戶可以隨意地定制udev規(guī)則文件的值。例如:my_root_disk,my_printer。同時(shí)也可以引用下面的替換操作符:

$kernel, %k:設(shè)備的內(nèi)核設(shè)備名稱,例如:sda、cdrom。

$number, %n:設(shè)備的內(nèi)核號(hào)碼,例如:sda3的內(nèi)核號(hào)碼是3

$devpath, %p:設(shè)備的devpath路徑。

$id, %b:設(shè)備在devpath里的ID號(hào)。

$sysfs{file},%s{file}:設(shè)備的sysfsfile的內(nèi)容。其實(shí)就是設(shè)備的屬性值。例如:$sysfs{size}表示該設(shè)備(磁盤) 的大小。

$env{key}, %E{key}:一個(gè)環(huán)境變量的值。

$major, %M:設(shè)備的major號(hào)。

$minor %m:設(shè)備的minor號(hào)。

$result, %cPROGRAM返回的結(jié)果。

$parent, %P:父設(shè)備的設(shè)備文件名。

$root, %rudev_root的值,默認(rèn)是/dev/。

$tempnode, %N:臨時(shí)設(shè)備名。

%%:符號(hào)%本身。

$$:符號(hào)$本身。

KERNEL=="sd*",PROGRAM="/lib/udev/scsi_id -g -s %p", \RESULT=="35000c50000a7ef67", SYMLINK="%k_%c"

該規(guī)則的執(zhí)行:如果有一個(gè)內(nèi)核設(shè)備名稱以sd開(kāi)頭,且SCSI ID 35000c50000a7ef67,則為設(shè)備文件產(chǎn)生一個(gè)符號(hào)鏈接“sda_35000c50000a7ef67”.

 

四、制定udev 規(guī)則和查詢?cè)O(shè)備信息的實(shí)例

4.1 查找設(shè)備的信息(屬性)來(lái)制定udev規(guī)則

當(dāng)我們?yōu)橹付ǖ脑O(shè)備設(shè)定規(guī)則時(shí),首先需要知道該設(shè)備的屬性,比如設(shè)備的序列號(hào)、磁盤大小、廠商ID、設(shè)備路徑等等。通常我們可以通過(guò)以下的方法獲得:

查詢sysfs文件系統(tǒng):

前面介紹過(guò),sysfs里包含了很多設(shè)備和驅(qū)動(dòng)的信息。

例如:設(shè)備sdaSYSFS{size} 可以通過(guò)cat/sys/block/sda/size得到;SYSFS{model}信息可以通過(guò)cat/sys/block/sda/device/model得到。

udevadm info命令:(Centos5.3udevinfo命令)

udevadm info 可以查詢udev數(shù)據(jù)庫(kù)里的設(shè)備信息。例如:用udevadm info 查詢?cè)O(shè)備sdamodel size信息:

 

[root@test~]# udevadm info-a -p /sys/block/sda | egrep "model|size"

    ATTR{size}=="62914560"

    ATTRS{model}=="VBOX HARDDISK   "

 

[root@test~]# udevadm info-a -p /sys/block/sda

Udevadminfo starts with the device specified by the devpath and then

walksup the chain of parent devices. It prints for every device

found,all possible attributes in the udev rules key format.

Arule to match, can be composed by the attributes of the device

andthe attributes from one single parent device.

 

  looking at device'/devices/pci0000:00/0000:00:0d.0/host2/target2:0:0/2:0:0:0/block/sda':

    KERNEL=="sda"

    SUBSYSTEM=="block"

    DRIVER==""

    ATTR{range}=="16"

    ATTR{ext_range}=="256"

    ATTR{removable}=="0"

    ATTR{ro}=="0"

    ATTR{size}=="62914560"

    ATTR{alignment_offset}=="0"

    ATTR{discard_alignment}=="0"

    ATTR{capability}=="52"

    ATTR{stat}=="   30322    6547  1191594   333118    7382    94590   811468  137604        0   154932  470661"

    ATTR{inflight}=="       0       0"

 

  looking at parent device'/devices/pci0000:00/0000:00:0d.0/host2/target2:0:0/2:0:0:0':

    KERNELS=="2:0:0:0"

    SUBSYSTEMS=="scsi"

    DRIVERS=="sd"

    ATTRS{device_blocked}=="0"

    ATTRS{type}=="0"

    ATTRS{scsi_level}=="6"

    ATTRS{vendor}=="ATA     "

    ATTRS{model}=="VBOX HARDDISK   "

    ATTRS{rev}=="1.0 "

    ATTRS{state}=="running"

    ATTRS{timeout}=="30"

    ATTRS{iocounterbits}=="32"

    ATTRS{iorequest_cnt}=="0x95a8"

    ATTRS{iodone_cnt}=="0x957d"

    ATTRS{ioerr_cnt}=="0x5"

    ATTRS{modalias}=="scsi:t-0x00"

    ATTRS{evt_media_change}=="0"

    ATTRS{dh_state}=="detached"

    ATTRS{queue_depth}=="31"

   ATTRS{queue_ramp_up_period}=="120000"

    ATTRS{queue_type}=="simple"

 

  looking at parent device'/devices/pci0000:00/0000:00:0d.0/host2/target2:0:0':

    KERNELS=="target2:0:0"

    SUBSYSTEMS=="scsi"

    DRIVERS==""

 

  looking at parent device'/devices/pci0000:00/0000:00:0d.0/host2':

    KERNELS=="host2"

    SUBSYSTEMS=="scsi"

    DRIVERS==""

 

  looking at parent device'/devices/pci0000:00/0000:00:0d.0':

    KERNELS=="0000:00:0d.0"

    SUBSYSTEMS=="pci"

    DRIVERS=="ahci"

    ATTRS{vendor}=="0x8086"

    ATTRS{device}=="0x2829"

    ATTRS{subsystem_vendor}=="0x0000"

    ATTRS{subsystem_device}=="0x0000"

    ATTRS{class}=="0x010601"

    ATTRS{irq}=="21"

    ATTRS{local_cpus}=="1"

    ATTRS{local_cpulist}=="0"

   ATTRS{modalias}=="pci:v00008086d00002829sv00000000sd00000000bc01sc06i01"

    ATTRS{numa_node}=="-1"

    ATTRS{enable}=="1"

    ATTRS{broken_parity_status}=="0"

    ATTRS{msi_bus}==""

 

  looking at parent device '/devices/pci0000:00':

    KERNELS=="pci0000:00"

    SUBSYSTEMS==""

DRIVERS=="" 

 

4.2 udev的簡(jiǎn)單規(guī)則

產(chǎn)生網(wǎng)卡設(shè)備文件的規(guī)則:

SUBSYSTEM=="net",SYSFS{address}=="AA:BB:CC:DD:EE:FF", NAME="public_NIC"

該規(guī)則表示:如果存在設(shè)備的子系統(tǒng)為net,并且地址(MACaddress) “AA:BB:CC:DD:EE:FF”,為該設(shè)備產(chǎn)生一個(gè)名為public_NIC的設(shè)備文件。

為指定大小的磁盤產(chǎn)生符號(hào)鏈接的規(guī)則

SUBSYSTEM=="block",SYSFS{size}=="71096640", SYMLINK ="my_disk"

該規(guī)則表示:如果存在設(shè)備的子系統(tǒng)為block,并且大小為71096640(block),則為該設(shè)備的設(shè)備文件名產(chǎn)生一個(gè)名為my_disk的符號(hào)鏈接。

通過(guò)外部命令為指定序列號(hào)的磁盤產(chǎn)生設(shè)備文件的規(guī)則

KERNEL=="sd*[0-9]",PROGRAM=="/lib/udev/scsi_id -g -s %p", \ RESULT=="35000c50000a7ef67",NAME +="root_disk%n"

該規(guī)則表示:如果存在設(shè)備的內(nèi)核設(shè)備名稱是以sd 開(kāi)頭( 磁盤設(shè)備),以數(shù)字結(jié)尾(磁盤分區(qū)),并且通過(guò)外部命令查詢?cè)撛O(shè)備的SCSI_ID號(hào)為“35000c50000a7ef67”,則產(chǎn)生一個(gè)以root_disk開(kāi)頭,內(nèi)核號(hào)碼結(jié)尾的設(shè)備文件,并替換原來(lái)的設(shè)備文件(如果存在的話)。例如:產(chǎn)生設(shè)備名/dev/root_disk2,替換原來(lái)的設(shè)備名/dev/sda2。

運(yùn)用這條規(guī)則,可以在/etc/fstab里保持系統(tǒng)分區(qū)名稱的一致性,而不會(huì)受驅(qū)動(dòng)加載順序或者磁盤標(biāo)簽被破壞的影響,導(dǎo)致操作系統(tǒng)啟動(dòng)時(shí)找不到系統(tǒng)分區(qū)。

 

4.3 其他常用的udev命令

udevadm testudevadm的子命令):針對(duì)一個(gè)設(shè)備,在不需要uevent觸發(fā)的情況下模擬一次udev的運(yùn)行,并輸出查詢規(guī)則文件的過(guò)程、所執(zhí)行的行為、規(guī)則文件的執(zhí)行結(jié)果。

Simulate a udevevent run for the given device, and print debugoutput

 

start_udevstart_dev命令重啟udev守護(hù)進(jìn)程,并對(duì)所有的設(shè)備重新查詢規(guī)則目錄下所有的規(guī)則文件,然后執(zhí)行所匹配的規(guī)則里的行為。通常使用該命令讓新的規(guī)則文件立即生效:

[root@test~]# start_udev

Startingudev: [ OK ]

 

start_udev一般沒(méi)有標(biāo)準(zhǔn)輸出,所有的udev相關(guān)信息都按照配置文件(udev.conf)的參數(shù)設(shè)置,由syslog記錄。



作者:SEian.G(苦練七十二變,笑對(duì)八十一難)

ITPUBhttp://blog.itpub.net/31015730/

51CTOhttp://seiang.blog.51cto.com/


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI