HOME | Links | About | Read

探索Linux操作系统

《深度探索Linux操作系统——系统构建和原理解析》的一个快速笔记

我的环境和作者略有不同,我的宿主系统为Slackware 14.1 64位,虚拟机上的系统是ubuntu 12.1 32位。

Table of Contents

一些准备工作

  • 避免污染宿主系统而新建了普通用户,建立了工作目录。
  • 为了简化编译过程的一些命令,在用户的`.bashrc`定义了环境变量。
  • 使用`su - username` 切换shell环境和用户都切换到username。

构建工具链

  • 构建交叉Binutils,包括as,ld,ar,ranlib等。
  • 构建freestanding的交叉编译器
  • 安装内核头文件
  • 构建目标系统的C库
  • 构建完整的交叉编译器

第一步中:提示缺少flex和bison,安装之,无恙。
第二步中:编译gcc-4.7.2总是出错,搜索之,安装gcc-4.7.3,ok了。
第三步中:经验不足,后来才发现书上的印刷错误。因祸得福,反复编译安装内核头文件让我越来越有耐心。
第四步中:参数的配置十分巧妙,编译编译,得掌握参数的配置。
第五步中:我编译的依旧是gcc-4.7.3。

内核配置

  • 执行`make allnoconfig`,除了必选的,其余全部不选。
  • 接下来便是配置内核的工作,使内核渐渐能支持你的电脑。
  • 安装C库和Shell。

第一步中:交叉编译需要更改makefile。
第二步中: `lspci /proc/cpuinfo | grep "model name"` 查看处理器型号。
第三步中:

  • `ldd`命令查看程序依赖的动态库。
  • `scp`命令利用ssh在机器间传输文件。

initramfs

  • 配置内核支持initramfs
  • 构建基本的initramfs
  • 将硬盘驱动编译为模块
  • 自动加载硬盘控制器驱动
  • 挂载切换到根目录系统

第一步中: initramfs是一个临时文件系统,它的存在是为了挂载真正的根文件系统。

第二步中:

  • initramfs需要用cpio以newc格式压缩
  • shell有两种模式——交互和非交互
  • `find .`输出当前文件夹(包括子文件)中所有文件

第三步中:

  • devtampfs
  • `modinfo -F depends`查看模块的依赖
  • `insmod`加载模块
  • `modprobe`自动加载/卸载模块依赖的其他模块

第四步中:

  • 我编译的是udev-174
  • 编译lspci时,在我的电脑上需要指定交叉编译器`crosscompile=i686-none-linux-gnu-gcc`,否则编译出来的是lspci会是64位,无法在最终的32位系统上运行。

第五步中:作者提供了一个switchroot程序,来切换到真正的根文件系统

构建根文件系统

  • SUID和EUID的知识,SUID是Set UserID,EUID是Effective UserID。SUID可以使本来没有相应权限的用户运行该程序时,可以访问他没有权限访问的资源。
  • `ip addr show`显示本机ip
  • `ip link show`查看网络端口
  • `ip addr add 192.168.1.103/24 dev eth0`设置网卡ip,注意这个表示方法`192.168.1.103/24`,子网掩码为24,即`255.255.255.0`,ip范围从`192.168.1.103`到`192.168.1.255`
  • 编译openssl时,用`setarch i386 ./config -m32`指定程序运行环境,在我的64位系统上编译32位程序。

剩下的

书其后的内容是安装X窗口系统,构建桌面环境并且探讨了Linux图形原理。粗粗看了下,对我应该没什么用处,等到有需要再仔细看一遍吧。

草草的看了这书大部分的内容,说下这书让我觉得不错的几个地方

  • 讲解程序的编译过程
  • 内核映像的组成和构建过程
  • 配置内核的过程很有趣,哈哈