當前位置:首頁 » 操作系統 » linux公鑰生成

linux公鑰生成

發布時間: 2022-04-27 07:07:08

A. 如何在SecureCRT上使用公鑰登陸linux伺服器

SecureCRT部分配置
1、首先生成公鑰。
打開SecureCRT(我的版本為7.0,估計其他版本基本相同)程序,點擊菜單欄的「工具」-》「創建公鑰」。按照步驟執行。其中一步比較重要就是選擇公鑰的格式。建議選擇「OpenSSH」,否則在伺服器端使用時需要轉換為OpenSSH各式。何必多次一舉呢。所以這里必須選擇「OpenSSH」。如果選錯了。重新生成一次就可以了。
然後選擇公鑰私鑰存放的地方。默認Identity是私鑰,Identity.pub是公鑰。
2、把Identity.pub文件上傳到你要登陸的Linux伺服器上。方法有很多,比如ssh(先不要配置為公鑰登陸),ftp等。具體操作自己搞定。上傳時選擇ASCII方式。
3、在SecureCRT創建伺服器連接。協議使用ssh。在「鑒權」方法中,取消勾選「密碼」。選擇「公鑰」,然後點擊右邊的屬性按鈕,在對話框中。

使用全局公鑰設置:表示所有連接都使用該公鑰連接伺服器。
使用會話公鑰設置:可以分別為每個連接指定不同的公鑰。
下面的路徑就是指明私鑰的具體路徑。注意了,這里要指明私鑰的路徑。
保存連接就可以了。
Linux伺服器端配置
1、sshd_conf配置
vi /etc/ssh/ssh_config
主要修改如下幾個內容:
PermitRootLogin no # 默認為注釋,先配置為禁止root用戶登陸,允許root登陸太危險了。好幾次差點犯錯誤。切記切記!
RSAAuthentication yes #默認為注釋, 啟用 RSA 認證
AuthorizedKeysFile .ssh/authorized_keys # 驗證公鑰的存放路徑
PubkeyAuthentication yes # 默認為注釋,啟用公鑰認證
PasswordAuthentication no # 禁止密碼認證,默認是打開的。
保持後,重新啟動ssh服務。在不同的linux伺服器上,重啟的方法不同。
RedHat,CentOS: service sshd restart //redhat 7 的方法已經改了。
openbsd,freebsd: /etc/rc.d/sshd restart
2、重點部分:配置公鑰存放哪的問題。
要把第一部分上傳上來的公鑰放到用戶home目錄的.ssh/ 目錄下。這里說明一下。如果你想使用test賬號登陸,就要把公鑰放到test賬戶的.ssh目錄下。你可以直接把Identity.pub改為authorized_keys. 當然也可還是用其他方法。
比如:cat Identity.pub >> ~/.ssh/authorized_keys

B. linux ssh免密碼登錄可以生成多對公私鑰嗎

可以啊,私鑰存在不同地方,公鑰都寫入.ssh/authorized_keys ,支持多人免密登錄

C. 私鑰公鑰如何生成

用openssl,Linux上自帶。常用命令如下:--生成RSA私鑰(傳統格式的)openssl genrsa -out rsa_private_key.pem 1024--將傳統格式的私鑰轉換成PKCS#8格式的openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt--生成RSA公鑰openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

D. linux生成的rsa秘鑰在哪

