一步步搭建物聯網系統——GNU/Linux 強大且Free

GNU/Linux 強大且Free

GNU/Linux

什麼是Linux

Linux是一種自由和開放源碼的類UNIX操做系統內核。目前存在着許多不一樣的Linux發行版,可安裝在各類各樣的電腦硬件設備,從手機、平板電腦、路由器和影音遊戲控制檯,到桌上型電腦,大型電腦和超級電腦。
Linux是一個領先的操做系統內核,世界上運算最快的10臺超級電腦運行的都是基於Linux內核的操做系統。php

Linux操做系統也是自由軟件和開放源代碼發展中最著名的例子。只要遵循GNU通用公共許可證,任何人和機構均可以自由地使用Linux的全部底層源代碼,也能夠自由地修改和再發布。嚴格來說,Linux這個詞自己只表示Linux內核,但在實際上人們已經習慣了用Linux來形容整個基於Linux內核,而且使用GNU工程各類工具和數據庫的操做系統(也被稱爲GNU/Linux)。一般狀況下,Linux被打包成供桌上型電腦和服務器使用的Linux發行版本。一些流行的主流Linux發行版本,包括Debian(及其衍生版本Ubuntu),Fedora和openSUSE等。Linux得名於電腦業餘愛好者Linus Torvalds。html

而不是如百度百科所講的~~Linux操做系統是UNIX操做系統的一種克隆系統。它誕生於1991年的 Linux桌面[1]10 月5日(這是第一次正式向外公佈的時間)。之後藉助於Internet網絡,並經過全世界各地計算機愛好者的共同努力,已成爲今天世界上使用最多的一種UNIX類操做系統,而且使用人數還在迅猛增加。~~mysql

Linux只是個內核,而不是操做系統,因此在這咱們再理解一下操做系統是由什麼組成的。linux

操做系統

操做系統(英語:Operating
System,簡稱OS)是管理計算機硬件與軟件資源的計算機程序,同時也是計算機系統的內核與基石。操做系統須要處理如管理與配置內存、決定系統資源供需的優先次序、控制輸入與輸出設備、操做網絡與管理文件系統等基本事務。操做系統也提供一個讓用戶與系統交互的操做界面。
操做系統的型態很是多樣,不一樣機器安裝的操做系統可從簡單到複雜,可從手機的嵌入式系統到超級計算機的大型操做系統。許多操做系統製造者對它涵蓋範疇的定義也不盡一致,例若有些操做系統集成了圖形用戶界面(GUI),而有些僅使用命令行界面(CLI),而將GUI視爲一種非必要的應用程序。nginx

操做系統位於底層硬件與用戶之間,是二者溝通的橋樑。用戶能夠經過操做系統的用戶界面,輸入命令。操做系統則對命令進行解釋,驅動硬件設備,實現用戶要求。以現代標準而言,一個標準PC的操做系統應該提供如下的功能:sql

  • 進程管理(Processing management)
  • 內存管理(Memory management)
  • 文件系統(File system)
  • 網絡通訊(Networking)
  • 安全機制(Security)
  • 用戶界面(User interface)
  • 驅動程序(Device drivers)

而讓咱們來看一下二者之間的不一樣之處,這是一張linux的架構圖咱們能夠發現內核只是位於底層。shell

Linux架構圖

Linux Kernel

用戶模式

應用程序(sh、viOpenOffice.org等)數據庫

複雜KDE、glib等)
簡單庫(opendbm、sin等)編程

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

內核模式

  • 系統中斷、調用、錯誤等軟硬件消息
  • 內核(驅動程序、進程、網絡、內存管理等)
  • 硬件(處理器、內存、各類設備)

咱們能夠發現,由linux內核+shell能夠構成一個操做系統,而linux自己只是個內核,也就是圖中的內核模式,負責控制系統的這些部分。也就是咱們能夠發現,Linux內核構成了一個操做系統除用戶界面之外的部分,而shell就是這最後的用戶界面。

而linux內核之外的部分就是由GNU計劃構成的。

Shell

Shell

Shell是系統的用戶界面,提供了用戶與內核進行交互操做的一種接口。它接收用戶輸入的命令並把它送入內核去執行。

實際上Shell是一個命令解釋器,它解釋由用戶輸入的命令而且把它們送到內核。不只如此,Shell有本身的編程語言用於對命令的編輯,它容許用戶編寫由shell命令組成的程序。Shell編程語言具備普通編程語言的不少特色,好比它也有循環結構和分支控制結構等,用這種編程語言編寫的Shell程序與其餘應用程序具備一樣的效果

