第一篇 基礎篇 第1章 Linux概述 1.1 Linux的起源 1991年芬蘭學生Linus Torvalds寫的磁碟驅動和文件系統開源發佈,Linux即“Linus的Minix”。 1994年內核1.0版發佈,最新內核版本4.14.11。 1.2 追溯到Unix 1969年AT&T貝爾實驗室的一 ...
第一篇 基礎篇 第1章 Linux概述 1.1 Linux的起源 1991年芬蘭學生Linus Torvalds寫的磁碟驅動和文件系統開源發佈,Linux即“Linus的Minix”。 1994年內核1.0版發佈,最新內核版本4.14.11。 1.2 追溯到Unix 1969年AT&T貝爾實驗室的一個研究項目。 1977年加州大學伯克利分校基於源碼發佈了Berkeley Unix,發行版通稱為BSD(伯克利軟體發行版)。 1979年免費提供給各大學,但獲取源代碼需要繳納許可費。 1989年徹底移除AT&T代碼的BSD發佈。 1995年 4.4BSD-Lite發行,團隊解散,目前大多數BSD如FreeBSD,OpenBSD都從該版本發展而來。同時沿用AT&T代碼的Unix系統有HP-UX、Solaris等。 Linux由全球開發社區對Unix借鑒後重新實現,不屬於BSD和AT&T任何一種。 1.3 開源許可證協議 BSD、MIT、Apache 用戶可以修改並保留修改部分的源代碼版權。 GPL linux所遵守,更嚴格,要求用戶將所做的一切修改回饋社區,變成自由軟體。 上世紀80年代初期,Richard Stallman發起GNU計劃,即GNU's NOT Unix的縮寫。 GPL即GNU公共許可證(GNU Public License),包括四點內容: A、軟體最初的作者保留版權。 B、其他人可以修改、銷售該軟體,也可以此為基礎開發新軟體。但必須保證開源。 C、經過修改的軟體仍然受GPL約束。 D、軟體使用中引起的損失,開發人員不承擔責任。 1.4 Linux的發行版 Linux實際上只定義了一個操作系統內核,這個內核由kernel.org負責維護。不同企業和組織在此基礎上開發了一系列輔助軟體,打包發佈自己的“發行版本”。 第2章 Linux安裝 2.1 Grub Grub是linux預設的操作系統引導載入器,可以引導windows,linux、FreeBSD等多種操作系統。 安裝linux後再安裝windows會覆蓋原有的Grub引導程式。 Grub硬碟編號格式hd#(不區分硬碟類型),從數字0開始,如:hd0、hd1。 Grub硬碟分區格式(hd#,#),也從數字0開始,主分區為0-3,邏輯分區為4開始,如:(hd0,0)。 2.2 Linux硬碟分區 hd:IDE硬碟;sd:SCSI硬碟、SATA硬碟。 第一塊硬碟編號從小寫字母a開始,如:sda、sdb。 每塊硬碟只能存在4個主分區,即數字1-4,如:sda1、sda2、sda3、sda4。數字5開始的為邏輯分區,沒有個數限制,如sdb5。 操作系統主體可以安裝在主分區或邏輯分區,但引導程式必須安裝在主分區。 swap交換分區不需要掛載點,容量應該大於實際物理記憶體容量。 第3章 桌面環境 3.1 X視窗系統 X系統基於一種獨特的伺服器/客戶機架構。 X伺服器:實際控制輸入和輸出設備,並定義設備的抽象介面給X客戶端程式使用。設計意義:與平臺無關,讓用戶自由選擇來定製桌面。配置文件為 /etc/X11/xorg.conf 。 X客戶端程式:需要向X伺服器請求服務的程式,包括視窗管理器。 視窗管理器:負責控制應用程式視窗的各種行為。 顯示管理器:一個驗證用戶身份的登錄界面,並由它啟動包括X伺服器的所有圖形界面。若關閉,則只能startx命令啟動X伺服器。 widget庫:定義一套圖形用戶界面的編程介面。應用程式開發人員調用它來與X伺服器交互。 桌面環境:分為KDE(C++語言實現,基於Qt庫,華麗)和Gnome(C語言實現,基於GTK+widget庫,簡潔,自由,後誕生)兩大類,它將除X伺服器以外的上述所有與X有關的東西打包成大雜燴。但最後處理圖形輸出的仍然是X伺服器。 3.2 X系統啟動過程 X系統啟動由顯示管理器來完成,顯示管理器啟動後依次完成如下操作: A、啟動X伺服器。 B、提供登錄界面,等待驗證用戶身份。 C、執行用戶引導腳本Xsession,視窗管理器是Xsession啟動的唯一前臺程式。Xsession一直運行直到用戶退出。 3.3 啟動X程式 X伺服器接受來自多個應用程式(含遠程網路主機)的請求,併在本地顯示。 環境變數DISPLAY格式:DISPLAY=servername:X伺服器編號(從0開始). 屏幕編號(從0開始)。如:host:3.2,:0.0,:0 。 第二篇 系統管理篇 第4章 Shell基本命令 4.1 Shell簡介 Shell是一個命令解釋器程式,在用戶和操作系統之間提供一個面向行的可交互介面。 Shell種類有BASH、TCSH Shell、Z-Shell等,BASH是Linux預設安裝的,並預設有7個控制台,分別是Ctrl+Alt+F1~F7進入,第7個留給X伺服器。 Shell通配符為“ * ”,“?”," [ ] "。其中*匹配文件名中任意長度字元串,?匹配一個字元,[ ] 匹配所有出現在方括弧中的字元,可以用“-”指定一個字元集範圍。 4.2 常用命令 第一批:cd,ls,pwd,cat,more,head,tail,less,[ez]grep,find,location,whereis,who,whoami,uname,man,whatis,apropos,date,hostname,env。 第二批:groupadd,useradd,passwd,mkdir,touch,chown,chgrp,chmod,mv,cp,echo,rm,rmdir,ls,>,>>,<,<< EOF\n 。。。\nEOF,| 。 第三批:rpm,yum,apt,dpkg,./configure腳本生成makefile文件,make,make install。 第四批:mount,umount,df,fsck,mkfs,lsusb,gzip,gunzip,bzip2,bunzip2,rar,tar,dd,[r]dump,[r]restore,fdisk,mkswap 。 第五批:history,userdel,usermod,id,su,sudo。 第六批:ps,kill,top,lsof,nice,renice。 第七批:ifconfig,netstat,route。 第八批:cut,diff,sort,uniq,tr,wc,substr,seq,source,export。 第九批:exportfs,showmount,at,atq,atrm,iptables,nmap。 4.3 find命令 格式:find [路徑] [選項] -name 文件名,可含通配符。 -type 文件類型,取值:bcdfpl 。b塊設備文件,c字元設備文件,d目錄文件,f普通文件,p命名管道,l符號鏈接。 -atime n 最後一次使用在n天前;+n 大於等於n天前; -n 小於n天前。 -mtime n 最後一次修改在n天前。 -print 將結果輸出到標準輸出(屏幕)。 #查找當前目錄最後一天內修改過的名字尾碼zip的普通文件 $ find . -type f -name *zip -mtime -1 -print location命令查找文件資料庫,速度很快,使用updatedb命令更新資料庫。如:location *.doc 。 4.4 uname命令 $uname -r #查看內核版本。 $uname -a #查看操作系統所有有用信息。 4.5 ln命令 格式:ln [-s] TARGET LINKNAME #預設建立硬鏈接,-s選項為符號鏈接。 兩者區別:硬鏈接是直接引用,符號鏈接通過名稱進行引用。 第5章 磁碟管理 5.1 ext3fs文件系統 ext3fs比ext2fs增加了日誌功能,用於災難恢復,提高文件系統可靠性。原理:文件寫操作時,先記錄寫前日誌文件,並將日誌保存到一塊專門區域。 swap交換分區,目的是通過操作系統的調度,程式實際可使用的記憶體空間遠遠超過物理記憶體。原理:當記憶體不足時,將暫時不用的數據取出,放到交換分區里,來為當前程式騰出記憶體空間。 5.2 設備文件 Linux中每個設備都映射為一個設備文件,使用時需先掛載到文件系統的一個目錄下。啟動時掛載 /etc/fstab 。 塊設備文件可以隨機讀寫,如磁碟。 字元設備文件只能按順序接收字元流,如印表機。 5.3 硬碟管理 RAID:獨立磁碟冗餘陣列。 LVM:邏輯捲管理器。 第6章 用戶管理 6.1 ID和文件 UID:用戶唯一標識,32位無符號整數,root用戶uid為0。 GID:用戶組唯一標識,32位無符號整數,root用戶組gid為0。 用戶信息文件為/etc/passwd,用戶口令文件為/etc/shadow。 用戶組文件為/etc/group。 第7章 進程管理 7.1 ID和文件 PID:進程唯一標識。 PPID:父進程的PID。 UID:只有進程的創建者和root用戶才能操作進程。 EUID:進程的有效用戶ID,用來確定進程對某些資源和文件的訪問許可權。場景:setuid類的程式passwd,當普通用戶修改只有root才能操作的shadow文件,臨時提高許可權。 GID:進程的組ID,場景:當進程需要創建一個新文件時,將採用該進程的GID。 EGID:進程的有效組ID。 謙讓度:與優先順序相反。 /PROC:一個特殊的“文件系統”目錄,存放內核有關係統狀態的各種有意義信息。 第8章 網路管理 8.1 文件 本地dns信息保存到/etc/hosts 。 第9章 傳輸文件 9.1 NFS NFS目前只用於Linux和UNIX主機間共用文件系統,首先要求對方主機開啟NFS伺服器,就可以掛載到本地 。 #掛載NFS共用目錄 mount -o rw,hard,intr,bg IP或host@path localpath/ #查看伺服器共用目錄 showmount -e IP或主機 #卸載NFS共用目錄 umount localpath/ 9.2 Samba SMB:Server Message Block ,伺服器消息塊協議。微軟和英特爾共同研發的windows的共用文件系統協議。 CIFS:Common Internet File System , 公共Internet文件系統協議,是SMB的升級版本。 Samba:1991年澳大利亞人用逆向工程實行的CIFS協議。 Samba包含一個服務端程式和多個客戶端程式。安裝在Linux的服務端向windows提供共用,windows不用安裝任何工具。客戶端程式用於獲取windows的共用內容。 命令:smbtree,nmblookup,smbclient,smbmount,mount.cifs 。 9.3 FTP ftp:linux自帶的一個命令行的FTP工具,採用不加密傳輸方式,格式:ftp host|ip [port] 。 ftp>? 登錄後,用?列出所有ftp命令。 put 上傳文件,get 下載文件,cd,ls,pwd,mkdir,rm,quit等。 9.4 sftp和scp sftp:基於SSH的文件傳輸,首先確保遠程主機開啟了SSH守護進程,格式:sftp user@host|ip [port] 。 scp:基於SSH的文件複製,格式:scp user@host|ip:path localpath/ 。 第10章 遠程登錄 10.1 SSH telnet:採用明文口令,已廢棄。 SSH:secure shell,安全的shell。SSH會對用戶身份進行驗證,並加密兩台主機的通信。商業版本為SSH2。開源社區版本是OpenSSH,由FreeBSD負責維護。啟動SSH伺服器命令 /etc/init.d/ssh start 。 ssh -l user -p 22 ip|host #ssh登錄。 exit #ssh退出。 使用SSH秘鑰,客戶端使用rsa私鑰,服務端用公鑰驗簽。 ssh-keygen -t rsa #生成rsa密鑰對,id_rsa和id_rsa_pub兩個文件自動放到~/.ssh/目錄下。 ssh -l user2 host|ip #登錄到user2 mkdir .ssh chmod 700 .ssh exit scp ~/.ssh/id_rsa_pub user@host|ip:/home/user2/.ssh/authorized_keys #拷貝公鑰到伺服器登錄用戶名下。 10.2 VNC VNC:Virtual Network Computing,虛擬網路計算,用於圖形化的遠程登錄。要求伺服器端運行有X視窗系統,需要先用vncserver命令配置遠程訪問密碼。。 vncviewer是一款跨平臺的VNC客戶端工具, 10.3 跨平臺登錄 windows登錄linux:命令行用putty,圖形化用vncviewer。 linux登錄windows:命令行用rdesktop,圖形化用vnc(windows需裝vnsserver)。 第11章 Linux編程 11.1 編輯器 vim:vi的增強版本。分為插入和命令兩種模式。格式:vim file。 emacs:類似快捷方式,幾乎等價於一個操作系統,可以打開後完成所有工作,直到關機離開。 圖形化編輯器:gedit在gnome下,kate在KDE下。 11.2 gcc和gdb gcc:GUN Compiler Collection,可以編譯C、C++、OC、Java等語言。 g++:編譯C++時,可以完成編譯和連接,而gcc不能自動和cpp使用的庫連接。 gdb:程式調試工具。 11.3 常用shell命令 cut -c3-6 file #提取每一行的第3~6位置的字元,首字元位置從1開始。 cut -d" " -f2 file #提取每一行按空格分割的第2個欄位,沒有d,則預設TAB為分隔符。 sort -k2 -r file #按第2個欄位倒序排序。 uniq #從已排好序的輸入中刪除重覆行,必須在輸入已排序時才能正確工作。 source file #強行讓一個腳本文件影響其父shell環境。 export key=value #讓腳本可以影響其子shell環境。 11.4 個性化設置 alias ll='ls -l' #創建命令的別名。 ~/.bashrc文件是一個shell腳本,用戶登錄後自動執行。修改後$source .bashrc 立即生效。 /etc/bash.bashrc文件是全局定製shell。 第三篇 伺服器配置篇 第12章 伺服器基礎知識 12.1 系統引導 按下電源後啟動過程如下: ①執行存儲在ROM中的BIOS代碼,目的:根據BIOS設置來獲取引導設備位置。 ②載入引導設備開頭512個位元組段的MBR(Master Boot Record,主引導記錄),目的:根據MBR內容來獲取“引導載入程式”的位置,即Boot Loader,linux最著名的引導載入程式就是Grub。 ③載入並執行引導載入程式Grub,Grub負責載入操作系統內核。 ④Grub載入並初始化Linux內核, ⑤內核配置並檢測硬體設備。 ⑥內核創建自發進程。該進程只執行最基本的硬體操作和調度。 ⑦由用戶決定是否進入手工引導模式 ⑧由init進程執行系統啟動腳本。創建用戶級操作的進程最後都被內核下放給init進程完成。 ⑨進入多用戶模式。 12.2 init進程和運行級 幾乎所有的進程都是由init創建的。init的配置文件為/etc/inittab。 init有7個運行級,預設是5,伺服器設置為3。 0 系統關閉,1或S 單用戶模式,2 功能受限的多用戶模式,3 完整的多用戶模式,4 保留自定義,5 多用戶模式,運行X視窗系統,6 重新啟動。 telinit 6 #強制系統進入某個運行級,此處為重啟。 /etc/init.d/rc腳本,根據傳入運行級參數查找對應目錄,執行其中的腳本。 /etc/rc[0-6S].d目錄,保存各運行級腳本。 /etc/init.d,伺服器守護進程的啟動腳本全部位於該目錄下。 12.3 守護進程 守護進程daemon是一類在後臺運行的特殊進程。init是系統第一個啟動、也是最重要的守護進程。 守護進程兩種運行方式:standalone模式和inetd/xinetd模式。 standalone模式:隨系統啟動而啟動,並持續在後臺監聽連接請求,缺點:“沒有事做”的守護進程會大量消耗系統資源。 inetd/xinetd模式:接管其他守護進程使用的網路埠,在監聽到連接請求後啟動相應守護進程,建立到指定埠的IO通道,完成任務後再關閉守護進程。缺點:對於高併發的連接請求,頻繁啟動關閉守護進程會很糟糕。 /etc/xinetd.conf 配置文件,/etc/xinetd.d目錄保存要添加的守護進程服務。 第13章 伺服器搭建 13.1 FTP伺服器 vsftpd:一款安全性較高的FTP伺服器程式,ftp伺服器應儘量使用inetd/xinetd方式運行。缺點:使用明文口令。 FTP兩種連接模式 主動連接:預設21和20埠,21埠處理客戶端的命令,20埠文件傳輸。 被動連接:21埠和大於1024的非特權埠,21埠處理命令,另一個文件傳輸。 /etc/init.d/vsftpd start|stop|restart #啟動ftp服務 13.2 NFS NFS:Network File System,網路文件系統,基於伺服器/客戶機架構,需要安裝nfs-common,nfs-kernel-server軟體包。NFSv3協議增加非同步寫操作功能,但為無狀態不支持文件上鎖功能。NFSv4協議有狀態,增加鎖、支持windows客戶機、更高性能。 /etc/exports:NFS配置文件,用來設置NFS伺服器的共用文件列表。用exportfs -a使改動生效。showmount查看掛載情況。 NFS使用基於TCP協議的RPC作為傳輸協議。應該使用防火牆、壓制root和匿名映射等方法增加NFS伺服器安全性。 nfsstat -s #監視NFS伺服器相關信息。 nfsstat -c #監視NFS客戶機相關信息。 第三篇 系統安全篇 第14章 任務計劃cron 14.1 crontab /etc/crontab:全局任務計劃配置文件,格式為:分鐘 小時 日 月 星期 執行用戶 (執行命令) 。“*”為不限,“-”為連續整數區間,“,”為離散整數。 /etc/init.d/cron restart|start|stop:cron守護進程的啟動腳本。 /var/spool/cron/username.cron:用戶個性化cron配置文件。 第15章 防火牆iptables 15.1 iptables iptables是一種典型的包過濾防火牆。通過檢測到達的數據包頭中的信息,如:目的地址,埠,協議號等,來確定哪些數據包可以通過。 chain:鏈,一條防火牆規則。 table:表,一組功能相似的chain的集合。iptables預設表是filter(過濾器),其中預設包含3條鏈:FORWARD(轉發),INPUT(發入本機),OUTPUT(本機發出)。其他表還有nat和mangle兩個表。nat表用於網路地址轉換NAT,mangle則用於修改除了NAT和包過濾之外的網路包。 15.2 nmap nmap用於掃描一組主機的網路埠。