方法一, 有的時候經常需要登錄ssh,每次都需要輸入密碼,會比較繁瑣。所以設置了一下使用RSA公鑰認證的方式登錄Linux。 首先需要在伺服器端設置/etc/ssh/sshd_config # vim /etc/ssh/sshd_config 修改如下兩行為yes。其實大多數情況下不用修改,默認就是yes。 RSAAuthentication yes PubkeyAuthentication yes (1) 如果客戶機和伺服器都是Linux機器,那麼我們使用下面的方法:(後面第2節會提到怎麼在Windows下使用Putty生成密鑰對) 我們需要在客戶端生成RSA密鑰對。使用ssh-keygen命令: # ssh-keygen -t rsa 參數t的意思是type,後面跟著加密類型,這里我們是rsa。 然後會提示你輸入密鑰保存完成文件名,這里我們需要使用默認的id_rsa,之後才能正常才能登錄。如果你生成的密鑰作為其他用處,那麼可以命名為其他名稱: Generating public/private rsa key pair. Enter file in which to save the key (/home/cake/.ssh/id_rsa): 之後會提示你輸入一個passphrase,我們這里可以留空,這樣我們登錄的時候就不許輸入密碼。 Enter passphrase (empty for no passphrase): Enter same passphrase again: 然後會提示你密鑰生成成功。這是你的私鑰保存為~/.ssh/id_rsa,你的公鑰是~/.ssh/id_rsa.pub 我們現在需要做的是,把id_rsa.pub的內容,添加的伺服器端的~/.ssh/autherized_keys文件最後。 你可以把這個文件上傳到伺服器端,然後使用命令: # cat id_rsa.pub >> ~/.ssh/autherized_keys 到這里就完成了。 (2) 在Windows下使用Putty生成密鑰對: Putty的安裝目錄下有個puttygen.exe程序,我們運行這個程序。 之後點擊Generate,開始生成密鑰對。我們需要根據提示,在指定方框內隨機滑動滑鼠。這是為了根據滑鼠軌跡,產生一些隨機數據。 之後生成結束,我們點擊Save Private Key將私鑰存放在某個目錄中。然後賦值最上面文本框中的全部內容,粘貼到Linux伺服器端的autherized_key的最後。 我們現在可以關閉這個小程序。 現在打開Putty,在左邊的選項中,選擇Conneciton–SSH–Auth,在Private key file for authentication中,選擇剛才保存的私鑰路徑就可以了。 到此位置,Putty也可以不用密碼登錄了。 方法二 使用Linux主機生成的密匙 1、生成密匙 [root@ .ssh]#ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: e4:9a:47:a7:b4:8a:0b:98:07:b8:70:de:6b:16:2c:0croot@ 2、將 /root/.ssh/id_rsa.pub改名為/root/.ssh/authorized_keys [root@ .ssh]#mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys 3、將私鑰id_rsa拷貝到遠程客戶端 1)、如果遠程客戶端是linux,拷貝到遠程客戶端/root/.ssh/即可 2)、putty作為遠程客戶端在 putty不能識別直接從伺服器拷貝來的私鑰,需要使用puttygen.exe進行格式轉換 (1)、打開puttygen.exe --> Conversions --> Import Key (2)、選擇拷貝過來的私鑰文件id_rsa (3)、Save private key->id_rsa.ppk(保存私鑰) 4、打開putty.exe 1)、Session --> Host Name (填寫伺服器地址或者域名) 2)、Connection --> SSH --> Auth (點Browse選擇剛生成的id_rsa.ppk) 3)、open 成功打開後出現如下提示: login as: root Authenticating with public key "imported-openssh-key" ---------------------------------------------------------------------------------- 當然你有可能會遇到這個錯誤 [因為我遇到了,呵呵]: Permissions 0755 for '你配置的公鑰文件路徑' are too open. 這個是因為這幾個文件許可權設置的有點問題 執行命令: chmod 600 你的文件

E. linux ssh-keygen -t rsa會生成公鑰和加密文件,但是只支持登陸無需密碼,有沒有用文件來加密和解密文件。

請使用gnupg(命令為gpg),我干過這種事,如果覺得字元界面不方便的話,可以安裝一些圖形前端,比如kde下的kgpg或者kleopatra,不但可以加密字元串,而且可以加密二進制數據
ssh-keygen生成出來的密鑰只能用來「驗證」
而你需要的是「加密」

補充回答:
gpg絕對可以,我曾經用gpg加密過4.5G的DVD iso,不過,正如你知道的那樣,公鑰體制速度是巨慢的。
假設你已經創建了密鑰對名稱為abc, 要加密M07A0bpp-Duke.pdf
gpg -e -r abc M07A0bpp-Duke.pdf
將得到的M07A0bpp-Duke.pdf.gpg發送即可
當abc解密時,輸入以下命令即可
gpg -u abc M07A0bpp-Duke.pdf.gpg