bash 是一個爲GNU計劃編寫的Unix shell。它的名字是一系列縮寫:Bourne-Again SHell — 這是關於Bourne shell(sh)的一個雙關語(Bourne again / born
again)。Bourne shell是一個早期的重要shell,由史蒂夫·伯恩在1978年先後編寫,並同Version 7 Unix一塊兒發佈。bash則在1987年由布萊恩·福克斯創造。在1990年,Chet Ramey成爲了主要的維護者。

shell將會是咱們在GNU/linux中常常用到的常常有到的工具之一,用來操做計算機用的。在遷移到linux以前咱們能夠試用cygwin來進行模擬:

Cygwin是許多自由軟件的集合,最初由Cygnus Solutions開發,用於各類版本的Microsoft Windows上,運行UNIX類系統。

GCC

GCC(GNU Compiler Collection,GNU編譯器套裝),是一套由GNU開發的編程語言編譯器。它是一套以GPL及LGPL許可證所發行的自由軟件,也是GNU計劃的關鍵部分,亦是自由的類Unix及蘋果電腦Mac OS X 操做系統的標準編譯器。GCC(特別是其中的C語言編譯器)也常被認爲是跨平臺編譯器的事實標準。

GCC原名爲GNU C語言編譯器(GNU C Compiler),由於它本來只能處理C語言。GCC很快地擴展,變得可處理C++。以後也變得可處理Fortran、Pascal、Objective-C、Java、Ada,以及Go與其餘語言。

c#include <stdio.h>
main()
{
  printf("Hello world\n");
}
bash~/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同樣,對於GNU/linux系統而言,GCC的做用也是無可取代的。固然若是隻是通常用途的話,GCC對於通常用戶可能沒用,可是在些GNU/Linux系統上,咱們可能就須要本身編譯源碼成二進制文件,而沒有軟件包,於是其重要性是不言而喻的。天然的若是咱們本身動手編譯GNU/Linux操做系統的話,咱們會理解其的重要意義。有興趣的同窗能夠試一下:Linux
From Scratch (LFS)。

啓動引導程序

最後,當咱們構成以上的那些以後,咱們就須要一個引導程序,以便使系統啓動,引導進內核。

啓動程序(bootloader)於電腦或其餘計算機應用上,是指引導操做系統啓動的程序。啓動程序啓動方式與程序視應用機型種類。例如在普通PC上,引導程序一般分爲兩部分:第一階段引導程序位於主引導記錄,用於引導位於某個分區上的第二階段引導程序,如NTLDR、GNU
GRUB等。

BIOS
開機完成後,bootloader就接手初始化硬件設備、建立存儲器空間的映射,以便爲操做系統內核準備好

正確的軟硬件環境。

簡單的bootloader的虛擬彙編碼,如其後的八個指令:

  • 0: 將P暫存器的值設爲8
  • 1: 檢查紙帶({paper tape)讀取器,是否已經能夠進行讀取
  • 2: 若是還不能進行讀取, 跳至1
  • 3: 從紙帶讀取器,讀取一byte至累加器
  • 4: 如爲帶子結尾,跳至8
  • 5: 將暫存器的值,存儲至P暫存器中的數值所指定的地址
  • 6: 增長P暫存器的值
  • 7: 跳至1

可是隨着計算機操做系統愈來愈複雜,位於MBR的空間已經放不下引導操做系統的代碼,因而就有了第二階段的引導程序,而MBR中代碼的功能也從直接引導操做系統變成了引導第二階段的引導程序。

一般在一個GNU/Linux系統中選用GNUGRUB作爲引導程序,例如Ubuntu就是用GRUB2。

GNU GRUB(簡稱「GRUB」)是一個來自GNU項目的啓動引導程序。GRUB是多啓動規範的實現,它容許用戶能夠在計算機內同時擁有多個操做系統,並在計算機啓動時選擇但願運行的操做系統。GRUB可用於選擇操做系統分區上的不一樣內核,也可用於向這些內核傳遞啓動參數。

GNU GRUB的前身爲Grand Unified Bootloader。它主要用於類Unix系統;同大多Linux發行版同樣,GNU系統也採用GNU GRUB做爲它的啓動器。Solaris從10 1/06版開始在x86系統上也採用GNU GRUB做爲啓動器。

以上也就構成了一個簡單的操做系統。

從編譯開始

咱們以一次編譯開始咱們的Linux學習之旅。

開始以前

  • 若是你沒有用過GNU/Linux,我想你須要在虛擬機上安裝一個。
  • 一個主流的GNU/Linux發行版,如Ubuntu,CentOS,Debian,Mint,OpenSUSE,Fedora等等。
  • 學會如何打開shell(ps:bash,zsh,sh等等)。

或者你也能夠在Windows上安裝Cygwin。

編譯Nginx

1.下載這個軟件的源碼包

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

wget是一個用於下載的軟件,固然你也能夠用軟件,只是用wget彷佛會比圖形界面快哦。

2.解壓軟件包

bashtar -vf nginx-1.7.4.tar.gz

-vf的意思是Extract,也就是解壓,而tar則是這個解壓軟件的名字。看上去彷佛比WinRAR來得複製得多,可是你能夠計時一下,從下載到解壓完,和你用鼠標比哪一個比較快。

3.到nginx目錄下

這裏須要分兩部進行

1).列出全部文件

