5 GNU/Linux

2018-02-24 15:53 更新

GNU/Linux

5.2.1.1 用戶模式

應(yīng)用程序(sh、viOpenOffice.org等)

復(fù)雜KDE、glib等) 簡(jiǎn)單庫(opendbm、sin等)

C庫(open、fopen、socket、exec、calloc等)

5.2.1.2 內(nèi)核模式

  • 系統(tǒng)中斷、調(diào)用、錯(cuò)誤等軟硬件消息
  • 內(nèi)核(驅(qū)動(dòng)程序、進(jìn)程、網(wǎng)絡(luò)、內(nèi)存管理等)
  • 硬件(處理器、內(nèi)存、各種設(shè)備)

我們可以發(fā)現(xiàn),由linux內(nèi)核+shell可以構(gòu)成一個(gè)操作系統(tǒng),而linux本身只是個(gè)內(nèi)核,也就是圖中的內(nèi)核模式,負(fù)責(zé)控制系統(tǒng)的這些部分。也就是我們可以發(fā)現(xiàn),Linux內(nèi)核構(gòu)成了一個(gè)操作系統(tǒng)除用戶界面以外的部分,而shell就是這最后的用戶界面。

而linux內(nèi)核以外的部分就是由GNU計(jì)劃構(gòu)成的。

5.2.2 Shell

圖像說明文字

Shell是系統(tǒng)的用戶界面,提供了用戶與內(nèi)核進(jìn)行交互操作的一種接口。它接收用戶輸入的命令并把它送入內(nèi)核去執(zhí)行。

實(shí)際上Shell是一個(gè)命令解釋器,它解釋由用戶輸入的命令并且把它們送到內(nèi)核。不僅如此,Shell有自己的編程語言用于對(duì)命令的編輯,它允許用戶編寫由shell命令組成的程序。Shell編程語言具有普通編程語言的很多特點(diǎn),比如它也有循環(huán)結(jié)構(gòu)和分支控制結(jié)構(gòu)等,用這種編程語言編寫的Shell程序與其他應(yīng)用程序具有同樣的效果

bash 是一個(gè)為GNU計(jì)劃編寫的Unix shell。它的名字是一系列縮寫:Bourne-Again SHell — 這是關(guān)于Bourne shell(sh)的一個(gè)雙關(guān)語(Bourne again / born again)。Bourne shell是一個(gè)早期的重要shell,由史蒂夫·伯恩在1978年前后編寫,并同Version 7 Unix一起發(fā)布。bash則在1987年由布萊恩·??怂箘?chuàng)造。在1990年,Chet Ramey成為了主要的維護(hù)者。

shell將會(huì)是我們?cè)贕NU/linux中經(jīng)常用到的經(jīng)常有到的工具之一,用來操作計(jì)算機(jī)用的。在遷移到linux之前我們可以試用cygwin來進(jìn)行模擬:

Cygwin是許多自由軟件的集合,最初由Cygnus Solutions開發(fā),用于各種版本的Microsoft Windows上,運(yùn)行UNIX類系統(tǒng)。

5.2.3 GCC

GCC(GNU Compiler Collection,GNU編譯器套裝),是一套由GNU開發(fā)的編程語言編譯器。它是一套以GPL及LGPL許可證所發(fā)行的自由軟件,也是GNU計(jì)劃的關(guān)鍵部分,亦是自由的類Unix及蘋果電腦Mac OS X 操作系統(tǒng)的標(biāo)準(zhǔn)編譯器。GCC(特別是其中的C語言編譯器)也常被認(rèn)為是跨平臺(tái)編譯器的事實(shí)標(biāo)準(zhǔn)。

GCC原名為GNU C語言編譯器(GNU C Compiler),因?yàn)樗局荒芴幚鞢語言。GCC很快地?cái)U(kuò)展,變得可處理C++。之后也變得可處理Fortran、Pascal、Objective-C、Java、Ada,以及Go與其他語言。

#include <stdio.h>
main()
{
  printf("Hello world\n");
}
~/temp/free> gcc hello.c -o hello
hello.c:2:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
main()
^~~~
1 warning generated.
~/temp/free> ./hello
Hello world