F. linux生成證書公私鑰的那副圖代表什麼意思

我來解釋一下吧,不過不知道你的那副圖是什麼。

假設A和B兩台伺服器,A需要訪問B,則在A上生成公鑰私鑰對,使用:
ssh-keygen -t rsa # 產生rsa的密鑰對
然後在A機器的這個用戶的家目錄下,~/.ssh目錄,下面有id_rsa和id_rsa.pub,分別是私鑰和公鑰。私鑰是一把鑰匙,用於解密;公鑰是一把鎖,用於加密。A訪問B,也就是A帶著鑰匙去開B的鎖,A訪問B之前,需要把A的公鑰告知B(也就是A把鎖給B),也就是A的id_rsa.pub(公鑰)里的內容寫入B的某個用戶的家目錄下,~/.ssh目錄下的authorized_keys文件(默認不存在)。請確保authorized_keys許可權為600,不然A無法訪問B。因為這個文件是安全文件,許可權不對,Linux會認為不安全。

G. 如何建立linux ssh信任的方法與常見問題

在Linux伺服器之間建立信任關系,是很多線上服務系統的基礎性工作,這樣能便於程序在多台伺服器之間自動傳輸數據,或者方便用戶不輸入密碼就可以在不同的主機間完成登錄或者各種操作。

網上關於建立Linux信任關系(ssh trust)的中文文章有一些,但是寫得都不太詳細,這里匯總了方方面面的資料,把多機信任關系建立方法說說清楚(文/陳運文)

一 建立信任關系的基本操作

基本場景是想從一台Server伺服器直接登錄另一台,或者將Server伺服器的數據不需密碼驗證直接拷貝至Client伺服器,以下我們簡稱Server伺服器為S(待發送的數據文件在這台伺服器上),Client服務為C,信任關系的最簡單操作方法如下:

1 在S伺服器上,進入當前用戶根目錄下的隱藏目錄 .ssh,命令如下:

cd ~/.ssh

(註:目錄名前的點好」.」表示該文件夾是一個特殊的隱藏文件夾,ls命令下默認是看不到的,通過 ls –a 命令觀察到)

2 生成S伺服器的私鑰和公鑰:

ssh-keygen -t rsa

(註:rsa是一種加密演算法的名稱,此處也可以使用dsa,關於rsa和dsa演算法的介紹可見本文後半章節)

ssh-keygen生成密鑰用於信任關系生成

-此時會顯示Generating public/private key pair. 並提示生成的公鑰私鑰文件的存放路徑和文件名,默認是放在 /home/username/.ssh/id_rsa 這樣的文件里的,通常不用改,回車就可以

然後Enter passphrase(empty for no passphrase): 通常直接回車,默認不需要口令

Enter same passphrase again: 也直接回車

然後會顯式密鑰fingerprint生成好的提示,並給出一個RSA加密協議的方框圖形。此時在.ssh目錄下ls,就可以看到生成好的私鑰文件id_rsa和公鑰文件id_rsa.pub了

以下是各種補充說明:

注1:如果此時提示 id_rsaalready exists,Overwrite(y/n) 則說明之前已經有人建好了密鑰,此時選擇n 忽略本次操作就行,可以直接用之前生成好的文件;當然選y覆蓋一下也無妨

注2:公鑰用於加密,它是向所有人公開的(pub是公開的單詞public的縮寫);私鑰用於解密,只有密文的接收者持有。

3 在Server伺服器上載入私鑰文件

仍然在.ssh目錄下,執行命令:

ssh-add id_rsa

系統如果提示:Identity added: id_rsa (id_rsa) 就表明載入成功了

下面有幾個異常情況處理:

–如果系統提示:could not open a connection to your authentication agent

則需要執行一下命令:

ssh-agent bash

然後再執行上述的ssh-add id_rsa命令

