❶ ubuntu內核編譯需要多長時間
在分析linux內核源碼的過程中,要是能夠修改內核源碼並運行修改後的內核,我想肯定是令人高興的事,哪怕第一次修改僅僅是在啟動時列印一行"Hello, Wang Jiankun!",肯定也是令我高興的。為了能成功編譯修改後的內核,今天先編譯一遍內核。
為了有一個完整的記錄,今天的起點是一台裸機。
1、在裸機上安裝一個最小的debian系統
為了能夠盡可能清晰的顯示編譯一個內核所需要的組件,在安裝系統時,僅僅安裝最小系統,然後需要什麼,就使用apt-get安裝什麼。
使用網路安裝,在安裝過程中出現Software selection界面時不要選擇任何選項,這樣安裝的系統將是最小的系統。
為了使用ssh遠程登錄,最小系統安裝完成後,要安裝ssh伺服器並且要設置靜態ip地址(debian安裝過程中是通過dhcp獲取的ip地址)。
2、安裝ssh伺服器
apt-get install ssh
3、設置靜態ip地址
修改文件/etc/network/interfaces,其中藍色部分是增加的,紅色部分是屏蔽掉的,黑色部分是沒有變化的。
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
# Wang Jiankun commented the following line
#iface eth0 inet dhcp
# Wang Jiankun added the the following lines
iface eth0 inet static
address 192.168.1.251
netmask 255.255.255.0
broadcast 192.168.1.255
network 192.168.1.0
gateway 192.168.1.1
重啟系統後,修改將生效。
4、通過wget下載linux內核源碼
administrator@wangjk:~/kernel$ wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.19.tar.bz2
5、解壓文件linux-2.6.19.tar.bz2
administrator@wangjk:~/kernel$ tar jxf linux-2.6.19.tar.bz2
tar: bzip2: Cannot exec: No such file or directory
tar: Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error exit delayed from previous errors
administrator@wangjk:~/kernel$
看來是沒有bzip2這個包,那就安裝一個:
apt-get install bzip2
6、安裝debian的kernel-package軟體包
在安裝kernel-package軟體包時,最好使用命令:apt-get build-dep kernel-package,而不要使用命令:
apt-get install kernel-package,後者安裝的軟體包是前者的子集,使用後者安裝kernel-package軟體包後,執行make menuconfig命令會出現頭文件找不到的錯誤,如下所示:
administrator@wangjk:~/kernel/linux-2.6.19$ make menuconfig
HOSTCC scripts/basic/fixdep
scripts/basic/fixdep.c:105:23: error: sys/types.h: No such file or directory
scripts/basic/fixdep.c:106:22: error: sys/stat.h: No such file or directory
scripts/basic/fixdep.c:107:22: error: sys/mman.h: No such file or directory
scripts/basic/fixdep.c:108:20: error: unistd.h: No such file or directory
scripts/basic/fixdep.c:109:19: error: fcntl.h: No such file or directory
scripts/basic/fixdep.c:110:20: error: string.h: No such file or directory
scripts/basic/fixdep.c:111:20: error: stdlib.h: No such file or directory
scripts/basic/fixdep.c:112:19: error: stdio.h: No such file or directory
主要是因為libc6-dev軟體包沒有安裝。所以即使使用了apt-get install kernel-package還得使用apt-get build-dep kernel-package,不如一次使用apt-get build-dep kernel-package完成方便。
7、安裝libncurses5-dev軟體包來支持make menuconfig
通過apt-get build-dep kernel-package安裝完成kernel-package後,執行make menuconfig仍然報錯,如下所示:
administrator@wangjk:~/kernel/linux-2.6.19$ make menuconfig
HOSTCC scripts/kconfig/lxdialog/checklist.o
In file included from scripts/kconfig/lxdialog/checklist.c:24:
scripts/kconfig/lxdialog/dialog.h:32:20: error: curses.h: No such file or directory
In file included from scripts/kconfig/lxdialog/checklist.c:24:
scripts/kconfig/lxdialog/dialog.h:97: error: expected specifier-qualifier-list before 'chtype'
scripts/kconfig/lxdialog/dialog.h:187: error: expected ')' before '*' token
scripts/kconfig/lxdialog/dialog.h:193: error: expected ')' before '*' token
scripts/kconfig/lxdialog/dialog.h:195: error: expected ')' before '*' token
scripts/kconfig/lxdialog/dialog.h:196: error: expected ')' before '*' token
scripts/kconfig/lxdialog/dialog.h:197: error: expected ')' before '*' token
scripts/kconfig/lxdialog/dialog.h:198: error: expected ')' before '*' token
scripts/kconfig/lxdialog/dialog.h:200: error: expected ')' before '*' token
scripts/kconfig/lxdialog/checklist.c:31: error: expected ')' before '*' token
scripts/kconfig/lxdialog/checklist.c:59: error: expected ')' before '*' token
scripts/kconfig/lxdialog/checklist.c:95: error: expected ')' before '*' token
[省略其後部分]
原來是最小系統不支持圖形的原因,安裝libncurses5-dev後即可。
8、將系統的config文件拷貝到內核目錄下
cp /boot/config-2.6.18-6-686 ./.config
9、執行make menuconfig
雖然是將原來系統的config文件拷貝過來的,但是如果所以的配置都採用默認的配置仍然會有問題,在我的系統上在載入文件系統時會死掉,所以還是要做必要的配置,主要是將scsi和sata部分編譯進內核而不要編譯成模塊,如下所示:
Device Drivers --->
Serial ATA (prod) and Parallel ATA (experimental) drivers --->
SCSI device support --->
將藍色兩部分級聯的選項全部編譯進內核(其實沒有必要全部,但為了簡單起見,暫時這樣做)。
10、安裝fakeroot軟體包
11、編譯內核
fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_image
12、安裝內核
wangjk:/home/administrator/kernel# dpkg -i linux-image-2.6.19_custom.1.0_i386.deb
Selecting previously deselected package linux-image-2.6.19.
(Reading database ... 17679 files and directories currently installed.)
Unpacking linux-image-2.6.19 (from linux-image-2.6.19_custom.1.0_i386.deb) ...
Done.
Setting up linux-image-2.6.19 (custom.1.0) ...
Running depmod.
Finding valid ramdisk creators.
Using mkinitramfs-kpkg to build the ramdisk.
Running postinst hook script /sbin/update-grub.
You shouldn't call /sbin/update-grub. Please call /usr/sbin/update-grub instead!
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.19
Found kernel: /boot/vmlinuz-2.6.18-6-686
Updating /boot/grub/menu.lst ... done
13、重啟系統引導新內核後查看版本號
administrator@wangjk:~$ cat /proc/version
Linux version 2.6.19 (root@wangjk) (gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)) #1 SMP Thu May 7 21:52:10 CST 2009
administrator@wangjk:~$
可以看出已經是我編譯的內核了。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jiankun_wang/archive/2009/05/04/4147806.aspx
------------------------------------
ubuntu不帶linux內核源碼,需要自己下載安裝。
1,查看自己的內核版本
uname -r
2,查看源內的內核源碼類表
apt-cache search linux-source
3,下載安裝內核源代碼
sudo apt-get install linux-source-2.6.27 //我選的是這一個,自己看著辦吧
4,等待........
下載完成後,在/usr/src下會有一個文件名為linux-source-2.6.xx.tar.bz2的壓縮包
5,解壓縮包
tar jxvf linux-source-2.6.27.tar.bz2 //看清自己的版本
解壓後會生成一個源代碼目錄/usr/src/linux-source-2.6.27
6,進入源碼目錄後,配置文件
make oldconfig
7,生成內核
make
8,瘋狂等待,大約1個多小時
9,編譯模塊
make moles
10,安裝模塊
make moles_install
大功告成!^_^
下面說一下Makefile文件
$(MAKE) -C $(KERNELDIR) M=$(PWD) moles_install #PWD當前工作目錄的變數
obj-m := hello.o
#hello.o是你要生成的驅動,以後可以自己改
KERNELDIR:=/lib/moles/2.6.27-7-generic/build
#這里別抄,寫成你自己的版本,這個目錄執行了內核源碼目錄
PWD:=$(shell pwd) #將當前工作目錄賦值該PWD
moles:
$(MAKE) -C $(KERNELDIR) M=$(PWD) moles
moles_install:
下面是一個經典的Hello,world!例子自己make一下就行了。
#include <linux/init.h>
#include <linux/mole.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT"Goodbye, cruel world!\n");
}
mole_init(hello_init);
mole_exit(hello_exit);
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/unikingest/archive/2009/03/10/3977747.aspx
-----------------------------------------------------------------------------
修改的這篇文章,自己加了幾個注意點
http://blog.theosoft.net/article.asp?id=57
第一次的Linux kernel上機內容是編譯一個內核。我用的是Ubuntu,有很多地方和其它 Linux不一樣,所以就來把我的過程寫下來,以後也好有個參照
首先當然是下載內核源代碼,如果你要最新的內核,可以去ftp.kernel.org。當然,國內速度可能會很慢。如果你是教育網用戶,可以去上海交大的鏡像站下載,地址是http://ftp.sjtu.e.cn/sites/ftp.kernel.org/,缺點就是沒有最新的內核(更新需要一定的時間)。
==================================================備注
如果是就是編譯ubuntu本省自帶的內核,只需要
新立得搜索linux souce,下載帶ubuntupatch的kernel的source code。
sudo apt-get source linux-source-2.6.27
==================================================備注
我下載的是linux-2.6.19.2.tar.gz可以下到的最新版本了。下完之後當然是解壓縮。不過還不能直接編譯,因為Ubuntu的默認安裝里缺少必要的組建。打開終端,輸入一下命令:
sudo -i
apt-get install build-essential kernel-package libncurses5-dev
然後到新立得里把所有以ncurses開頭的軟體包全部裝上,這樣就可以開始編譯內核了。
先運行以下命令,復制當前內核的配置文件。
cp /boot/config-`uname -r` ./.config
然後
make menuconfig
選擇 "Load an Alternate Configuration File",再選擇你剛才拷貝過來的.config文件作為配置文件。然後確定。當結束後,你選擇退出時,會提示問你 "Do you wish to save your new kernel configuration?"選擇yes即可。
接下來就要編譯了。輸入命令:
make
你也可以將編譯任務分成2個線程來執行,只要輸入:
make -j2
編譯一般需要1~1.5小時左右,就看cpu的性能如何
編譯完成後,開始安裝:
make mole_install
make install
然後添加引導信息,不過之前還是要裝一個組件initramfs-tools,裝完以後輸入:
mkinitramfs -o /boot/initrd.img-2.X.XX /lib/moles/2.X.XX
==================================================備注
後面的參數不要忘記了,否則啟動新內核會出現錯誤:
WARNING: Couldn』t open directory /lib/moles/2.6.15.7-ubuntu1: No such file or directory
FATAL: Could not open /lib/moles/2.6.15.7-ubuntu1/moles.dep.temp for writing: No such file or directory
==================================================備注
最後打開 /boot/grub/menu.lst
在 ## ## End Default Options ## 下面添加類似下面的兩段
title Ubuntu, kernel 2.6.19.2
root (hd0,4)
kernel /vmlinuz-2.6.19.2 root=/dev/hdd6
initrd /initrd.img-2.6.19.2
savedefault
boot
title Ubuntu, kernel 2.6.19.2 (recovery mode)
root (hd0,4)
kernel /vmlinuz-2.6.19.2 root=/dev/hdd6 ro single
initrd /initrd.img-2.6.19.2
boot
注意 root和kernel欄位要模仿menu.lst下面已有的內容寫。下面是 (hd0,4),那麼你也寫(hd0,4),下面寫root=/dev/hdd6,你也寫root=/dev/hdd6,只是內核的版本號改為現在編譯的版本號。然後重新啟動計算機,在GRUB中選擇新內核啟動。如果啟動失敗,你可以重啟選擇老內核。
❷ linux from scratch 怎麼操作
linux from scratch 操作:
第一部分:環境設置
1、安裝VirtualBox3.1.8
2、安裝Linux操作系統(RHEL或Centos等,不能用ubuntu,因為要有patch,m4,-1.4.10,autoconf,yacc等程序)
3、安裝增強功能並分配固定數據空間,設置/mnt/share共享:
mount -t vboxsf share /mnt/share
如果要開機就掛上共享,可以在/etc/fstab的最後加上
share /mnt/share vboxsf rw,gid=100,uid=1000,auto 0 0
4、解壓lfslivecd-x86-6.3-42145.iso里的lfs-sources到share
#另外,也可以不用安裝操作系統,直接用lfslivecd-x86-6.3-42145.iso作啟動盤;
#啟動後選/Asia/shanghai及Chinese(simpifiled utf8),然後可以用cfdisk /dev/hda進行分區
#啟動盤的/usr/share/LFS-BOOK-6.3-HTML目錄下就是LFS手冊
#由於要復制粘貼,所以要開啟ssh服務,virtualbox設置的網路里將NAT(網格地址轉換)改為Bridged Adapter,界面名稱選1x1
11b/g/n Wireless LAN PCI Express Half Mini Card Adapter(這是我的無線卡).
#啟動後用ifconfig就能查看地址,然後再用passwd給root設個密碼(不然客戶端不能登錄)
#然後啟動服務/etc/rc.d/init.d/sshd start
#最後再Windows里用putty連接ssh伺服器(在Session界面的HostName里輸入IP,Connection
Type里選SSH即可)。
#如果要用putty傳輸文件,則打開cmd窗口,輸入命令:pscp 源文件路徑 root@hostIp:目的路徑
如將aaa.jpg傳到/home下,則:pscp aaa.jpg [email protected]:/home
5、將/mnt/share/lfs-sources設置到根目錄的lfs-sources:
ln -s /mnt/share/lfs-sources /
6、添加一個8G的虛擬硬碟(硬碟大小最好不小於2G)
7、分區並格式化硬碟:
8、生成sources及tools目錄
9.將tools掛至根目錄:
ln -sv $LFS/tools /
10.生成lfs用戶
11.生成lfs用戶環境
12.重新進入環境
第二部分:工具鏈製作
13.編譯binutils
14.編譯gcc
15.安裝內核頭文件Linux API Headers
16.編譯Glibc-2.5.1
17.調整工具鏈
18.測試工具鏈的調整
19.測試工具安裝
20.GCC安裝(第二遍)
21.安裝Binutils(第二遍)
22.安裝Ncurses
23.安裝Bash
24.安裝Bzip
25.安裝Coreutils
26.安裝Diffutils
27.安裝Fintils
28.安裝Gawk
29.Gettext
30.Grep
31.Gzip
32.Make
33.Patch
34.安裝Perl
35.安裝Sed
36.安裝Tar
37.安裝Texinfo
38.安裝Util-linux
39.刪除些不用的東西(可不執行)
第三部分 主機中設置lfs
40.回到主機並建三個目錄
41.建設備文件
43.復制源碼到目標系統下
44.chroot到目標系統下(將新盤作為根目錄)
45.建立目標系統目錄結構
46.創建幾個必要的鏈接
47.創建root及nobody用戶組
48.重載入bash
第四部分 軟體包安裝
50.重啟的環境恢復
51.進入軟體包目錄
52.安裝Linux頭
53.安裝Man-pages
54.安裝Glibc
55.調整工具鏈
56.調整specs文件
57.測試是否調整成功
58.安裝Binutils
59.安裝GCC
60.測試GCC是否安裝正確
61.安裝Berkeley
62.安裝Sed
63.安裝E2fsprogs
64.安裝Coreutils
65.安裝Iana-Etc
66.安裝M4-1.4.10
67.安裝Bison
68.安裝Ncurses
69.安裝Procps
70.安裝Libtool
71.安裝Perl
72.安裝Readline
73.安裝Zlib
74.安裝Autoconf
75.安裝Automake
76.安裝Bash
77.安裝Bzip
78.安裝Diffutils
79.安裝File
80.安裝Fintils
81.Flex
82.安裝Grub
83.安裝Gawk
84.安裝Gettext
85.安裝Grep
86.安裝Groff
87.安裝Gzip
88.安裝Inetutils
89.安裝IPRoute
90.安裝kbd
91.安裝Less
92.安裝Make
93.安裝Man-DB
94.安裝Mktemp
95.安裝Mole-Init-Tools
96.安裝Patch
97.安裝Psmisc
98.安裝Shadow
99.安裝Sysklogd
100.安裝Sysvinit
101.安裝Tar
102.安裝Texinfo
103.安裝Udev
104.安裝Util-linux
105.安裝Vim
106.退出chroot環境
第五部分 安裝系統
107.從現在到製作結束,重啟後設置
108.生成相關文件
109.安裝內核
110.安裝Grub
111.設置Grub啟動菜單(注意,如果是兩個分區則應修改root選項為hd0,1及/dev/hda2)
112.將menu.lst連接到/etc目錄
113.結束
logout
至此,已經全部安裝完成,可以啟動自己的系統了。
-----------------------------------------------------------------------
另:
114.安裝Linux2.6.37版本(linux-2.6.37.tar.bz2)
Perl和iprout要用更高版本,用:
perl-5.14.1.tar.bz2
iproute2-3.3.0.tar.bz2
115.解壓initrd文件
116.製作內存啟動盤
❸ 為什麼我下載了KB登錄不上
驅動程序建議你到www.mydrivers.com驅動之家去下載
用LINUX架設FTP伺服器
http://www.chinaunix.net 作者:level 發表於:2004-02-27 13:35:50
以前自己弄的東西,現在帖出來,希望對大家有點用:)
1.1 什麼是FTP:文件傳輸協議原理
1.1.1 命令選擇
1.1.2 命令格式
1.2 wu-Ftpd的安裝
1.3 讓FTP伺服器運轉起來
1.4 配置文件的設置
1.4.1 /etc/ftpaccess的設置
1.4.2 /etc/ftpusers和/etc/ftphosts的設置
1.4.3 /etc/ftpconversions設置
1.4.1 wu-ftp的相關程序
1.5 開設只能FTP的帳戶
1.6 設置虛擬FTP主機
什麼是FTP:文件傳輸協議原理
互聯網文件傳輸協議(File Transfer Protocol ,FTP) 標準是在RFC959說明的。該協議定義了一個從遠程計算機系統和本地計算機系統之間傳輸文件的一個標准。一般來說,傳輸文件的用戶需要先經過認證以後才能登錄網站,然後方能訪問在遠程伺服器的文件。而大多數的FTP伺服器往往提供一個GUEST的公共帳戶來允許沒有遠程伺服器的用戶可以訪問該FTP伺服器。
一個FTP會話通常包括五個軟體元素的交互。
用戶介面 提供了一個用戶介面並使用客戶端協議解釋器的服務
客戶 PI 客戶協議解釋器,其項遠程伺服器協議機發送命令並且驅動客戶數據傳輸過程
伺服器PI 伺服器協議解釋器,響應客戶協議機發出的命令並驅動伺服器端數據傳輸過程
客戶 DTP 客戶數據傳輸過程,其負責完成和伺服器數據傳輸過程及客戶端本地文件系統的通信
服務DTP 伺服器數據傳輸過程,其負責完成和客戶數據傳輸過程及伺服器端文件系統的通信
在RFC 959中,一般使用用戶這個名詞來指代客戶。RFC 959定義了客戶PI和伺服器PI交互的方式和規范。用戶介面與PI和DTP交互的機理都並不是協議標準的一部分。PI和DTP往往通常是在同一個程序模塊中實現的。
在FTP會話中,一共會存在有兩個獨立的網路連接,一個是由兩端的PI使用的,另一個是由兩端的DTP使用的。PI之間的連接一般被稱作控制連接(control connection),DTP之間的連接被稱做數據連接(data connection)
使用TCP服務的控制和數據連接
通常情況下,FTO伺服器監聽埠號21來等待控制連接建立請求。而數據連接埠號的選擇依賴於控制連接上命令。通常是客戶發送一個控制消息來指定客戶監聽並等待伺服器端發送數據連接建立請求的埠號。
對數據傳輸和控制命令傳輸來使用不同的獨立連接有如下優點:兩個連接可以選擇不同的合適服務質量,如:對控制連接來說高需要更小的延遲時間,對數據連接來說需要更大的數據吞吐量;而且可以避免實現數據流中的命令的通明性及逃逸。
當傳輸建立時,總是由客戶端首先發起。然而客戶和伺服器都可能是數據發送者。除了傳輸用戶請求下載文件,數據傳輸過程同樣在客戶端請求列伺服器端目錄結構時建立。
1.1.1 命令選擇
當一個傳輸建立時,一般通常需要指定四個方面的屬性:
文件類型
該屬性指定如何將文件的數據匹配成適於傳輸的格式,一共有四種可能的選擇:
ASCII文件類型
在發送端,文件從本地文本文件格式轉換為 NVT ASCII格式,每行結束有一個CR/LF對來標識。 在接收端,再被轉換為本地的文本格式。
這說明了為什麼Unix主機之間傳輸文本文件為何傳輸的數據量要大於文件的實際大小。若傳輸一段端或傳輸兩端都不使用ASCII文本編碼,則是應該由數據傳輸過程來實現本地編碼和NVT ASCII 編碼之間的轉換。
EBCDIC文件類型
類似於ASCII,區別僅僅上使用EBCDIC字元編碼
圖象 (或二進制)文件類型
文件以本地傳輸內容傳輸,在遠端以同本地完全相同的內容存儲。
本地文件系統
用在位元組大小不是8位的環境下。沒位元組位數由發送者指定。
在實際應用中,只有ASCII和圖象格式使用的較多。
格式控制
該屬性是和將文本文件最後傳送到列印設備相關的,其中有多種方式來實現將垂直格式信息編碼到文件中,包括指示一個新頁開始的方式。有如下方式可供選擇:
無須列印格式控制,這是預設值
Telnet列印控制,在telnet協議中定義的控制字元包含在數據流中。.
Fortran列印控制,
該屬性在實際中很少使用。
結構
文件可以擁有內部結構,在傳輸中該結構被保留。由數據傳輸過程來負責在傳輸中的結構及本地結構之間相互匹配,有三種可能性:
文件結構
這實際上意味著文件被看作沒有內部結構的連續的位元組流。
記錄結構
文件是有一系列記錄組成的結構。這只適用於文本文件。
頁面結構
也可以稱做塊結構。每一頁都伴隨一個頁號來傳輸,從而以順序的方式來完成傳輸。
頁面結構很少在實際中遇到。記錄結構也不是很常見。對於文本文件使用ASCII文件類型可以獲得相同的效果。
傳輸模式
該屬性可以取三個不同的值:
流模式
文件的以位元組流的方式傳輸。
塊模式
文件以一個塊連接一個塊的方式傳輸,每個塊的開頭都有一個頭。
壓縮模式
一個簡單的運程長度壓縮編碼被應用,來壓縮連續的相同的位元組。
實際中,一般只有流模式被使用。而壓縮一般通過使用各種其他的工具程序來獲得。
當一次傳輸被建立,客戶端一般指定一個或多個前面說明的屬性。若伺服器端不能支持某個選項,伺服器將用一個錯誤信息來響應客戶端,並不具有協商機制。
FTP提供了充足的命令來使用戶和遠程建立連接並訪問遠程文件系統。
1.1.2 命令格式
命令以NVT ASCII串的格式被傳輸。每個命令以三個或四個大寫的NVT ASCII字元開始,後面帶有選項參數和一個CR/LF對來標識命令結束
應答由三個NVT ASCII數字及一個選項消息組成。
一個長的應答也許會有多個消息組成,第一個消息的三個數字後帶有一個破折號,最後的消息不帶有破折號。中間的消息無須攜帶三個數字,但是如果帶了三個數字,則也需要破折號。
下面是所有的命令的列表。帶有星號的命令一般很少使用,所以往往在具體實現中不支持。
String Meaning
ABOR 放棄傳輸
*ACCT 某些系統將帳號和用戶與文件系統相關聯
*ALLO 為即將傳送的文件分配空間。後面攜帶的參數來確定位元組數
*APPE 將文件附加到已經存在的文件後面
CDUP 在遠程系統上將當前目錄切換到上級父目錄
CWD 改變遠程系統的工作目錄
DELE 刪除遠程系統的文件
HELP 讀取伺服器的幫助信息,如:支持的命令的列表
LIST 在一個新建立的數據連接上發送當前工作目錄下的文件名列表
MKD 創建目錄
MODE 指定傳輸模式,可攜帶的參數是:S、B或 C.
NLST 在一個新建立的數據連接上發送一個當前目錄下的「完全」的目錄列表
NOOP 空操作,防止連接斷掉
PASS 提供一個用戶登錄密碼,必須立即跟隨在USER命令後
*PASV 指定伺服器數據傳輸過程監聽等待客戶端的數據連接連接建立請求
PORT 指定客戶端監聽等待伺服器端建立的連接的埠號
PWD 顯示伺服器端的當前工作目錄名
QUIT 退出登錄並終止連接
*REIN 重新初始化,退出登錄但是並不斷開連接,後面必須隨後發出一個新的USER命令
*REST 從伺服器的一個標識處重新開始傳輸
RETR 從遠程系統取回一個文件
RMD 刪除一個目錄
*RNFR 指定要被命名的文件的老的路徑名,隨後必須是一個RNTO命令
*RNTO 指定要被命名的文件的新的路徑名
*SITE 站點特有的伺服器提供的服務
*SMNT 結構載入,提供一個文件系統結構的遠程系統路徑名
*STAT 狀態信息
STOR 上載一個文件到伺服器上,若文件已經存在則覆蓋
*STOU 上載一個文件到伺服器上,不覆蓋已經存在的文件
STRU 指定文件結構,參數可以是F、R或P.
*SYST 報告遠程系統的操作系統類型
TYPE 指定文件類型,參數可以是A、E、I、L只有TYPE A和TYPE I常用
控制連接命令應答有如下形式:
Type Description
1yz 主動初步應答,在發送另一個命令以前等待另一個應答
2yz 主動最後應答,最後一個命令成功結束
3yz 主動中間應答,必須再發送一個命令
4yz 暫時被動應答,要求的動作當時不能完成,但可以重試
5yz 永久被動應答,要求的動作不能完成,不應該重試
"y"數字編碼進一步的信息
Digit Meaning
0 語法錯誤
1 信息
2 連接狀態
3 認證和記帳
4 保留
5 File s文件系統狀態
下面是一些典型的消息:
Number Meaning
125 數據連接打開,傳輸開始
200 命令OK
331 用戶名OK 需要輸入密碼
425 不能打開數據連接
452 錯誤寫文件
500 語法錯誤-不可識別的命
具體的詳細情況可以參見RFC
wu-Ftpd的官方權威站點地址是:http://www.wu-ftpd.org/。
1.2 wu-Ftpd的安裝
當前,Linux環境下有許多ftp伺服器軟體可供選擇,但是目前最常見的仍然是wu-Ftpd伺服器。這里主要討論該軟體的安裝和配置。
一般來說,在安裝了linux時,預設都會自動安裝wu-ftpd伺服器,但是有時候為了某種需要也需要自己親自重新安裝該伺服器軟體。安裝wu-Ftpd有兩方式,一種是安裝rpm形式的發布包;一種是自己動手去編譯生成Ftp伺服器。
rpm包可以在http://rpmfind.net/linux/RPM/WByName.html處下載得到,以rpm包方式安裝非常簡單,只需要在按下面的簡單的幾個步驟就可以完成,假設下載得到的rpm包存放在/tmp目錄下:
#cd /tmp
#rpm -ivh wu-ftpd-1.6.0-9.i386.rpm
壓縮的源代碼可以在ftp://ftp.wu-ftpd.org/pub/wu-ftpd/出得到。這里我們以最新的1.6.0為例說明如何編譯安裝wu-ftpd。
1、解開源代碼
1) 將壓縮的源代碼拷貝到/usr/src下
#cp wu-ftpd.1.6.0.tar.gz /usr/src
2) 對壓縮文檔進行解壓縮:
#tar xvfz wu-ftpd.1.6.0.tar.gz
#cd wu-ftpd-1.6.0
2、敲入命令 "./build xxx" ,可以在這里指定一個C語言編譯器:"./build CC=yyy xxx" yyy 指用來替代 "cc" 的其他的編譯器。對於linux環境下的gcc編譯器,命令應該為:"./build CC=gcc xxx"
#build CC=gcc lnx
xxx可以取下面的值:
gen : 通用make(當移植到心得系統時需要拷貝它)
aix : IBM AIX
aux : AU/X
bdi : BSD/OS
bsd : BSD
dec : DEC Unix 3.X
4 : DEC Unix 4.X or later
dyn : Dynix
fbs : FreeBSD 1.0 or later
hiu : Hitachi Unix
hpx : HP-UX
lnx : Linux (tested on 1.0.30)
nbs : NetBSD 1.X
nx2 : NeXTstep 1.x
nx3 : NeXTstep 3.x
osf : OSF/1
osx : Mac OS X
ptx : ???
sco : SCO Unix 3.2v4.2/SCO OpenServer 5
sgi : SGI Irix 4.0.5a
sny : Sony NewsOS
sol : SunOS 5.x / Solaris 1.x
s41 : SunOS 4.1.x
ult : Ultrix 4.x
uxw : UnixWare 1.1 or later
clean : Clean up object files and such to rece disk space after building.
install: Install ftpd
Copying Makefiles.
Linking src/config.h
Making support library.
gcc -O3 -fomit-frame-pointer -fno-strength-rece -pipe -c strcasestr.c
gcc -O3 -fomit-frame-pointer -fno-strength-rece -pipe -c authuser.c
gcc -O3 -fomit-frame-pointer -fno-strength-rece -pipe -c snprintf.c
rm -f libsupport.a
ar cq libsupport.a strcasestr.o authuser.o snprintf.o
ranlib libsupport.a
: : :
: : :
: : :
編譯成功以後將生成如下幾個可執行文件:
ftpd FTP伺服器程序
ftpshut 用於關閉FTP守護進程的程序
ftpcount 記數程序,顯示目前ftp登錄的人數
ftpwho 查看當前FTP伺服器的連線情況,類似與系統的who命令,只不過是查看ftp登錄的用戶
ckconfig 檢查FTP的設置是否正確
ftprestart 重新啟動ftp伺服器
privatepw 改變wu_ftpd組訪問文件信息
3、若只是升級到一個新的版本,應該首先備份系統所有的舊的配置文件。否則這些配置文件將被覆蓋。為了適應自己的需求,應當編輯樣本配置文件來滿足自己的要求,具體配置文件的需求參見後面的內容。
4、以超級用戶身份敲入命令"./build install"
#build install
installing binaries.
install -c -o bin -g bin -m 110 bin/ftpd /usr/sbin/in.ftpd
install -c -o bin -g bin -m 111 bin/ftpshut /usr/bin/ftpshut
install -c -o bin -g bin -m 111 bin/ftprestart /usr/bin/ftprestart
install -c -o bin -g bin -m 111 bin/ftpcount /usr/bin/ftpcount
install -c -o bin -g bin -m 111 bin/ftpwho /usr/bin/ftpwho
install -c -o bin -g bin -m 111 bin/privatepw /usr/bin/privatepw
installing manpages.
install -c -o bin -g bin -m 444 doc/ftpcount.1 /usr/man/man1/ftpcount.1
install -c -o bin -g bin -m 444 doc/ftpwho.1 /usr/man/man1/ftpwho.1
install -c -o bin -g bin -m 444 doc/ftpaccess.5 /usr/man/man5/ftpaccess.5
install -c -o bin -g bin -m 444 doc/ftpconversions.5 /usr/man/man5/ftpconversio5
install -c -o bin -g bin -m 444 doc/ftphosts.5 /usr/man/man5/ftphosts.5
install -c -o bin -g bin -m 444 doc/xferlog.5 /usr/man/man5/xferlog.5
install -c -o bin -g bin -m 444 doc/ftpd.8 /usr/man/man8/ftpd.8
5、編輯 "/etc/inetd.conf" 文件,指向新的ftpd守護進程,大多數情況下,這一步是不必的,因為在build install時,會將新的守護進程拷貝覆蓋老的守護進程。若希望使用ftpd的增強的擴展功能,應該在這行最後加上"-a"選項。
ftpd守護進程一般可以攜帶如下參數,也可以不帶任何參數:
-d debug參數,當ftpd守護進程出現錯誤時,會將錯誤信息寫入到系統記錄文件/usr/adm/syslog中
-l 記錄每次ftp會話信息到/usr/adm/messages中
-t 設置當FTP客戶端多久無操作就自動斷線,這個參數後面指定等待的時間,如 -t 600 表示若客戶
端若連續10分鍾沒有動作就自動斷線,預設值是15分鍾
-a 使用ftpaccess配置文件內容對ftpd進行更詳細復雜的設置
-A 不使用ftpaccess配置文件的設置,預設值是-A
-i 當客戶端有上載文件的動作時,就記錄在文件xferlog中
-L 使用戶連接ftp伺服器期間使用的所有命令都被記錄到/usr/adm/messages中
6、拷貝tar、gzip、gunzip、compress、uncompress等文件到 "~ftp/bin"中,拷貝"ls"為"~ftp/bin/ls"。
7、若是第一次安裝,使用"ckconfig"程序查找ftpd的各種配置文件存放目錄:ftpconversions、ftpusers、 和ftpgroups。在"doc/examples"目錄下有樣本文件。"ckconfig"是一個可執行程序,確保修復該程序檢測到的任何問題。
1.3 讓FTP伺服器運轉起來
一般來說,只要正確地編譯安裝了wu-ftpd,該伺服器就可以正常運行。用戶可以通過FTP命令從各種系統上連接該伺服器。
1.4 配置文件的設置
1.4.1 /etc/ftpaccess的設置
這個配置文件是FTP伺服器最重要的配置文件,這個文件的設置決定了FTP是否可以正常工作及許多訪問許可權的設置。如下面的例子所示:
class all real,guest,anonymous *
limit all 10 Any /etc/msgs/msg.dead
readme README* login
readme README* cwd=*
message /welcome.msg login
message .message cwd=*
compress yes all
tar yes all
log commands real
log transfers anonymous,real inbound,outbound
shutdown /etc/shutmsg
email user@hostname
下面是設置文件各個指示(directive)的詳細說明:
指示: loginfails n
密碼輸入n次就自動斷開連接
指示:autogroup 組名 類別 [ ...]
若一個匿名用戶屬於任何一個參數類別的類,則FTP伺服器將實施setegid()調用使其屬於這個組名定義的組,這樣做是為了實現某些特定類別的匿名用戶可以訪問一些只允許本組及擁有者可以訪問的文件。組名必須是/etc/group內定義的有效組。
指示: class 類名 類別(real、guest、anonumous) IP地址
這個指示是設定FTP伺服器用戶的類別。
FTP伺服器的用戶可以分為以下三種類別:
real 在該FTP伺服器上擁有合法帳戶的用戶;
guest 另外定義某些特定組的用戶;
anonymous 匿名用戶;
舉例說明:
class outworld real,guest,anonymous *
定義一個名為outworld的類,該類包含三種類型的用戶:real,guest,anonymous。該類在後面的指示中使用。其中"*"是類定義中的IP地址部分,表示網路上的所用主機。也就是說明允許任何主機連接FTP伺服器。若希望對訪問FTP的主機進行一定的許可權設置,可以這樣做:
class friend real,guest,anonymous *.linuxaid.com.cn 201.101.13.*
指定義一個friend類,該類從*.linuxaid.com.cn 及201.101.13.*訪問FTP伺服器時有特定的許可權設定。
指示: limit 類別 人數 時間 文件名
該指示設定在某個類在某個時間內允許連接FTP伺服器的人數的限制,並指定當連接人數超過限制,後面的用戶連接時顯示給用戶的消息信息。
舉例說明:
limit local 20 Any /tmp/message/msg.toomany
上面的例子限定local這個類中的擁護同一時間只能有20人同時上網連接這台FTP伺服器,若超過20人則顯示/tmp/message/msg.toomany的文件的內容
limit outworld 100 MoTu|Any 2200-0800 /tmp/message/msg.limit
這個例子限制outworld這個類的用戶只能在周一周二或每天的晚上10點到第二天早上的8點之間訪問該FTP伺服器,而且同時連線的人數不可以超過100人,若超過100人,則顯示/tmp/message/msg.limit的文件的內容
/tmp/message/msg.limit的內容為:
對不起!本伺服器只允許匿名用戶在周一周二全天及其他每天晚上10點到第二天早上的8點之間訪問,當前時間為%T;而且只允許同時有%M個匿名用戶訪問,當前有%N個用戶在訪問該伺服器。請在合適的時間訪問本FTP伺服器,謝謝!
這里的%M是一個變數,代表同時允許連接的人數的上限,FTP伺服器可以用前面設置的值自動替代該變數,其他允許的變數包括:
%T 本地當前時間;
%F CWD所在分區剩餘空間,以KB為單位。但該變數不是所有系統都支持。
%C 當前工作目錄;
%E 定義在/etc/ftpaccess文件中的系統管理員的E-mail地址;
%R 遠端主機名;
%L 本地主機名;
%U 登錄時所給的用戶名;
%N 這個類別當前連接的用戶數目;
利用這些參數,可以編輯一個詳細的說明文件,這樣可以讓用戶清楚當前伺服器資源使用情況。
指示: readme 說明文件 指令
當用戶執行指定的"指令"時,系統就會自動顯示所設置的說明文件;
舉例說明:
readme README* login
當用戶執行登錄動作時,只要以README開頭的文件內容就會顯示給用戶。
readme README* cwd=*
表示用戶切換目錄時(cwd),只要以README開頭的文件內容就會顯示給用戶。
通常README*應該是該目錄下文件的說明,讓登錄的用戶可以清楚地知道目錄中存放了那些文件;
指示: message 文件名 指令
使當用戶執行特定的"指令"時,系統就將指定的文件內容顯示給用戶;
舉例說明:
message /msg.welcome login
指定當用戶登錄時,將自動顯示/tmp/message/msg.welcome的內容給用戶,注意這里的/msg.welcome指ftp根目錄下的msg.welcome文件,即/home/ftp/msg.welcome。
message /welcome cwd=*
指定當用戶切換另一個目錄時,只要目錄中有msg.welcome文件,就顯示給用戶
指示: compress (yes/no) 類別
設置哪個類別的用戶可以使用壓縮功能;
舉例: compress yes local outworld
允許local 和outworld兩個類別的 用戶使用壓縮功能
指示: tar (yes/no) 類別
指定哪個類別的用戶可以使用tar功能;
指示: passwd-check (none/trivial/rfc822) (enforce/warn)
設定當用戶以匿名方式登錄伺服器時密碼的方式:
none 表示不對密碼進行驗證,任何密碼都可以登錄;
trival 表示只要密碼中包含@就可以登錄;
rfc822 表示密碼一定要符合rfc822中規定的E-mail格式才能登錄。如:[email protected]
enforce 表示輸入的密碼不符合指定格式就不允許登錄;
warn 表示輸入的密碼不符合指定格式顯示警告信息,但仍然允許登錄;
指示: log commands 類別(read/guest/anonumous)
設定那些用戶登錄時,所使用的操作會被記錄在文件/usr/adm/xferlog中。
指示: log transfer 類別(read/guest/anonumous) (inbound/outbound)
設定指定的用戶類別在上載還是下載時的相關信息被記錄到/usr/adm/xferlog中。
舉例說明:
log transfer anonymous,real inbound,outbound
當anonymous或real用戶登錄後,上載和下載的操作會被記錄在文件/usr/adm/xferlog中。
指示: shutdown 文件名
FTP伺服器關閉的時間可以後面的文件名中指定的文件中指定,設定的時間一到,便無法登錄FTP伺服器了,只有將這個文件刪除才能恢復FTP伺服器。文件的格式可以由命令ftpshut來建立。
指示: delete (yes/no) 類別(real/anonymous/guest)
設定是否允許指定用戶使用delete命令。
舉例說明:
delete no guest,anonymous
設定大概內登錄的用戶為guest或anonymous上不允許執行delete命令。
指示: overwrite (yes/no) 類別(real/anonymous/guest)
設定是否允許指定用戶使用overwrite指令。
指示: reame (yes/no) 類別(real/anonymous/guest)
設定是否允許指定用戶使用readme指令。
指示: chmod (yes/no) 類別(real/anonymous/guest)
設定是否允許指定用戶使用chmod指令。
指示: umask (yes/no) 類別(real/anonymous/guest)
設定是否允許指定用戶使用umask指令。
指示: upload [absolute|relative] [class=]... [-]
["dirs"|"nodirs"] []
定義允許用來上載的目錄。若允許上載,所有新上載的文件的所有者及組由和定義 ,訪問許可權將為。對於覆蓋老文件的上載文件將保持原來的所有者及訪問許可權信息。文件上載的許可權信息由最大匹配目錄項定義,如:
upload /var/ftp * no
upload /var/ftp /incoming yes ftp daemon 0666
upload /var/ftp /incoming/gifs yes jlc guest 0600 nodirs
would only allow uploads into /incoming and /incom-
:
將只允許/incoming和/incom-ing/gifs目錄上載。上載到/incoming目錄下的文件將屬於ftp/daemon,訪問許可權為0666;而上載到/incoming/gifs下的文件將屬於jlc/guest,訪問許可權為0600。應該注意的是 必須匹配"ftp"用戶的passwd文件中的主目錄。
"dirs"和"nodirs"選項用來設定是否允許在該目錄下創建新的子目錄。但是預設是允許創建子目錄的。
設定新創建的目錄的訪問許可權,預設為0777。
上載指示只能施用於用戶主目錄(chroot()的參數)等同於的用戶,可以為*來表示匹配任何主目錄。
和也可能指定為*,在這種情況下,任何上載的文件或創建的目錄的所有者都等於起父目錄的所有者。
選項[absolute|relative]指定是是絕對路徑還是相對於chroot()參數指定的目錄的相對路徑。預設是絕對路徑。也可以指定任意多個class='來進行進一步限定。若指定了任何目錄,則該上載指示隻影響這些組的用戶。
指示: alias 目錄別名 目錄路徑
給指定目錄設置一個別名,當切換目錄時可以使用別名。
舉例說明:
alias xwin /pub/linux/xwindows
為/pub/linux/xwindows設置別名xwin,登錄以後只要輸入命令cd xwin就可以進入該目錄。
指示: cdpath 目錄
該功能和系統的PATH環境變數設置類似,當cd /etc時,FTP首先查看當前目錄下是否有etc子目錄,無則看是否有別名,若沒有則根據該指示設定的路徑查詢。
舉例說明:
cdpath /pub/linux
cdpath /pub
cdpath /
搜索順序為:/pub/linux /pub /
指示: path-filter 類別(real/anonymous/guest) 目錄
設定上載文件名限制。
舉例說明:
path-filter anonymous /etc/pathmsg^[-A-Za-z0-9_\.]*$^\.^-
path-filter guest /etc/pathmsg^[-A-Za-z0-9_\.]*$^\.^-
設置限制anonymous和guest用戶上載的文件名只能包含A-Z、a-z、0-9和._-,名字以"."和"-"開頭的文件不能上載到伺服器上。
指示: guestgroup [ ...]
guestuser [ ...]
realgroup [ ...]
realuser [ ...]
對於guestgroup指示,若一個真實(real)用戶屬於任何一個所指定的組,則其FTP會話都被FTP伺服器以匿名的方式進行處理。也就是說,chroot()被調用,用戶不再允許發出USER和 PASS 命令。必須是有效的組。
這里用戶的home目錄必須被爭取的設置,要確實和匿名用戶一致,/etc/passwd中的相關項的home目錄被分割為兩個部分,第一部分是chroot()調用的根目錄參數,第二個是用戶相對於根目錄的主目錄,兩部分之間以"/./分隔",如:
guest1::100:92:Guest Account:/ftp/./incoming:/etc/ftponly
當guest1成功登錄進入,FTP伺服器將調用chroot("/ftp")然後調用chdir("/incoming")。則guest1就如同匿名用戶
❹ linux編譯內核步驟
一、准備工作
a) 首先,你要有一台PC(這不廢話么^_^),裝好了Linux。
b) 安裝好GCC(這個指的是host gcc,用於編譯生成運行於pc機程序的)、make、ncurses等工具。
c) 下載一份純凈的Linux內核源碼包,並解壓好。
注意,如果你是為當前PC機編譯內核,最好使用相應的Linux發行版的源碼包。
不過這應該也不是必須的,因為我在我的Fedora 13上(其自帶的內核版本是2.6.33.3),就下載了一個標準的內核linux-2.6.32.65.tar.xz,並且順利的編譯安裝成功了,上電重啟都OK的。不過,我使用的.config配置文件,是Fedora 13自帶內核的配置文件,即/lib/moles/`uname -r`/build/.config
d) 如果你是移植Linux到嵌入式系統,則還要再下載安裝交叉編譯工具鏈。
例如,你的目標單板CPU可能是arm或mips等cpu,則安裝相應的交叉編譯工具鏈。安裝後,需要將工具鏈路徑添加到PATH環境變數中。例如,你安裝的是arm工具鏈,那麼你在shell中執行類似如下的命令,假如有類似的輸出,就說明安裝好了。
[root@localhost linux-2.6.33.i686]# arm-linux-gcc --version
arm-linux-gcc (Buildroot 2010.11) 4.3.5
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for ing conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
註:arm的工具鏈,可以從這里下載:回復「ARM」即可查看。
二、設置編譯目標
在配置或編譯內核之前,首先要確定目標CPU架構,以及編譯時採用什麼工具鏈。這是最最基礎的信息,首先要確定的。
如果你是為當前使用的PC機編譯內核,則無須設置。
否則的話,就要明確設置。
這里以arm為例,來說明。
有兩種設置方法():
a) 修改Makefile
打開內核源碼根目錄下的Makefile,修改如下兩個Makefile變數並保存。
ARCH := arm
CROSS_COMPILE := arm-linux-
注意,這里cross_compile的設置,是假定所用的交叉工具鏈的gcc程序名稱為arm-linux-gcc。如果實際使用的gcc名稱是some-thing-else-gcc,則這里照葫蘆畫瓢填some-thing-else-即可。總之,要省去名稱中最後的gcc那3個字母。
b) 每次執行make命令時,都通過命令行參數傳入這些信息。
這其實是通過make工具的命令行參數指定變數的值。
例如
配置內核時時,使用
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
編譯內核時使用
make ARCH=arm CROSS_COMPILE=arm-linux-
注意,實際上,對於編譯PC機內核的情況,雖然用戶沒有明確設置,但並不是這兩項沒有配置。因為如果用戶沒有設置這兩項,內核源碼頂層Makefile(位於源碼根目錄下)會通過如下方式生成這兩個變數的值。
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
-e s/sh[234].*/sh/ )
ARCH?= $(SUBARCH)
CROSS_COMPILE ?=
經過上面的代碼,ARCH變成了PC編譯機的arch,即SUBARCH。因此,如果PC機上uname -m輸出的是ix86,則ARCH的值就成了i386。
而CROSS_COMPILE的值,如果沒配置,則為空字元串。這樣一來所使用的工具鏈程序的名稱,就不再有類似arm-linux-這樣的前綴,就相當於使用了PC機上的gcc。
最後再多說兩句,ARCH的值還需要再進一步做泛化。因為內核源碼的arch目錄下,不存在i386這個目錄,也沒有sparc64這樣的目錄。
因此頂層makefile中又構造了一個SRCARCH變數,通過如下代碼,生成他的值。這樣一來,SRCARCH變數,才最終匹配到內核源碼arch目錄中的某一個架構名。
SRCARCH := $(ARCH)
ifeq ($(ARCH),i386)
SRCARCH := x86
endif
ifeq ($(ARCH),x86_64)
SRCARCH := x86
endif
ifeq ($(ARCH),sparc64)
SRCARCH := sparc
endif
ifeq ($(ARCH),sh64)
SRCARCH := sh
endif
三、配置內核
內核的功能那麼多,我們需要哪些部分,每個部分編譯成什麼形式(編進內核還是編成模塊),每個部分的工作參數如何,這些都是可以配置的。因此,在開始編譯之前,我們需要構建出一份配置清單,放到內核源碼根目錄下,命名為.config文件,然後根據此.config文件,編譯出我們需要的內核。
但是,內核的配置項太多了,一個一個配,太麻煩了。而且,不同的CPU架構,所能配置的配置項集合,是不一樣的。例如,某種CPU的某個功能特性要不要支持的配置項,就是與CPU架構有關的配置項。所以,內核提供了一種簡單的配置方法。
以arm為例,具體做法如下。
a) 根據我們的目標CPU架構,從內核源碼arch/arm/configs目錄下,找一個與目標系統最接近的配置文件(例如s3c2410_defconfig),拷貝到內核源碼根目錄下,命名為.config。
注意,如果你是為當前PC機編譯內核,最好拷貝如下文件到內核源碼根目錄下,做為初始配置文件。這個文件,是PC機當前運行的內核編譯時使用的配置文件。
/lib/moles/`uname -r`/build/.config
這里順便多說兩句,PC機內核的配置文件,選擇的功能真是多。不編不知道,一編才知道。Linux發行方這樣做的目的,可能是想讓所發行的Linux能夠滿足用戶的各種需求吧。
b) 執行make menuconfig對此配置做一些需要的修改,退出時選擇保存,就將新的配置更新到.config文件中了。
注
❺ 如何解決源碼包安裝時的依賴性問題
不管是初步跨入Linux殿堂的新手,還是具有多年經驗的專家,在安裝或編譯軟體包的過程中或多或少的都會遇到包的依賴問題,從而導致安裝過程無法繼續,比如管理員在安裝LAMP時,包需要libgd.so文件,而這個文件屬於GD軟體包。但是在安裝GD軟體包時,可能這個軟體包跟其他軟體包又具有依賴關系,又需要安裝其他軟體包才行。這時有的管理員便失去耐心。在遇到這種Linux軟體包依賴關系問題時,該如何解決呢?在談這個具體的措施之前,先跟大家聊聊Linux系統里的軟體依賴性問題。
一、什麼是依賴性
程序依賴於程序代碼的共享庫,以便它們可以發出系統調用將輸出發送到設備或打開文件等(共享庫存在於許多方面,而不只局限於系統調用)。沒有共享庫,每次程序員開發一個新的程序,每個程序員都需要從頭開始重寫這些基本的系統操作。當編譯程序時,程序員將他的代碼鏈接到這些庫。如果鏈接是靜態的,編譯後的共享庫對象代碼就添加到程序執行文件中;如果是動態的,編譯後的共享庫對象代碼只在運行時需要它時由程序員載入。動態可執行文件依賴於正確的共享庫或共享對象來進行操作。rpm依賴性嘗試在安裝時強制實施動態可執行文件的共享對象需求,以便在以後當程序運行時不會有與動態鏈接過程有關的任何問題。
注意:還有一種類型的依賴性,它基於顯式的條目,rpm通過程序員將該依賴性強加到rpm配置文件中,但目前我們不關心這種類型的依賴性,這種依賴性比較容易解決。這里將重點放在rpm強制實施的更加復雜的共享對象依賴性。
二、動態可執行文件和共享對象
動態可執行文件使用最初編譯和鏈接程序時使用的庫文件的共享對象名稱來查找共享對象。它們在少數的幾個標准位置查找,比如在/lib和/usr/lib目錄及在LD_LIBRARY_PATH環境變數(主要用於指定查找共享庫,比如我們在安裝Oracle時指定路徑,exportLD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib)指定的目錄中。順便提一下,在這些庫目錄中找到的共享對象可能不是真正的文件;它們可能是指向位於其他位置的真實庫文件的符號鏈接(但通常仍舊在標准庫目錄的一個目錄中)。至少從系統管理員的觀點是在用於創建共享庫文件的共享庫軟體包的名稱和共享庫文件的名稱之間通常沒有什麼關系。例如,GLIBC2.3軟體包用於創建libc.so.6共享庫文件。也從本示例中注意到,添加到共享庫文件名結束的版本號(.6)跟用於創建它的版本號(2.3)沒有關系。這是由共享庫軟體包開發人員有意完成的,以便GLIBC的新版本可以重用相同的共享庫文件名libc.so.6。這允許您在系統上載入新版本的GLIBC,而不用中斷動態鏈接到lib.so.6共享庫文件的所有程序,當然假定新版本的GLIBC向後與動態可執行文件最初所鏈接的老版本GLIBC兼容。因此,即使庫文件或共享對象文件有與它們相關的版本號,這些版本號也不能幫助你確定他們來自哪個版本的共享軟體包。
注意:當將whatprovides選項用於rpm查詢命令時,可以獲得有關使用rpm軟體包載入到系統的現有共享對象的信息。這種混亂是由下面的事實造成的:單個共享庫文件可能支持某個范圍的共享庫軟體包版本。例如,要檢查soname庫文件/lib/libc.so.6支持的GLIBC共享庫軟體包,運行下面的命令:
#objmp--all-headers/lib/libc.so.6|less
向下滾動此報告,直到到達Versiondefinitions:部分,以便查看libc.so.6共享庫文件支持哪些GLIBC版本:
Versiondefinitions:
10x010x0865f4e6libc.so.6
20x000x0d696910GLIBC_2.0
30x000x0d696911GLIBC_2.1
GLIBC_2.0
40x000x09691f71GLIBC_2.1.1
GLIBC_2.1
50x000x09691f72GLIBC_2.1.2
GLIBC_2.1.1
60x000x09691f73GLIBC_2.1.3
GLIBC_2.1.2
70x000x0d696912GLIBC_2.2
GLIBC_2.1.3
80x000x09691a71GLIBC_2.2.1
GLIBC_2.2
90x000x09691a72GLIBC_2.2.2
GLIBC_2.2.1
100x000x09691a73GLIBC_2.2.3
GLIBC_2.2.2
110x000x09691a74GLIBC_2.2.4
GLIBC_2.2.3
120x000x09691a76GLIBC_2.2.6
GLIBC_2.2.4
130x000x0d696913GLIBC_2.3
GLIBC_2.2.6
140x000x09691972GLIBC_2.3.2
GLIBC_2.3
150x000x09691973GLIBC_2.3.3
GLIBC_2.3.2
160x000x09691974GLIBC_2.3.4
GLIBC_2.3.3
170x000x0d696914GLIBC_2.4
GLIBC_2.3.4
180x000x0d696915GLIBC_2.5
GLIBC_2.4
190x000x0963cf85GLIBC_PRIVATE
GLIBC_2.5
200x000x0b792650GCC_3.0
在本示例中,1ibc.so.6共享庫文件支持原先為GLIBC版本2.0到2.5而開發的所有動態執行文件。注意:也可以使用objmp命令來從共享庫文件中提取soname,命令如下所示:
#objmp--all-headers/lib/libcrypto.so.0.9.8b|grepSONAME
SONAMElibcrypto.so.6
objmp:/lib/libcrypto.so.0.9.8b:
接下來,將討論rpm軟體包是如何生成的,以便在新系統上安裝rpm軟體包時,這些共庫依賴性是己知的。
三、Rpm軟體包和共享庫依賴性
當程序員生成rpm軟體包時,ldd命令用於報告動態可執行文件軟體包中所有動態可執行文件使用的所有共享庫。另一個混亂是由下面的事實帶來的:相同軟體包中的不同動態可執行文件可能與相同的共享庫軟體包的不同版本進行鏈接。例如,Heartbeat軟體包中的不同程序可能已經進行了開發,並動態鏈接到libc.so.6sonmae共享庫文件的不同GLIBC版本。對rpm命令使用-q和--requires參數,可以看到rpm軟體包需要的共享庫的完整清單。例如,要看到Heartbeatrpm軟體包所有的所需依賴性,請使用命令:
#rpm-q--requires-pheartbeat-1.x.x.i386.rpm
這產生了下面的報告:
sysklogd
/bin/sh
/bin/sh
/usr/bin/python
ld-linux.so.2
libapphb.so.0
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
libc.so.6(GLIBC_2.1.3)
libc.so.6(GLIBC_2.2)
libc.so.6(GLIBC_2.3)
libccmclient.so.0
libdl.so.2
libglib-1.2.so.0
libhbclient.so.0
libpils.so.0
libplumb.so.0
libpthread.so.0
librt.so.1
libstonith.so.0
注意,在此報告中,libc.so.6soname是所需要的,此共享庫必須支持使用GLIBC共享軟體包版本號2.0、2.1、2.1.3、2.2和2.3進行鏈接的動態可執行文件。這是由下面的事實決定的:Heartbeat軟體包中的不同動態可執行文件是針對不同版本的libc.so.6庫的每個版本進行鏈接的。在了解了動態可執行文件、共享對象、soname和共享庫軟體包彼此是如何相關的後,下面准備來看這樣的一個例子:當嘗試安裝rpm軟體包,並且它由於依賴性錯誤而失敗時,會發生什麼。yum能夠從指定的伺服器自動下載RPM包並且安裝,可以自動處理依賴性關系,並且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安裝。
四、手工解決依賴性問題
通常,當嘗試安裝發行版中沒有包括的軟體包(及不能由像up2date、apt-get或Yum一樣的更新工具自動解決其依賴性的軟體包)時,將碰到rpm依賴性錯誤。例如,如果嘗試在老的Linux發行版上使用rpm–ivh*rpm命令,例如所有的Heartbeatrpm包,那麼在安裝過程中就可能碰到下面的錯誤:
error:faileddependencies:
libc.so.6(GLIBC_2.3)isneededbyheartbeat-1.x.x
libc.so.6(GLIBC_2.3)isneededbyheartbeat-pils-1.x.x
libcrypto.so.0.9.6isneededbyheartbeat-stonith-1.x.x
libsnmp-0.4.2.6.soisneededbyheartbeat-stonith-1.x.x
注意,rpm命令沒有干擾報告所需的每個GLIBC共享庫軟體包版本號——它只報告所需的最高編號的版本號(GLIBC_2.3)。(假定原來的軟體包開發人員不會將相同軟體包中的可執行文件鏈接到不兼容版本的共享庫軟體包)所有的這些故障都報告所需的共享庫名稱或soname(而不是文件名稱,soname始終以「lib」開始)。但可以刪除添加到rpm報告的soname結束的版本號,並快速檢查以查看是否在系統中使用locate命令安裝這些共享庫(假設您的locate資料庫是最新的,有關更多信息,請參閱locate或slocate的手冊頁)。例如,要查找libcrypto享庫文件,要輸入:
#locatelibcrypto
[root@localhost~]#locatelibcrypto
/lib/libcrypto.so.0.9.8b
/lib/libcrypto.so.6
/root/.Trash/vmware-tools-distrib/lib/lib32/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib64/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/libcrypto.a
/usr/lib/libcrypto.so
/usr/lib/pkgconfig/libcrypto.pc
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
如果此命令沒有在系統上找到一個libcrypto共享庫文件,將需要轉到Internet並找出哪個共享庫軟體包包含此共享庫文件。完成此項工具的一個快速和簡便方式是只要在http://rpmfind.net上將共享庫的名稱輸入到搜索欄中。如果將文本libcrypto.so輸入到此搜索貞中,將很快知道此共享庫是由openssl軟體包提供的。
如果老版本的共享庫數據包已經安裝在系統上,可以用如下的命令確認此軟體包含您需要的共享庫文件:
#rpm-q--providesopenssl
[root@localhost~]#rpm-q--providesopenssl
config(openssl)=0.9.8b-10.el5
lib4758cca.so
libaep.so
libatalla.so
libchil.so
libcrypto.so.6
libcswift.so
libgmp.so
libnuron.so
libssl.so.6
libsureware.so
libubsec.so
openssl=0.9.8b-10.el5
此命令報告此rpm軟體包中提供的所有內容(這包括軟體包提供的共享庫文件的soname)。注意:如前面指出的,共享庫軟體包版本號沒有並且應該沒有與共享庫文件(soname)版本號的任何對應關系。這里不進行這方面的討論,因為soname符號鏈接可能指向不同版本的共享庫文件,這也是在盡量避免在安裝新版本的共享軟體包時中斷現有動態可執行文件的情況下完成的。
五、自動解決依賴性故障
當您使用rpm軟體包來生成、升級或添加新的特性到系統時,依賴性故障可能很快變成一場惡夢。只要通過使用您的發行版供應商的升級服務或工具,就可以避免這場惡夢。例如,當選擇要安裝的rpm軟體包時,RedHat工具up2date自動從RedHat下載並安裝所有rpm依賴性。下面就點上列出了幾個完成相同事情的支持社區的免費方法:http://www.rpm.org/。下面將只進一步看到這些自動更新工具中的一種:Yum。
1.使用Yum來安裝rpm軟體包
Yum(YellowdogUpdater,Modified)程序可從下面網址下載:http://yum.baseurl.org/download/3.4/yum-3.4.3.tar.gz
在下載了此軟體包後,可以使用下面的命令像任何其他rpm軟體包那樣安裝它:
#rpm-ivhyum*
您可能需要更新想用於下載您的rpm軟體包的存儲庫。有關Fedora的可用Yum存儲庫的清單在http://www.fedoratracker.org要切換到不同的存儲庫,下載這些文件中的一個文件,並將該文件作為/etc/yum.conf文件安裝。現在可以用下面的命令告訴Yum報告存儲在Yum存儲庫中、可用於安裝所有軟體包:
#yumlist
[root@localhost~]#yumlist|more
.
RHNsupportwillbedisabled.
Loading"security"plugin
Loading"rhnplugin"plugin
InstalledPackages
Deployment_Guide-en-US.noarch5.2-9installed
Deployment_Guide-zh-CN.noarch5.2-9installed
Deployment_Guide-zh-TW.noarch5.2-9installed
GConf2.i3862.14.0-9.el5installed
GConf2-devel.i3862.14.0-9.el5installed
ImageMagick.i3866.2.8.0-4.el5_1.1installed
MAKEDEV.i3863.23-1.2installed
MySQL-python.i3861.2.1-1installed
NetworkManager.i3861:0.6.4-8.el5installed
NetworkManager-glib.i3861:0.6.4-8.el5installed
2.用Yum安裝新的rpm軟體包
在本示例中,將安裝新的GLIBC軟體包。用簡單的命令安裝最新的GLIBC及其所有依賴性:
#yumupdateglibc
如果一切正常,Yum程序將自動檢測、下載並安裝最新GLIBC軟體包所需要的所有rpm軟體包(這里的GLIBC軟體包是為您的發行版而構建的,不一定是可用的最新版GLIBC軟體包(使用發行版所批準的GLIBC共享庫軟體包版本號或冒險安裝沒有使用正常系統操作所需要的動態可執行文件的GLIBC軟體包版本)。也可以將list參數用於Yum和grep命令來查找要安裝的軟體包。例如,要查找名稱中有SNMP的軟體包,請輸入:
#yumlist|grepsnmp
此命令返回如下報告:
.
RHNsupportwillbedisabled.
net-snmp.i3861:5.3.1-24.el5installed
net-snmp-libs.i3861:5.3.1-24.el5installed
net-snmp-perl.i3861:5.3.1-24.el5installed
net-snmp-utils.i3861:5.3.1-24.el5installed
現在可以容易地使用YUM下載並安裝所有這些rpm軟體包。
六、關於升級Gilbc的建議
Glibc庫是Linux底層的運行庫,其性能對於整個系統的運行有重要的意義。Glibc庫包含了大量函數,其中的函數可大致分成兩類,一類是與操作系統核心溝通的系統調用介面,它們作為功能型函數被調用,提供對Linux操作系統調用的包裝與預處理。另外一類為一般的函數對象,它們提供了經常使用的功能的實現,作為工具型函數使用。在實踐中,有不少軟體就是依賴與Glibc版本才能安裝並運行,說白了對於Glibc版本要求是版本高了不行,低了還不成。這些編譯環境中的應用程序也和其它程序一樣必須有運行的環境,我常遇到管理員在生產中給伺服器裝了最新的Linux發行版,結果應用軟體裝不上去,原因是Glibc的版本不對,有的是寫在原發行版glibc上升級有的是降級,結果倒是整個系統的崩潰,實踐經驗告訴我,你只有選擇相應Linux發行版里對應的glibc,例如我們單位的一個應用軟體時在rhel3.0下開發的,那麼就得要對應的發行版,換了別的就難說了,任何自己升級或降級Glibc來適應應用軟體的做法都是不可取的,問題最後的解決方法是找到了RHEL3裝上就解決了。在表一中,我把幾個linux發行版原配的Glibc版本列出,供大家參考。
點擊圖片查看大圖
Glibc庫與核心功能組件
上圖一說明:
GCC依賴於glibc
binutils依賴於glibc(binutils提供了一系列用來創建、管理和維護二進制目標文件的工具程序,如匯編(as)、連接(ld)、靜態庫歸檔(ar)、反匯編)
make依賴於glibc
頭文件是在編譯時候gcc所需要的,但本身都是一些文本文件,因此沒有需要的運行環境。
常用工具依賴於glibc和各種需要用到的動態庫。
下表一列出了多個重要Linux發行版的Glibc的情況
Linux發行版Glibc版本
Redhat9glibc-2.3.2-5
Fedora1glibc-2.3.2
RedhatEnterpriseLinuxAs3glibc-2.3.2-95
RedhatEnterpriseLinuxAs4glibc-2.3.4
RedhatEnterpriselinux5glibc-2.5-24
RedhatEnterpriselinux6glibc-2.9
Centos5.xglibc-2.5
-2.3.2-92
-2.4.31.54
-2.9
點擊圖片查看大圖
Linux發行版glibc(32)位
下面介紹幾個查詢glibc版本號的方法:
#ls–al/lib/libc*
或者是用下面的命令也可以實現
#rpm–qp|grepglibc
基於debian的系統通過dpkg–l|greplibc6也可以查到,總之一般都在/usr/share/doc目錄下都能看到glibc的相關信息。
七、小結
大部分情況下,在遇到軟體包依賴關系問題的時候,操作系統提供的文件名字與軟體包名字都會有直接的聯系。有可能文件的名字就是軟體包的名字。但是有些時候文件的名字與軟體包的名字會相差甚遠。此時大部分系統管理員可能光憑文件名字無法找到對應的軟體包。此時可以先在系統安裝光碟里找,如果找到那時最佳選項,然後就需要藉助筆者上面談到的一些專業網站,去查詢軟體包的名字了。當系統管理員安裝了某個軟體之後,如果存在軟體包之間的依賴關系,則最好能夠拿本子或者通過其他手段記錄下來。以便下次方便實用,注意工作中的積累,相信絕大部分的軟體包依賴關系問題都會迎刃而解。
❻ 怎麼在ubuntu14.04上安裝cuda7.0 deb
1. 預檢查
按照參考鏈接1中所示,檢查系統。
執行命令:
:~$ lspci | grep -i nvidia
03:00.0 3D controller: NVIDIA Corporation GK110GL [Tesla K20c] (rev a1)
04:00.0 VGA compatible controller: NVIDIA Corporation GK106GL [Quadro K4000] (rev a1)
04:00.1 Audio device: NVIDIA Corporation GK106 HDMI Audio Controller (rev a1)
發現有K20和K4000兩塊GPU,還有一塊Audio的應該是音效卡。
然後,執行命令檢查系統版本:
~$ uname -m && cat /etc/*release
x86_64
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
NAME="Ubuntu"
VERSION="14.04.1 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.1 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
可以看到,機器是ubuntu14.04的版本。
然後,使用gcc --version檢查gcc版本是否符合鏈接1中的要求:
~$ gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for ing conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
檢查完畢,就去nvidia的官網(參考鏈接3)上下載驅動,為下載的是ubuntu14.04的deb包。
--------------------------------------分割線 --------------------------------------
Ubuntu 12.04 下 CUDA 編程 http://www.linuxidc.com/linux/2014-06/103056.htm
Ubuntu 12.04 安裝 CUDA-5.5 http://www.linuxidc.com/Linux/2013-10/91101.htm
Ubuntu 11.10 上安裝CUDA開發環境 http://www.linuxidc.com/Linux/2012-04/58913.htm
Fedora 15系統下配置CUDA環境 http://www.linuxidc.com/Linux/2011-12/49874.htm
Ubuntu 11.04 安裝 NVIDIA CUDA 4.0 RC2 http://www.linuxidc.com/Linux/2011-10/46304.htm
Linux Mint 13/Ubuntu 12.04 配置CUDA 4.2 & OpenCV 2.4.2 方法 http://www.linuxidc.com/Linux/2013-10/91102.htm
CUDA入門教程 http://www.linuxidc.com/Linux/2014-07/104328.htm
--------------------------------------分割線 --------------------------------------
2. 安裝
Deb包安裝較為簡單,但是安裝過程中提示不穩定,不過用著也沒啥出錯的地方。
先按照參考鏈接2安裝必要的庫。
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
還是按照官網上的流程來。
$ sudo dpkg -i cuda-repo-<distro>_<version>_<architecture>.deb
$ sudo apt-get update
$ sudo apt-get install cuda
可能需要下載較長時間,但是沒關系,放在那等著就是。
沒啥問題就算安裝好了。
安裝過程中提示:
*** Please reboot your computer and verify that the nvidia graphics driver is loaded. ***
*** If the driver fails to load, please use the NVIDIA graphics driver .run installer ***
*** to get into a stable state.
我沒管,提示使用.run安裝比較穩定,但我現在用著沒問題。
3. 配置環境
我的系統是64位的,因此配置環境時在.bashrc中加入
$ export PATH=/usr/local/cuda-6.5/bin:$PATH
$ export LD_LIBRARY_PATH=/usr/local/cuda-6.5/lib64:$LD_LIBRARY_PATH
配置完環境後,執行命令
~$ source .bashrc
使其立刻生效。
4. 安裝sample
配置好環境後,可以執行如下命令:
$ cuda-install-samples-6.5.sh <dir>
這樣,就將cuda的sample拷貝到dir文件夾下了。該命令只是一個拷貝操作。
然後進入該文件夾,執行make命令進行編譯,編譯時間較長,需要等待。