跳轉到內容

從零開始構建 Linux

0% developed
來自華夏公益教科書

本書是一個開源嘗試,討論如何透過從空白硬碟開始並組裝 Linux 發行版(如 Debian、Fedora Core 或 Slackware)所需的全部“部件”來建立一個 Linux 計算機系統。如果您不知道什麼是 Linux,請停止閱讀。先閱讀一些關於 Linux 主題的其他書籍——也許是使用 Ubuntu LinuxPuredyneLinux 指南瞭解 Knoppix。首先閱讀本書只會讓您更加困惑。這不是一個新手指南,也不是一個安裝手冊。它更像是一張地圖,討論了在現實世界中嘗試建立一個 Linux 控制的計算機(特別是 x86 計算機)的各個方面,因為這是原始核心的編寫目標。關於如何建立 Linux 的教程數不勝數,甚至還有一個專門針對此主題的網站 (linuxfromscratch.org)。這些說明不夠詳細,並且不允許編輯;因此,這是一個維基百科式的嘗試,旨在為非計算機科學家重現有關如何從頭開始構建 Linux 系統的說明。這種對新解釋的嘗試只是作為另一個資源,與 www.linuxfromscratch.org 上的書籍以及網際網路上提供的任何其他 HOW-TO 一起使用。

至於執行此任務的發行版,Gentoo非常接近從頭開始安裝。但是,在編譯核心之後,它高度自動化,使用 emerge 工具下載、構建和安裝所有內容。這就是這種方法的不同之處。所有內容都將透過“手動”編輯並單獨編譯。

在開始之前,請閱讀此清單,並確保您擁有所有要求的資訊。

為了確定您要安裝 Linux 的系統是否足夠,請閱讀 Linux HOW-TO 的“開始之前”部分。

Linuxfromscratch 網站在本華夏公益教科書中將簡稱為 LFS。

本書將使用最新穩定版本的 Linux 核心。

目錄

[edit | edit source]

設定硬碟和分割槽

[edit | edit source]

本書假設硬碟完全為空,沒有現有分割槽。確保您已以 root 使用者身份登入,透過鍵入以下命令進行檢查whoami.

第一個需要的專案是LINUX 引導盤,用於執行 FDISK 或 CFDISK(或者您可以使用非破壞性分割槽程式,如 FIPS、QTParted 或 Paragon Partition Manager——不要使用 Partition Magic,它似乎在理解 Linux 分割槽方面有很多問題)。執行此部分的最佳方法是獲取一個即時 Linux CD 發行版,例如 Knoppix、KLAX、SLAX 或 LFS,其中包含所有必要的軟體包。GParted LiveCD 是專門為此目的而釋出的。這樣,您將擁有一個已啟動的系統,可以訪問 FDISK 或 CFDISK,以及可以執行實用程式的 Shell 訪問許可權。

有幾個分割槽需要建立。從理論上講,Linux 系統可以在單個分割槽下執行(就像 Windows 或 MS-DOS 系統一樣),但幾乎沒有人這樣做。因此,建立特定分割槽是第一步。

IDE 裝置的命名約定

[edit | edit source]

hd 表示裝置“硬碟”ab 等... 表示第一個驅動器、第二個驅動器等... 1、2、3 等... 表示分割槽。

驅動器名稱 驅動器編號 分割槽編號
/dev/hda1 1 1
/dev/hda2 1 2
/dev/hdb1 2 1
/dev/hdb2 2 2

SCSI/SATA 驅動器命名為 /dev/sda1、/dev/sda2、/dev/sdb1 等...

Linux 系統的磁碟分割槽方案

[edit | edit source]
型別 分割槽 檔案系統 程式碼 分割槽型別 大小
引導 /dev/hda1 ext2 0x83 主分割槽 30-100MB(由核心大小決定)
交換分割槽 /dev/hda2 交換 0x82 主分割槽或邏輯分割槽 等於物理 RAM 的兩倍
根分割槽 /dev/hda3 ext3 0x83 主分割槽或邏輯分割槽 80 兆或更大
/usr 系統軟體分割槽 /dev/hda4 ext3 ox83 主分割槽或邏輯分割槽 最大 300 兆左右
主分割槽† /dev/hda5 ext3 0x83 主分割槽或邏輯分割槽 所需的一切