–如果系統提示id_rsa: No such file or directory

這是系統無法找到私鑰文件id_rsa,需要看看當前路徑是不是不在.ssh目錄,或者私鑰文件改了名字,例如如果建立的時候改成 aa_rsa,則這邊命令中也需要相應改一下

-如果系統提示 command not found,那肯定是你命令敲錯字元了J

-提示Agent admitted failure to sign using the key,私鑰沒有載入成功,重試ssh-add

-注意id_rsa/id_rsa.pub文件不要刪除,存放在.ssh目錄下

4 把公鑰拷貝至Client伺服器上

很簡單,例如 scp id_rsa.pub [email protected]:~

5 ssh登錄到Client伺服器上,然後在Client伺服器上,把公鑰的內容追加到authorized_keys文件末尾(這個文件也在隱藏文件夾.ssh下,沒有的話可以建立,沒有關系)

cat id_rsa.pub >> ~/.ssh/authorized_keys

以下是各種補充說明,遇到問題時可以參考:

注1:這里不推薦用文件覆蓋的方式,有些教程直接scp id_rsa.pub 到Client伺服器的authorized_keys文件,會導致之前建的其他信任關系的數據被破壞,追加到末尾是更穩妥的方式;

注2: cat 完以後,Client伺服器上剛才拷貝過來的id_rsa.pub文件就不需要了,可以刪除或移動到其它地方)

注3:ssh-keygen 命令通過-b參數可以指定生成的密鑰文件的長度,如果不指定則默認為1024,如果ssh-keygen –b 4096(最長4096),則加密程度提高,但是生成和驗證時間會增加。對一般的應用來說,默認長度已經足夠勝任了。如果是rsa加密方式,那麼最短長度為768 byte

注4:authorized_keys文件的許可權問題。如果按上述步驟建立關系後,仍然要驗證密碼,並且沒有其他報錯,那麼需要檢查一下authorized_keys文件的許可權,需要作下修改: chmod g-w authorized_keys

OK,現在試試在Server端拷貝一個文件到Client伺服器,應該無需交互直接就傳過去了。

但是此時從Client傳數據到Server伺服器,仍然是需要密碼驗證的。如果需要兩台伺服器間能直接互傳數據,則反過來按上述步驟操作一下就可以了

二 刪除伺服器間信任關系的方法

如果想取消兩台伺服器之間的信任關系,直接刪除公鑰或私鑰是沒有用的,需要在Client伺服器上,打開 ~/.ssh/ authorized_keys 文件,找到對應的伺服器的公鑰欄位並刪除

每個段落的開頭是ssh-rsa字樣,段尾是Server伺服器的帳號和ip(如下圖紅框),需要細心的找一下後刪除整段

密鑰文件內容和刪除Linux伺服器間信任關系的方法

三 各種可能遇到的情況和處理方法

–提示 port 22: Connection refused

可能的原因:沒有正確安裝最新的openssh-server,安裝方法如下

sudo apt-get install openssh-server

不支持apt安裝的,可以手工下載:

wget ftp.ssh.com/pub/ssh/ssh-3.2.9.1.tar.gz

–關於目錄和文件的許可權設置

.ssh目錄的許可權必須是700,同時本機的私鑰的許可權必須設置成600:

chmod 600 id_rsa

否則ssh伺服器會拒絕登錄

四 關於RSA和DSA加密演算法

在ssh-keygen命令中,-t參數後指定的是加密演算法,可以選擇rsa或者dsa

RSA 取名自演算法的三位提出者Ron Rivest, Adi Shamir, and Leonard Adleman的姓名首字母,作為一種非對稱加密演算法,RSA的安全性基於及其困難的大整數分解(兩個素數的乘積的還原問題)。關於RSA演算法原理的文章很多,感興趣的朋友可以找來讀一讀。

DSA = Digital Signature Algorithm,基於有限域離散對數難題,是Schnorr和ElGamal簽名演算法的變種,一般用於數字簽名和認證,被美國標准局(NIST)採納為數字簽名標准DSS(Digital Signature Standard),based on discrete logarithms computation.

