跳转到内容

从零开始构建 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
[编辑 | 编辑源代码]
华夏公益教科书