†可選 此方案並非一成不變,可以新增更多分割槽,例如/var/tmp(或者甚至只使用一個分割槽來容納整個系統——但不建議這樣做)。

建立分割槽

[edit | edit source]

要建立第一個硬碟上的分割槽,請使用 FDISK 或 CFDISK 等程式。由於 fdisk 是大多數 Linux 安裝 HOW-TO 中最常用的程式,因此我們將在示例中使用它。

請注意分割槽名稱,因為這些資訊將在稍後的/etc/fstab檔案中用到。

要檢視可用的分割槽,請鍵入

fdisk -l

這裡我們將建立三個分割槽:引導、交換和根分割槽。其他分割槽可以在以後建立。要啟動程式,請鍵入fdisk /dev/hda(將 hda 替換為您正在安裝 Linux 的驅動器)。要顯示 fdisk 中的分割槽表,請鍵入 p。本指南將假設沒有其他分割槽。對於具有其他分割槽(如 Windows)的系統,請參考其他指南。

引導分割槽

[edit | edit source]
  1. 鍵入n 建立一個新分割槽,fdisk 將顯示
    命令(m 獲取幫助):n
    命令操作
    e 擴充套件分割槽
    p 主分割槽(1-4)
  2. 選擇p 選擇主分割槽,(/dev/hda1)
  3. 然後選擇1 選擇第一個主分割槽。
  4. 然後選擇預設值,1-xxxxx 表示您特定驅動器上的柱面數,它會根據驅動器的大小而有所不同。
  5. 按回車鍵使用預設值
    第一個柱面 (1-xxxx,預設 1)
  6. 然後 fdisk 將顯示
    最後一個柱面或 +size 或 +sizeM 或 +sizeK (1-xxxx,預設 xxxx)
    • 對於這部分,您將建立一個 100MB 的引導分割槽,因此請輸入 +100m
    • 如果您列印分割槽 (p),它應該會顯示您的分割槽
Device   Boot    Start   End    Blocks     Id   System 
/dev/hda1            1    14    xxxxx+     83   Linux
  1. 要使此分割槽可引導,請鍵入 a 然後 1 以切換可引導標誌。它現在應該像這樣列印
Device   Boot     Start   End    Blocks     Id   System 
/dev/hda1  *         1    195    xxxxx+    83   Linux

交換分割槽

[編輯 | 編輯原始碼]
  1. 按照建立引導分割槽的相同步驟操作,
    • 鍵入n 建立一個新分割槽,fdisk 將顯示
    • 選擇 p 選擇一個主分割槽,
    • 然後 2 選擇第二個主分割槽。(/dev/hda2)
  2. fdisk 將從下一個可用柱面 (196) 開始,點選回車以使用預設值。
  3. 然後鍵入 +512M 以建立一個 512MB 的交換分割槽
  4. 現在,鍵入 t 設定分割槽型別, 2 選擇您剛剛建立的分割槽,然後鍵入 82 將分割槽型別設定為“Linux 交換”。

根分割槽

[編輯 | 編輯原始碼]
  1. 鍵入 n 以建立一個新的分割槽,然後鍵入 p 告訴 fdisk 您想要一個主分割槽。然後鍵入 3 以建立第三個主分割槽 (/dev/hda3)。
  2. fdisk 將從下一個可用柱面 (1189) 開始,點選回車以使用預設值。
  3. 至於結束,使它的大小為任何您想要的大小,但至少為 80MB
  4. 現在點選 w 寫入分割槽表。此步驟將完成分割槽建立過程。
  5. 鍵入 fdisk -l 檢視新分割槽。

建立檔案系統