DES = Digital Encryption Standard. Obsolete standard.

RSA演算法好在網路容易實現密鑰管理,便進行數字簽名,演算法復雜,加/解速度慢,採用非對稱加密。在實際用於信任關系建立中,這兩種方法的差異很微小,可以挑選其一使用。

五 關於SSH協議的介紹

SSH全稱Secure SHell,顧名思義就是非常安全的shell的意思,SSH協議是IETF(Internet Engineering Task Force)的Network Working Group所制定的一種協議。SSH的主要目的是用來取代傳統的telnet和R系列命令(rlogin,rsh,rexec等)遠程登陸和遠程執行命令的工具,實現對遠程登陸和遠程執行命令加密。防止由於網路監聽而出現的密碼泄漏,對系統構成威脅。

ssh協議目前有SSH1和SSH2,SSH2協議兼容SSH1。目前實現SSH1和SSH2協議的主要軟體有OpenSSH和SSH Communications Security Corporation公司的SSH Communications 軟體。前者是OpenBSD組織開發的一款免費的SSH軟體,後者是商業軟體,因此在linux、FreeBSD、OpenBSD、NetBSD等免費類UNIX系統種,通暢都使用OpenSSH作為SSH協議的實現軟體。因此,本文重點介紹一下OpenSSH的使用。需要注意的是OpenSSH和SSH Communications的登陸公鑰/私鑰的格式是不同的,如果想用SSH Communications產生的私鑰/公鑰對來登入到使用OpenSSH的linux系統需要對公鑰/私鑰進行格式轉換。

第一次登陸後,ssh就會把登陸的ssh指紋存放在用戶home目錄的.ssh目錄的know_hosts文件中,如果遠程系統重裝過系統,ssh指紋已經改變,你需要把 .ssh 目錄下的know_hosts中的相應指紋刪除,再登陸回答yes,方可登陸。請注意.ssh目錄是開頭是」.」的隱藏目錄,需要ls –a參數才能看到。而且這個目錄的許可權必須是700,並且用戶的home目錄也不能給其他用戶寫許可權,否則ssh伺服器會拒絕登陸。如果發生不能登陸的問題,請察看伺服器上的日誌文件/var/log/secure。通常能很快找到不能登陸的原因。

六 關於ssh_config和sshd_config文件配置的說明

/etc/ssh/ssh_config:

Host *

選項「Host」只對能夠匹配後面字串的計算機有效。「*」表示所有的計算機。

ForwardAgent no

「ForwardAgent」設置連接是否經過驗證代理(如果存在)轉發給遠程計算機。

ForwardX11 no

「ForwardX11」設置X11連接是否被自動重定向到安全的通道和顯示集(DISPLAY set)。

RhostsAuthentication no

「RhostsAuthentication」設置是否使用基於rhosts的安全驗證。

RhostsRSAAuthentication no

「RhostsRSAAuthentication」設置是否使用用RSA演算法的基於rhosts的安全驗證。

RSAAuthentication yes

「RSAAuthentication」設置是否使用RSA演算法進行安全驗證。

PasswordAuthentication yes

「PasswordAuthentication」設置是否使用口令驗證。

FallBackToRsh no

「FallBackToRsh」設置如果用ssh連接出現錯誤是否自動使用rsh。

UseRsh no

「UseRsh」設置是否在這台計算機上使用「rlogin/rsh」。

BatchMode no

「BatchMode」如果設為「yes」,passphrase/password(互動式輸入口令)的提示將被禁止。當不能互動式輸入口令的時候,這個選項對腳本文件和批處理任務十分有用。

CheckHostIP yes

「CheckHostIP」設置ssh是否查看連接到伺服器的主機的IP地址以防止DNS欺騙。建議設置為「yes」。

StrictHostKeyChecking no

「StrictHostKeyChecking」如果設置成「yes」,ssh就不會自動把計算機的密匙加入「$HOME/.ssh/known_hosts」文件,並且一旦計算機的密匙發生了變化,就拒絕連接。