同shell一樣,對(duì)于GNU/linux系統(tǒng)而言,GCC的作用也是無可取代的。當(dāng)然如果只是一般用途的話,GCC對(duì)于一般用戶可能沒用,但是在些GNU/Linux系統(tǒng)上,我們可能就需要自己編譯源碼成二進(jìn)制文件,而沒有軟件包,因而其重要性是不言而喻的。自然的如果我們自己動(dòng)手編譯GNU/Linux操作系統(tǒng)的話,我們會(huì)理解其的重要意義。有興趣的同學(xué)可以試一下:Linux From Scratch (LFS)。

5.2.4 啟動(dòng)引導(dǎo)程序

最后,當(dāng)我們構(gòu)成以上的那些之后,我們就需要一個(gè)引導(dǎo)程序,以便使系統(tǒng)啟動(dòng),引導(dǎo)進(jìn)內(nèi)核。

啟動(dòng)程序(bootloader)于電腦或其他計(jì)算機(jī)應(yīng)用上,是指引導(dǎo)操作系統(tǒng)啟動(dòng)的程序。啟動(dòng)程序啟動(dòng)方式與程序視應(yīng)用機(jī)型種類。例如在普通PC上,引導(dǎo)程序通常分為兩部分:第一階段引導(dǎo)程序位于主引導(dǎo)記錄,用于引導(dǎo)位于某個(gè)分區(qū)上的第二階段引導(dǎo)程序,如NTLDR、GNU GRUB等。

BIOS 開機(jī)完成后,bootloader就接手初始化硬件設(shè)備、創(chuàng)建存儲(chǔ)器空間的映射,以便為操作系統(tǒng)內(nèi)核準(zhǔn)備好

正確的軟硬件環(huán)境。