bashls -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目錄

bashcd nginx-1.7.4

4.配置nginx

一次簡單的配置以下

bash./configure

當你熟練之後,你可能和我同樣用下面的配置(注意:用下面的代碼會出錯。)

bash./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

過程當中可能會提示你其中出了多少錯誤,而這時你即可以很愉快地去用搜索引擎搜索他們。

5.make

這裏就會用到GCC等等。

bashmake

6.運行

若是運行順利的話,應該能夠直接

bash./objs/nginx

其餘

1.若是沒有wget,make,gcc等命令的時候能夠用相似於下面的方法安裝,

bashsudo apt-get install gcc,make,wget

2.正常狀況下一個開源項目都會有一個README,會告訴你應該如何去作。

包管理

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

引自OpenSUSE官網的說明及圖片1

package management

  1. Linux 發行版無非就是一堆軟件包 (package) 形式的應用程序加上總體地管理這些應用程序的工具。一般這些 Linux 發行版,包括 openSUSE,都是由成千上萬不一樣的軟件包構成的。

  2. 軟件包: 軟件包不止是一個文件,內含構成軟件的全部文件,包括程序自己、共享庫、開發包以及使用說明等。

  3. 元數據 (metadata) 包含於軟件包之中,包含軟件正常運行所須要的一些信息。軟件包安裝以後,其元數據就存儲於本地的軟件包數據庫之中,以用於軟件包檢索。

  4. 依賴關係 (dependencies) 是軟件包管理的一個重要方面。實際上每一個軟件包都會涉及到其餘的軟件包,軟件包里程序的運行須要有一個可執行的環境(要求有其餘的程序、庫等),軟件包依賴關係正是用來描述這種關係的。

Linux 下的軟件包一般是如下三種格式:

  • tgz - tar gzip 文件。這類文件是基本的壓縮軟件包,能夠容納軟件包維護者認爲有用的全部的東西。此格式除自己的壓縮格式外,並無有關軟件包內容的標準。
  • deb - 此格式的軟件包經常使用於 Debian 系統,是標準的 Debian 軟件包格式。
  • rpm - 此格式由 Red Hat Linux 所建立,並經由 LSB 標準化,現已爲衆多 Linux 發行版所採用,是一個優秀的軟件包格式。openSUSE 便是用此格式。更多信息能夠參閱此處。

因此這就須要能自動解決依賴關係的軟件包管理器。軟件包管理系統就是一個工具集,爲系統提供一個統一的安裝、升級、刪除軟件的方式。

Ubuntu LNMP

在餘下的章節中,咱們須要去部署,須要去使用Ubuntu。若是在Windows下可使用LAMP,可是在這裏咱們只說Ubuntu。開始以前你須要安裝好Ubuntu,不管是在虛擬機,仍是在真機安裝,或者是Docker。

Update軟件包列表

apt-get是debian,ubuntu發行版的包管理工具。apt-get update能夠確保咱們的軟件包列表是最新的,下面是一個簡單的更新過程。

打開Terminal或者Konsole等等之類的終端控制檯。

bashroot@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

更新完應該會顯示:

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

安裝MySQL

安裝命令

bashsudo apt-get install mysql-server php5-mysql

過程:

bashroot@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

在安裝的過程當中會要求你輸入數據庫密碼。(默認爲空)

安裝Nginx

bashecho "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

啓動Nginx Server

bashsudo service nginx start

安裝PHP

sudo apt-get install php5-fpm

安裝過程

bashroot@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) ...

在線查看:一步步搭建物聯網系統

圖靈-電子書版一步步搭建物聯網系統


  1. https://zh.opensuse.org/index.php?title=%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%AE%A1%E7%90%86&variant=zh 

相關文章
相關標籤/搜索