从零开始构建 Linux
一位维基教科书用户认为此页面应该拆分为具有更窄主题的较小页面。 您可以通过将此大页面拆分为较小的页面来提供帮助。请确保遵循命名规则。将书籍分成较小的部分可以提供更多关注点,并允许每个部分都能很好地完成一项任务,这对每个人都有利。 |
本书是一个开源尝试,讨论如何通过从空白硬盘开始并组装 Linux 发行版(如 Debian、Fedora Core 或 Slackware)所需的全部“部件”来创建一个 Linux 计算机系统。如果您不知道什么是 Linux,请停止阅读。先阅读一些关于 Linux 主题的其他书籍——也许是使用 Ubuntu Linux、Puredyne、Linux 指南或了解 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 表示设备“硬盘”a、b 等... 表示第一个驱动器、第二个驱动器等... 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]- 键入n 创建一个新分区,fdisk 将显示
- 命令(m 获取帮助):n
- 命令操作
- e 扩展分区
- p 主分区(1-4)
- 选择p 选择主分区,(/dev/hda1)
- 然后选择1 选择第一个主分区。
- 然后选择默认值,1-xxxxx 表示您特定驱动器上的柱面数,它会根据驱动器的大小而有所不同。
- 按回车键使用默认值
- 第一个柱面 (1-xxxx,默认 1)
- 然后 fdisk 将显示
- 最后一个柱面或 +size 或 +sizeM 或 +sizeK (1-xxxx,默认 xxxx)
- 对于这部分,您将创建一个 100MB 的引导分区,因此请输入 +100m
- 如果您打印分区 (p),它应该会显示您的分区
Device Boot Start End Blocks Id System /dev/hda1 1 14 xxxxx+ 83 Linux
- 要使此分区可引导,请键入 a 然后 1 以切换可引导标志。它现在应该像这样打印
Device Boot Start End Blocks Id System /dev/hda1 * 1 195 xxxxx+ 83 Linux
- 按照创建引导分区的相同步骤操作,
- 键入n 创建一个新分区,fdisk 将显示
- 选择 p 选择一个主分区,
- 然后 2 选择第二个主分区。(/dev/hda2)
- fdisk 将从下一个可用柱面 (196) 开始,点击回车以使用默认值。
- 然后键入 +512M 以创建一个 512MB 的交换分区
- 现在,键入 t 设置分区类型, 2 选择您刚刚创建的分区,然后键入 82 将分区类型设置为“Linux 交换”。
- 键入 n 以创建一个新的分区,然后键入 p 告诉 fdisk 您想要一个主分区。然后键入 3 以创建第三个主分区 (/dev/hda3)。
- fdisk 将从下一个可用柱面 (1189) 开始,点击回车以使用默认值。
- 至于结束,使它的大小为任何您想要的大小,但至少为 80MB
- 现在点击 w 写入分区表。此步骤将完成分区创建过程。
- 键入 fdisk -l 查看新分区。
文件系统 | 创建命令 |
ext2 | mke2fs |
ext3 | mke2fs -j |
reiserfs | mkreiserfs |
xfs | mkfs.xfs |
jfs | mkfs.jfs |
- 使用 ext2 文件系统格式化引导分区和根分区。(也可以使用 ext3)
- mke2fs /dev/hda1
- mke2fs /dev/hda3
- 初始化交换分区;您可以使用-l命令
- mkswap /dev/hda2
- 激活交换分区;
- swapon /dev/hda2
挂载分区意味着将其附加到 Linux 文件系统,您不能挂载设备或分区,而是将文件系统挂载到“某个位置”以便继续构建 Linux。
在挂载文件系统之前,应检查它们,并卸载它们。
- 首先键入mount查看已挂载的内容,如果任何 /hda 分区已挂载,umount它。(注意:交换分区将显示为已挂载,如上一步所示。如果您想检查它,则需要使用swapoff /dev/hda2首先,然后使用swapon再次。)
- 要检查文件系统,键入
- e2fsck /dev/hda1
可以使用 df 命令以及 -h 或人类可读选项显示有关分区的的信息,这将极大地提高可读性。
对于初始安装,需要创建一个挂载点并将其分配给环境变量。将其视为内存中的一个空间来挂载分区。变量可以是任何您想要的内容,这里它将是 LFS,并通过运行以下命令创建
export LFS=/mnt/lfs
- 创建挂载点变量。( -p 开关是父级选项,它根据需要创建父目录。
mkdir -p $LFS
- 挂载 LFS (根) 文件系统
mount /dev/hda3 $LFS
- 检查 LFS 变量是否已正确设置
echo $LFS
- 它应该响应
/mnt/lfs
- 使用以下命令检查新分区mount以查看它是否未以限制过度的权限 (nosuid、nodev 或 noatime) 挂载。响应应为
- /dev/hda3 on /mnt type ext2 (rw)
- 所有要编译的程序都将在$LFS/tools目录下完成,因此请创建它。
mkdir $LFS/tools
- 接下来需要为 tools 目录创建一个 符号链接。
ln -s $LFS/tools /
- 创建一个目录来存储具有正确权限的源代码包
mkdir $LFS/sources
chmod a+wt $LFS/sources
- 要查看您的目录,请键入
ls $lfs
- 如果您想以 SU 而不是 root 身份构建软件包,请参阅 LFS 第 4.3 章
- 创建一个新的 .bash_profile
- cat > ~/.bash_profile << "EOF"
- exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
- EOF
- 为非登录 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
- 准备构建临时工具的环境,source刚刚创建的用户配置文件
- source ~/.bash_profile
现在,一个用于构建的环境就可用。
本节将指导您完成将所有下载到 sources 文件夹的软件包构建过程。
首先,我们必须进入 sources 文件夹,其中包含我们所有的软件包。注意:如果您无法下载源文件,1) 查找 /lfs-sources 目录 2) 使用 cp 命令将源文件复制到 $LFS/sources 目录
- 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“此处为软件包名称”(不带引号)。
- tar xvjf binutils-2.21.1a.tar.bz2
- cd bintutils-2.21.1a (更快的方案是 cd binutils*)
binutils 建议我们构建一个单独的构建目录
- mkdir -v ../binutils-build
- cd ../binutils-build
现在我们准备 binutils 进行编译
- ../binutils-2.21.1/configure \
--target=$LFS_TGT --prefix=/tools \ --disable-nls --disable-werror
完成后,我们将使用 make 命令编译软件包,注意如果您有多个核心,则可以使用 -j“数字”命令,因此我有 2 个核心,所以我将使用 make -j2
- make 或 make -j2(仅适用于 2 核处理器)
完成后,对于 64 位计算机,我们必须创建一个符号链接以确保工具链的完整性
- case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;; esac
然后安装软件包
- make install
完成后,我们必须删除文件/文件夹,因此返回到 sources 文件夹
- cd ../ 或 cd $LFS/sources
然后删除文件/文件夹
- rm -rv binutils-2.21.1 binutils-build
瞧,您已成功构建了第一个软件包,现在使用此格式来构建其余的软件包,请记住解压、进入解压后的目录、按照手册中的说明进行操作、删除内容
在本节中,将使用 LFS 手册中使用的软件包版本,因为它们经过测试,并且已知可以正常工作。原因是,例如,软件包“foo”可能需要软件包“bar”处于某个特定发布阶段,等等。因此,本书的这部分内容几乎会与原始 LFS 手册 [1] 相同,并在 LFS 手册中缺失的地方添加详细信息。
LFS 网站通过 emule 或 bittorent 提供 LIVE CD。要使用此选项,请转到 LFS 页面,然后单击packages链接。下载 LIVE CD。
下载或以其他方式获取软件包。有关所用软件包的更详细列表,请阅读此 子页面
/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
- Linux 内核
- Linux 文档项目指南
- 超级手册页(命令帮助页)
- freshmeat 访问软件官方下载网站