IdentityFile ~/.ssh/identity

「IdentityFile」設置從哪個文件讀取用戶的RSA安全驗證標識。

Port 22

「Port」設置連接到遠程主機的埠。

Cipher blowfish

「Cipher」設置加密用的密碼。

EscapeChar ~

「EscapeChar」設置escape字元。

/etc/ssh/sshd_config:

Port 22

「Port」設置sshd監聽的埠號。

ListenAddress 192.168.1.1

「ListenAddress」設置sshd伺服器綁定的IP地址。

HostKey /etc/ssh/ssh_host_key

「HostKey」設置包含計算機私人密匙的文件。

ServerKeyBits 1024

「ServerKeyBits」定義伺服器密匙的位數。

LoginGraceTime 600

「LoginGraceTime」設置如果用戶不能成功登錄,在切斷連接之前伺服器需要等待的時間(以秒為單位)。

KeyRegenerationInterval 3600

「KeyRegenerationInterval」設置在多少秒之後自動重新生成伺服器的密匙(如果使用密匙)。重新生成密匙是為了防止用盜用的密匙解密被截獲的信息。

PermitRootLogin no

「PermitRootLogin」設置root能不能用ssh登錄。這個選項一定不要設成「yes」。

IgnoreRhosts yes

「IgnoreRhosts」設置驗證的時候是否使用「rhosts」和「shosts」文件。

IgnoreUserKnownHosts yes

「IgnoreUserKnownHosts」設置ssh daemon是否在進行RhostsRSAAuthentication安全驗證的時候忽略用戶的「$HOME/.ssh/known_hosts」

StrictModes yes

「StrictModes」設置ssh在接收登錄請求之前是否檢查用戶家目錄和rhosts文件的許可權和所有權。這通常是必要的,因為新手經常會把自己的目錄和文件設成任何人都有寫許可權。

X11Forwarding no

「X11Forwarding」設置是否允許X11轉發。

PrintMotd yes

「PrintMotd」設置sshd是否在用戶登錄的時候顯示「/etc/motd」中的信息。

SyslogFacility AUTH

「SyslogFacility」設置在記錄來自sshd的消息的時候,是否給出「facility code」。

LogLevel INFO

「LogLevel」設置記錄sshd日誌消息的層次。INFO是一個好的選擇。查看sshd的man幫助頁,已獲取更多的信息。

RhostsAuthentication no

「RhostsAuthentication」設置只用rhosts或「/etc/hosts.equiv」進行安全驗證是否已經足夠了。

RhostsRSAAuthentication no

「RhostsRSA」設置是否允許用rhosts或「/etc/hosts.equiv」加上RSA進行安全驗證。

RSAAuthentication yes

「RSAAuthentication」設置是否允許只有RSA安全驗證。

PasswordAuthentication yes

「PasswordAuthentication」設置是否允許口令驗證。

PermitEmptyPasswords no

「PermitEmptyPasswords」設置是否允許用口令為空的帳號登錄。

AllowUsers admin

「AllowUsers」的後面可以跟著任意的數量的用戶名的匹配串(patterns)或user@host這樣的匹配串,這些字元串用空格隔開。主機名可以是DNS名或IP地址。

H. linux ssh rsa 生成的是什麼東西

ssh-keygen創建的是一個rsa公鑰
一般用於免密碼登陸,將你的公鑰放到linux上的指定目錄下,然後登陸時會校驗你的私鑰和公鑰對是否匹配,匹配就可以直接登陸了
私鑰存放在你自己的電腦上,並需要保存好不能外泄

I. linux內核模塊簽名公鑰在哪