[編輯 | 編輯原始碼]
檔案系統 建立命令
ext2 mke2fs
ext3 mke2fs -j
reiserfs mkreiserfs
xfs mkfs.xfs
jfs mkfs.jfs
  1. 使用 ext2 檔案系統格式化引導分割槽和根分割槽。(也可以使用 ext3)
    mke2fs /dev/hda1
    mke2fs /dev/hda3
  2. 初始化交換分割槽;您可以使用-l命令
    mkswap /dev/hda2
  3. 啟用交換分割槽;
    swapon /dev/hda2

在分割槽上掛載檔案系統

[編輯 | 編輯原始碼]

掛載分割槽意味著將其附加到 Linux 檔案系統,您不能掛載裝置或分割槽,而是將檔案系統掛載到“某個位置”以便繼續構建 Linux。

在掛載檔案系統之前,應檢查它們,並解除安裝它們。

  1. 首先鍵入mount檢視已掛載的內容,如果任何 /hda 分割槽已掛載,umount它。(注意:交換分割槽將顯示為已掛載,如上一步所示。如果您想檢查它,則需要使用swapoff /dev/hda2首先,然後使用swapon再次。)
  2. 要檢查檔案系統,鍵入
    e2fsck /dev/hda1

可以使用 df 命令以及 -h 或人類可讀選項顯示有關分割槽的的資訊,這將極大地提高可讀性。

對於初始安裝,需要建立一個掛載點並將其分配給環境變數。將其視為記憶體中的一個空間來掛載分割槽。變數可以是任何您想要的內容,這裡它將是 LFS,並透過執行以下命令建立

export LFS=/mnt/lfs

  1. 建立掛載點變數。( -p 開關是父級選項,它根據需要建立父目錄。
    mkdir -p $LFS
  2. 掛載 LFS (根) 檔案系統
    mount /dev/hda3 $LFS
  3. 檢查 LFS 變數是否已正確設定
    echo $LFS
    • 它應該響應/mnt/lfs
  4. 使用以下命令檢查新分割槽mount以檢視它是否未以限制過度的許可權 (nosuid、nodev 或 noatime) 掛載。響應應為
    /dev/hda3 on /mnt type ext2 (rw)
    • 所有要編譯的程式都將在$LFS/tools目錄下完成,因此請建立它。
mkdir $LFS/tools
  1. 接下來需要為 tools 目錄建立一個 符號連結
    ln -s $LFS/tools /
  2. 建立一個目錄來儲存具有正確許可權的原始碼包
    mkdir $LFS/sources
    chmod a+wt $LFS/sources
  3. 要檢視您的目錄,請鍵入
    ls $lfs
    • 如果您想以 SU 而不是 root 身份構建軟體包,請參閱 LFS 第 4.3 章
  4. 建立一個新的 .bash_profile
    cat > ~/.bash_profile << "EOF"
    exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
    EOF
  5. 為非登入 shell 建立 .bashrc 檔案
    cat > ~/.bashrc << "EOF"
    set +h
    umask 022
    LFS=/mnt/lfs
    LC_ALL=POSIX
    PATH=/tools/bin:/bin:/usr/bin
    export LFS LC_ALL PATH
    EOF
  6. 準備構建臨時工具的環境,source剛剛建立的使用者配置檔案
    source ~/.bash_profile

現在,一個用於構建的環境就可用。

構建臨時系統

[編輯 | 編輯原始碼]

本節將指導您完成將所有下載到 sources 資料夾的軟體包構建過程。

首先,我們必須進入 sources 資料夾,其中包含我們所有的軟體包。注意:如果您無法下載原始檔,1) 查詢 /lfs-sources 目錄 2) 使用 cp 命令將原始檔複製到 $LFS/sources 目錄

  1. cd $LFS/sources

然後按照 LFS 手冊中的說明安裝 7.0 版本 (我正在使用的版本) 中的軟體包,我們安裝 binutils-2.21.1a。必須記住的一件重要的事情是,您必須對所有軟體包執行此操作:1. 解壓軟體包的內容。2. 轉到軟體包目錄。3. 按照手冊中的說明進行操作。4. 構建軟體包後,刪除所有內容。以下是如何為 bintutils-2.21.1a 執行此操作的示例。

