探索Linux操作系统
《深度探索Linux操作系统——系统构建和原理解析》的一个快速笔记
我的环境和作者略有不同,我的宿主系统为Slackware 14.1 64位,虚拟机上的系统是ubuntu 12.1 32位。
一些准备工作
- 避免污染宿主系统而新建了普通用户,建立了工作目录。
- 为了简化编译过程的一些命令,在用户的`.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图形原理。粗粗看了下,对我应该没什么用处,等到有需要再仔细看一遍吧。
草草的看了这书大部分的内容,说下这书让我觉得不错的几个地方
- 讲解程序的编译过程
- 内核映像的组成和构建过程
- 配置内核的过程很有趣,哈哈