簡(jiǎn)單的bootloader的虛擬匯編碼,如其后的八個(gè)指令:

  • 0: 將P暫存器的值設(shè)為8
  • 1: 檢查紙帶({paper tape)讀取器,是否已經(jīng)可以進(jìn)行讀取
  • 2: 如果還不能進(jìn)行讀取, 跳至1
  • 3: 從紙帶讀取器,讀取一byte至累加器
  • 4: 如為帶子結(jié)尾,跳至8
  • 5: 將暫存器的值,存儲(chǔ)至P暫存器中的數(shù)值所指定的地址
  • 6: 增加P暫存器的值
  • 7: 跳至1

但是隨著計(jì)算機(jī)操作系統(tǒng)越來越復(fù)雜,位于MBR的空間已經(jīng)放不下引導(dǎo)操作系統(tǒng)的代碼,于是就有了第二階段的引導(dǎo)程序,而MBR中代碼的功能也從直接引導(dǎo)操作系統(tǒng)變成了引導(dǎo)第二階段的引導(dǎo)程序。

通常在一個(gè)GNU/Linux系統(tǒng)中選用GNUGRUB做為引導(dǎo)程序,例如Ubuntu就是用GRUB2。

GNU GRUB(簡(jiǎn)稱“GRUB”)是一個(gè)來自GNU項(xiàng)目的啟動(dòng)引導(dǎo)程序。GRUB是多啟動(dòng)規(guī)范的實(shí)現(xiàn),它允許用戶可以在計(jì)算機(jī)內(nèi)同時(shí)擁有多個(gè)操作系統(tǒng),并在計(jì)算機(jī)啟動(dòng)時(shí)選擇希望運(yùn)行的操作系統(tǒng)。GRUB可用于選擇操作系統(tǒng)分區(qū)上的不同內(nèi)核,也可用于向這些內(nèi)核傳遞啟動(dòng)參數(shù)。

GNU GRUB的前身為Grand Unified Bootloader。它主要用于類Unix系統(tǒng);同大多Linux發(fā)行版一樣,GNU系統(tǒng)也采用GNU GRUB作為它的啟動(dòng)器。Solaris從10 1/06版開始在x86系統(tǒng)上也采用GNU GRUB作為啟動(dòng)器。

以上也就構(gòu)成了一個(gè)簡(jiǎn)單的操作系統(tǒng)。

5.3 從編譯開始

我們以一次編譯開始我們的Linux學(xué)習(xí)之旅。

5.3.1 開始之前

  • 如果你沒有用過GNU/Linux,我想你需要在虛擬機(jī)上安裝一個(gè)。
  • 一個(gè)主流的GNU/Linux發(fā)行版,如Ubuntu,CentOS,Debian,Mint,OpenSUSE,Fedora等等。
  • 學(xué)會(huì)如何打開shell(ps:bash,zsh,sh等等)。

或者你也可以在Windows上安裝Cygwin。

5.3.2 編譯Nginx

1.下載這個(gè)軟件的源碼包

wget http://nginx.org/download/nginx-1.7.4.tar.gz

wget是一個(gè)用于下載的軟件,當(dāng)然你也可以用軟件,只是用wget似乎會(huì)比圖形界面快哦。

2.解壓軟件包

tar -vf nginx-1.7.4.tar.gz

-vf的意思是Extract,也就是解壓,而tar則是這個(gè)解壓軟件的名字??瓷先ニ坪醣萕inRAR來得復(fù)制得多,但是你可以計(jì)時(shí)一下,從下載到解壓完,和你用鼠標(biāo)比哪個(gè)比較快。

3.到nginx目錄下

這里需要分兩部進(jìn)行

(1)列出所有文件

ls -al

drwxr-xr-x   15 fdhuang  staff   510B Sep  2 13:44 nginx-1.7.4
-rw-r--r--    1 fdhuang  staff   798K Aug  5 21:55 nginx-1.7.4.tar.gz

(2)到nginx-1.7.4目錄

cd nginx-1.7.4

4.配置nginx

一次簡(jiǎn)單的配置如下

./configure

當(dāng)你熟練以后,你可能和我一樣用下面的配置(注意:用下面的代碼會(huì)出錯(cuò)。)

./configure --user=www --group=www --add-module=../ngx_pagespeed-1.8.3.4-beta --add-module=../ngx_cache_purge --prefix=/usr/local/nginx --with-pcre --with-http_spdy_module --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-ipv6

過程中可能會(huì)提示你其中出了多少錯(cuò)誤,而這時(shí)你便可以很愉快地去用搜索引擎搜索他們。

5.make

這里就會(huì)用到GCC等等。

make

6.運(yùn)行

如果運(yùn)行順利的話,應(yīng)該可以直接

./objs/nginx

5.3.3 其他

1.如果沒有wget,make,gcc等命令的時(shí)候可以用類似于下面的方法安裝,

sudo apt-get install gcc,make,wget

2.正常情況下一個(gè)開源項(xiàng)目都會(huì)有一個(gè)README,會(huì)告訴你應(yīng)該如何去做。

5.4 包管理

GNU/Linux最方便的東西莫過于包管理了。

引自O(shè)penSUSE官網(wǎng)的說明及圖片^pm

package management

  1. Linux 發(fā)行版無非就是一堆軟件包 (package) 形式的應(yīng)用程序加上整體地管理這些應(yīng)用程序的工具。通常這些 Linux 發(fā)行版,包括 openSUSE,都是由成千上萬不同的軟件包構(gòu)成的。

  2. 軟件包: 軟件包不止是一個(gè)文件,內(nèi)含構(gòu)成軟件的所有文件,包括程序本身、共享庫、開發(fā)包以及使用說明等。

  3. 元數(shù)據(jù) (metadata) 包含于軟件包之中,包含軟件正常運(yùn)行所需要的一些信息。軟件包安裝之后,其元數(shù)據(jù)就存儲(chǔ)于本地的軟件包數(shù)據(jù)庫之中,以用于軟件包檢索。

  4. 依賴關(guān)系 (dependencies) 是軟件包管理的一個(gè)重要方面。實(shí)際上每個(gè)軟件包都會(huì)涉及到其他的軟件包,軟件包里程序的運(yùn)行需要有一個(gè)可執(zhí)行的環(huán)境(要求有其他的程序、庫等),軟件包依賴關(guān)系正是用來描述這種關(guān)系的。

Linux 下的軟件包通常是以下三種格式:

  • tgz - tar gzip 文件。這類文件是基本的壓縮軟件包,可以容納軟件包維護(hù)者認(rèn)為有用的所有的東西。此格式除本身的壓縮格式外,并沒有有關(guān)軟件包內(nèi)容的標(biāo)準(zhǔn)。
  • deb - 此格式的軟件包常用于 Debian 系統(tǒng),是標(biāo)準(zhǔn)的 Debian 軟件包格式。
  • rpm - 此格式由 Red Hat Linux 所創(chuàng)建,并經(jīng)由 LSB 標(biāo)準(zhǔn)化,現(xiàn)已為眾多 Linux 發(fā)行版所采用,是一個(gè)優(yōu)秀的軟件包格式。openSUSE 即是用此格式。更多信息可以參閱此處。

所以這就需要能自動(dòng)解決依賴關(guān)系的軟件包管理器。軟件包管理系統(tǒng)就是一個(gè)工具集,為系統(tǒng)提供一個(gè)統(tǒng)一的安裝、升級(jí)、刪除軟件的方式。

5.5 Ubuntu LNMP

在余下的章節(jié)中,我們需要去部署,需要去使用Ubuntu。如果在Windows下可以使用LAMP,但是在這里我們只說Ubuntu。開始之前你需要安裝好Ubuntu,無論是在虛擬機(jī),還是在真機(jī)安裝,或者是Docker。

5.4.1 Update軟件包列表

apt-get是debian,ubuntu發(fā)行版的包管理工具。apt-get update可以確保我們的軟件包列表是最新的,下面是一個(gè)簡(jiǎn)單的更新過程。

打開Terminal或者Konsole等等之類的終端控制臺(tái)。

root@70cdc7a176a5:/# sudo apt-get update
Ign http://archive.ubuntu.com trusty InRelease
Ign http://archive.ubuntu.com trusty-updates InRelease
Ign http://archive.ubuntu.com trusty-security InRelease
Ign http://archive.ubuntu.com trusty-proposed InRelease
Get:1 http://archive.ubuntu.com trusty Release.gpg [933 B]
Get:2 http://archive.ubuntu.com trusty-updates Release.gpg [933 B]
Get:3 http://archive.ubuntu.com trusty-security Release.gpg [933 B]
Get:4 http://archive.ubuntu.com trusty-proposed Release.gpg [933 B]
Get:5 http://archive.ubuntu.com trusty Release [58.5 kB]
Get:6 http://archive.ubuntu.com trusty-updates Release [62.0 kB]
Get:7 http://archive.ubuntu.com trusty-security Release [62.0 kB]
Get:8 http://archive.ubuntu.com trusty-proposed Release [209 kB]
Get:9 http://archive.ubuntu.com trusty/main Sources [1335 kB]
Get:10 http://archive.ubuntu.com trusty/restricted Sources [5335 B]
Get:11 http://archive.ubuntu.com trusty/universe Sources [7926 kB]
Get:12 http://archive.ubuntu.com trusty/main amd64 Packages [1743 kB]
Get:13 http://archive.ubuntu.com trusty/restricted amd64 Packages [16.0 kB]
Get:14 http://archive.ubuntu.com trusty/universe amd64 Packages [7589 kB]
64% [14 Packages 664 kB/7589 kB 9%]                          58.3 kB/s 1min 58s

更新完應(yīng)該會(huì)顯示:

Fetched 20.5 MB in 5min 22s (63.6 kB/s)
Reading package lists... Done

5.4.2 安裝MySQL

安裝命令

sudo apt-get install mysql-server php5-mysql

過程:

root@70cdc7a176a5:/# sudo apt-get install mysql-server php5-mysql
Reading package lists... 0%
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  libaio1 libdbd-mysql-perl libdbi-perl libhtml-template-perl libmysqlclient18
  libterm-readkey-perl libwrap0 lsof mysql-client-5.5 mysql-client-core-5.5
  mysql-common mysql-server-5.5 mysql-server-core-5.5 php5-common php5-json
  psmisc tcpd
Suggested packages:
  libclone-perl libmldbm-perl libnet-daemon-perl libplrpc-perl
  libsql-statement-perl libipc-sharedcache-perl tinyca mailx php5-user-cache
The following NEW packages will be installed:
  libaio1 libdbd-mysql-perl libdbi-perl libhtml-template-perl libmysqlclient18
  libterm-readkey-perl libwrap0 lsof mysql-client-5.5 mysql-client-core-5.5
  mysql-common mysql-server mysql-server-5.5 mysql-server-core-5.5 php5-common
  php5-json php5-mysql psmisc tcpd
0 upgraded, 19 newly installed, 0 to remove and 12 not upgraded.
Need to get 9982 kB of archives.
After this operation, 99.1 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/main libaio1 amd64 0.3.109-4 [6364 B]
Get:2 http://archive.ubuntu.com/ubuntu/ trusty-updates/main mysql-common all 5.5.40-0ubuntu0.14.04.1 [14.1 kB]
Get:3 http://archive.ubuntu.com/ubuntu/ trusty-updates/main libmysqlclient18 amd64 5.5.40-0ubuntu0.14.04.1 [598 kB]
Get:4 http://archive.ubuntu.com/ubuntu/ trusty/main libwrap0 amd64 7.6.q-25 [46.2 kB]
Get:5 http://archive.ubuntu.com/ubuntu/ trusty/main libdbi-perl amd64 1.630-1 [879 kB]
Get:6 http://archive.ubuntu.com/ubuntu/ trusty/main libdbd-mysql-perl amd64 4.025-1 [99.3 kB]
Get:7 http://archive.ubuntu.com/ubuntu/ trusty/main libterm-readkey-perl amd64 2.31-1 [27.4 kB]
Get:8 http://archive.ubuntu.com/ubuntu/ trusty-updates/main mysql-client-core-5.5 amd64 5.5.40-0ubuntu0.14.04.1 [703 kB]
Get:9 http://archive.ubuntu.com/ubuntu/ trusty-updates/main mysql-client-5.5 amd64 5.5.40-0ubuntu0.14.04.1 [1466 kB]
Get:10 http://archive.ubuntu.com/ubuntu/ trusty-updates/main mysql-server-core-5.5 amd64 5.5.40-0ubuntu0.14.04.1 [3215 kB]
47% [10 mysql-server-core-5.5 850 kB/3215 kB 26%]             79.9 kB/s 1min 6s

在安裝的過程中會(huì)要求你輸入數(shù)據(jù)庫密碼。(默認(rèn)為空)

5.4.3 安裝Nginx

echo "deb http://ppa.launchpad.net/nginx/stable/ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/nginx-stable.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C300EE8C
sudo apt-get update
sudo apt-get install nginx

啟動(dòng)Nginx Server

sudo service nginx start

5.4.4 安裝PHP

sudo apt-get install php5-fpm

安裝過程

root@70cdc7a176a5:/# sudo apt-get install php5-fpm
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  libsystemd-daemon0
Suggested packages:
  php-pear
The following NEW packages will be installed:
  libsystemd-daemon0 php5-fpm
0 upgraded, 2 newly installed, 0 to remove and 12 not upgraded.
Need to get 2201 kB of archives.
After this operation, 9326 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://archive.ubuntu.com/ubuntu/ trusty-proposed/main libsystemd-daemon0 amd64 204-5ubuntu20.8 [9608 B]
Get:2 http://archive.ubuntu.com/ubuntu/ trusty-updates/universe php5-fpm amd64 5.5.9+dfsg-1ubuntu4.5 [2191 kB]
Fetched 2201 kB in 1min 5s (33.6 kB/s)
Selecting previously unselected package libsystemd-daemon0:amd64.
(Reading database ... 13105 files and directories currently installed.)
Preparing to unpack .../libsystemd-daemon0_204-5ubuntu20.8_amd64.deb ...
Unpacking libsystemd-daemon0:amd64 (204-5ubuntu20.8) ...
Selecting previously unselected package php5-fpm.
Preparing to unpack .../php5-fpm_5.5.9+dfsg-1ubuntu4.5_amd64.deb ...
Unpacking php5-fpm (5.5.9+dfsg-1ubuntu4.5) ...
Processing triggers for ureadahead (0.100.0-16) ...
Setting up libsystemd-daemon0:amd64 (204-5ubuntu20.8) ...
Setting up php5-fpm (5.5.9+dfsg-1ubuntu4.5) ...

Creating config file /etc/php5/fpm/php.ini with new version
php5_invoke: Enable module pdo for fpm SAPI
php5_invoke: Enable module pdo_mysql for fpm SAPI
php5_invoke: Enable module opcache for fpm SAPI
php5_invoke: Enable module json for fpm SAPI
php5_invoke: Enable module mysql for fpm SAPI
php5_invoke: Enable module mysqli for fpm SAPI
invoke-rc.d: policy-rc.d denied execution of start.
Processing triggers for libc-bin (2.19-0ubuntu6.3) ...
Processing triggers for ureadahead (0.100.0-16) ...
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)