這篇文章主要介紹了Linux內核模塊的相關概念,以及簡單的模塊開發過程。主要從模塊開發中的常用指令、內核模塊程序的結構、模塊使用計數以及模塊的編譯等角度對內核模塊進行介紹。在Linux系統開發過程中,以模塊的形式開發其重要性不言自明,而在嵌入式設備驅動開發中將驅動程序以模塊的形式發布,更是極大地提高了設備使用的靈活性——用戶只需要拿到相關驅動模塊,再插入到用戶的內核中,即可靈活地使用你的設備。
二. 文章提綱
1. 摘要
2. 文章提綱
3. 概述
4. 模塊開發常用的指令
5. 內核模塊程序結構
6. 模塊使用計數
7. 模塊的編譯
8. 使用模塊繞開GPL
9. 總結
三.概述
Linux內核整體結構已經很龐大,包含了很多的組件,而對於我們工程師而言,有兩種方法將需要的功能包含進內核當中。
一:將所有的功能都編譯進Linux內核。
二:將需要的功能編譯成模塊,在需要的時候動態地添加。
上述兩種方式優缺點分析:
第一種:
優點:不會有版本不兼容的問題,不需要進行嚴格的版本檢查
缺點:生成的內核會很大;要在現有的內核中添加新的功能,則要編譯整個內核
第二種:
優點:模塊本身不編譯進內核,從而控制了內核的大小;模塊一旦被載入,將和其它的部分完全一樣。
缺點:可能會有內核與模塊版本不兼容的問題,導致內核崩潰;會造成內存的利用率比較低。

四.模塊開發常用的指令
在內核模塊開發的過程中常用的有以下指令。
1) insmod: 將模塊插入內核中,使用方法:#insmod XXX.ko
2) rmmod: 將模塊從內核中刪除,使用方法:#rmmod XXX.ko
3) lsmod: 列表顯示所有的內核模塊,可以和grep指令結合使用。使用方法:#lsmod | grep XXX
4) modprobe: modprobe可載入指定的個別模塊,或是載入一組相依賴的模塊。modprobe會根據depmod所產生的依賴關系,決定要載入哪些模塊。若在載入過程中發生錯誤,在modprobe會卸載整組的模塊。依賴關系是通過讀取 /lib/moles/2.6.xx/moles.dep得到的。而該文件是通過depmod 所建立。
5) modinfo: 查看模塊信息。使用方法:#modinfo XXX.ko
6) tree –a: 查看當前目錄的整個樹結構。使用方法:#tree -a

五.內核模塊程序結構
1) 模塊載入函數(一般需要)
在用insmod或modprobe命令載入模塊時,該函數被執行。完成模塊的初始化工作。
Linux內核的模塊載入函數一般用__init標識聲明,模塊載入函數必須以mole_init(函數名)的形式被指定。該函數返回整型值,如果執行成功,則返回0,初始化失敗時則返回錯誤編碼,Linux內核當中的錯誤編碼是負值,在<linux/errno.h>中定義。
在Linux中,標識__init的函數在連接時放在.init.text這個區段,而且在.initcall.init中保留一份函數指針,初始化的時候內核會根據這些指針調用初始化函數,初始化結束後釋放這些init區段(包括前兩者)。
代碼清單:

1 static int __init XXX_init(void)
2
3 {
4
5 return 0;
6 }
7
8
9
10 moudle_init(XXX_init);

2) 模塊卸載函數(一般需要)
在用rmmod或modprobe命令卸載模塊時,該函數被執行。完成與載入相反的工作。
模塊的卸載函數和模塊載入函數實現相反的功能,主要包括
若模塊載入函數注冊了XXX,則模塊卸載函數注銷XXX
若模塊載入函數動態分配了內存,則模塊卸載函數釋放這些內存
若模塊載入函數申請了硬體資源,則模塊卸載函數釋放這些硬體資源
若模塊載入函數開啟了硬體資源,則模塊卸載函數一定要關閉這些資源
代碼清單:

1 static void __exit XXX_exit(void)
2
3 {
4
5 }
6
7
8
9 moudle_exit(XXX_exit);

3) 模塊許可證聲明(必須)
如果不聲明,則在模塊載入時會收到內核被污染的警告,一般應遵循GPL協議。
代碼清單:
1 MODULE_LICENSE("GPL");