解壓軟體包時,我們將使用 tar 命令。對於以 .bz2 結尾的檔案,我使用 tar xvjf “此處為軟體包名稱”(不帶引號),對於 .gz,我使用 tar xvf“此處為軟體包名稱”(不帶引號)。

  1. tar xvjf binutils-2.21.1a.tar.bz2
    cd bintutils-2.21.1a (更快的方案是 cd binutils*)

binutils 建議我們構建一個單獨的構建目錄

  1. mkdir -v ../binutils-build
    cd ../binutils-build

現在我們準備 binutils 進行編譯

  1. ../binutils-2.21.1/configure \

--target=$LFS_TGT --prefix=/tools \ --disable-nls --disable-werror

完成後,我們將使用 make 命令編譯軟體包,注意如果您有多個核心,則可以使用 -j“數字”命令,因此我有 2 個核心,所以我將使用 make -j2

  1. make 或 make -j2(僅適用於 2 核處理器)

完成後,對於 64 位計算機,我們必須建立一個符號連結以確保工具鏈的完整性

  1. case $(uname -m) in

x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;; esac

然後安裝軟體包

  1. make install

完成後,我們必須刪除檔案/資料夾,因此返回到 sources 資料夾

  1. cd ../ 或 cd $LFS/sources

然後刪除檔案/資料夾

  1. rm -rv binutils-2.21.1 binutils-build

瞧,您已成功構建了第一個軟體包,現在使用此格式來構建其餘的軟體包,請記住解壓、進入解壓後的目錄、按照手冊中的說明進行操作、刪除內容

安裝軟體包

[編輯 | 編輯原始碼]

在本節中,將使用 LFS 手冊中使用的軟體包版本,因為它們經過測試,並且已知可以正常工作。原因是,例如,軟體包“foo”可能需要軟體包“bar”處於某個特定釋出階段,等等。因此,本書的這部分內容幾乎會與原始 LFS 手冊 [1] 相同,並在 LFS 手冊中缺失的地方新增詳細資訊。

LFS 網站透過 emule 或 bittorent 提供 LIVE CD。要使用此選項,請轉到 LFS 頁面,然後單擊packages連結。下載 LIVE CD。

軟體包和補丁

[編輯 | 編輯原始碼]

該列表位於 LFS 包LFS 補丁

下載或以其他方式獲取軟體包。有關所用軟體包的更詳細列表,請閱讀此 子頁面

構建臨時系統

[編輯 | 編輯原始碼]

Shell 介面

[編輯 | 編輯原始碼]

X 視窗系統

[編輯 | 編輯原始碼]

Linux 檔案系統結構 (FSSTND)

[編輯 | 編輯原始碼]

Linux 檔案系統層次結構 FSSTND




/bin  ---- User binaries, user programs with normal user permissions
/sbin – System Binaries, Just like /bin, /sbin also contains binary executables, But, the linux commands located under this directory are used typically by system aministrator, for system maintenance purpose.
/boot --- boot direcrtory (( the kernel, init image, bootload all stored here ))
/dev --- system device tree
/etc --- system configuration files
/home --- users subdirectories
/home/{username} users subdirectories
/initrd
/lib --- libraries needed for installed programs to run
/lost+found
/media --- emporary mount directory for removable devices.
/mnt --- Temporary mount directory where sysadmins can mount filesystems.
/opt ---Stands for option, Contains add-on applications from individual vendors.
/proc --- Contains information about system process., This is a pseudo filesystem contains information about running process. For example: /proc/{pid} directory contains information about the process with that particular pid.
/root
/sbin --- executables that need root permission
/usr --- applications software
/usr/bin - executables for programs with user permission1
/var --- system variables
/srv --- srv stands for service., Contains server specific services related data.
/tmp --- system temporary files
[編輯 | 編輯原始碼]
華夏公益教科書