4) 模塊參數(可選)
模塊在被載入時傳遞給模塊的值,本身應該是模塊內部的全局變數。
示常式序book.c

1 #include <linux/init.h>
2
3 #include <linux/mole.h>
4
5
6
7 static char *bookName = "Good Book.";
8
9 static int bookNumber = 100;
10
11
12
13 static int __init book_init(void)
14
15 {
16
17 printk(KERN_INFO "Book name is %s\n", bookName);
18
19 printk(KERN_INFO "Book number is %d\n", bookNumber);
20
21 return 0;
22
23 }
24
25
26
27 static void __exit book_exit(void)
28
29 {
30
31 printk(KERN_INFO "Book mole exit.\n");
32
33 }
34
35
36
37 mole_init(book_init);
38
39 mole_exit(book_exit);
40
41 mole_param(bookName, charp, S_IRUGO);
42
43 mole_param(bookNumber, int, S_IRUGO);
44
45
46
47 MODULE_LICENSE("GPL");

在向內核插入模塊的時候可以用以下方式,並且可以在內核日誌中看到模塊載入以後變數已經有了值。

5) 模塊導出符號(可選)
使用模塊導出符號,方便其它模塊依賴於該模塊,並使用模塊中的變數和函數等。
在Linux2.6的內核中,/proc/kallsyms文件對應著符號表,它記錄了符號和符號對應的內存地址。對於模塊而言,使用下面的宏可以導出符號。
1 EXPORT_SYMBOL(符號名);


1 EXPORT_GPL_SYMBOL(符號名);

6) 模塊信息(可選)
模塊信息則是指模塊的作者信息等。

六.模塊使用計數
Linux內核提供了MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT宏來管理模塊使用計數。但是對於內核模塊而言,一般不會自己管理使用計數。

七.模塊的編譯
將下面的Makefile文件放在book.c同級的目錄下,然後使用#make命令或者#make all命令編譯即可生成book.ko模塊文件。
對應的Makefile:

1 ifneq ($(KERNELRELEASE),)
2
3 mymole_objs := book.o
4
5 obj-m := book.o
6
7 else
8
9 PWD := $(shell pwd)
10
11 KVER ?= $(shell uname -r)
12
13 KDIR := /usr/src/linux-headers-2.6.38-8-generic
14
15
16
17 all:
18
19 $(MAKE) -C $(KDIR) M=$(PWD)
20
21 clean:
22
23 rm -rf *.mod.c *.mod.o *.ko *.o *.tmp_versions *.order *symvers
24
25 endif

八.使用模塊繞開
如果功能不編譯成模塊,則無法繞開GPL,編譯成模塊後公司發布產品則只需要發布模塊,而不需要發布源碼。為了Linux系統能夠支持模塊,需要做以下的工作:
內核編譯時選擇「可以載入模塊」,嵌入式產品一般都不需要卸載模塊,則可以不選擇「可卸載模塊」
將我們的ko文件放在文件系統中
Linux系統實現了insmod、rmmod等工具
使用時可以用insmod手動載入模塊,也可以修改/etc/init.d/rcS文件,從而在系統啟動的時候就載入模塊。

熱點內容
hill加密與解密 發布:2024-10-04 03:14:20 瀏覽:311
安卓平板保修時長在哪裡看 發布:2024-10-04 02:34:35 瀏覽:333
電腦中的ip配置是什麼 發布:2024-10-04 02:34:34 瀏覽:801
jni加密 發布:2024-10-04 02:15:57 瀏覽:656
民安監控密碼多少 發布:2024-10-04 02:11:32 瀏覽:433
調頻廣播伺服器地址 發布:2024-10-04 02:06:46 瀏覽:204
路由和遠程訪問伺服器的配置 發布:2024-10-04 01:30:05 瀏覽:571
nfs編譯 發布:2024-10-04 01:28:46 瀏覽:586
消滅病毒三百關後用什麼伺服器 發布:2024-10-04 00:57:56 瀏覽:482
什麼叫php 發布:2024-10-04 00:57:23 瀏覽:34