内核真正想使用需依赖于kernel object(内核模块)
内核是模块化设计的
内核本身只提供核心功能,但里面可以加载模块
/lib/modules/`uname -r`(获得与内核版本号同名的目录)/
注意:``同$()一样可以获取变量的值或获得所执行命令显示的内容
lsmod 显示当前已加载的模块
modprobe 模块名称 加载模块
modprobe -r 模块名称 卸载模块
任何一个命令都可能依赖一些库(功能模块)文件
ldd 显示一个命令所依赖的库文件
eg:ldd /bin/ls
如何构建一个小的linux系统:
MBR--bootloader
grub
/boot,kernel, initrd
在宿主机上先添加一块新硬盘
分区 fdisk -l 找到新添加的硬盘(假如在/dev/sdb下)
添加两个新的主分区 (sdb1,sdb2)使用命令:fdisk /dev/sdb
内核重读分区表 partprobe /dev/sdc
查看内核是否识别此分区和硬盘cat /proc/partitions
格式化 mkfs -t ext3 /dev/sdb1
mkfs -t ext3 /dev/sdb2
分区格式化之后要想使用必须得挂载
大多数情况下装grub时都以为是在/boot下,所以我们就挂载
在/boot下
mkdir /mnt/boot
mkdir /mnt/sysroot
mount /dev/sdb1 /mnt/boot
mount /dev/sdb2 /mnt/sysroot
安装grub:
grub-install --root-directory(安装到哪个目录)=/mnt /dev/sdb(安装到哪个设备上)
注意:(安装目录不能写成/mnt/boot,因为/mnt/booty已经被创建了,安装的时候会自动在/mnt下找到/boot的,
如果写成/mnt/boot则将被装在/dev/boot/boot下)
安装完之后/mnt/boot/目录下会被自动添加一个grub目录
ls /mnt/boot
cp /boot/vmlinuz-2.6.18-128.el5 ./vmlinuz(将宿主机上的内核考到新加的硬盘的/mnt/boot下
ls
/mnt/boot下将会增加一个vmlinuz
cd /tmp
mkdir initrd
cd initrd/
zcat /boot/initrd-2.6.18-164.el5.img| cpio -id(将initrd解压到/tmp/initrd下)
注释:-id中的i表示将压缩包展开到当前目录下,d表示需要用到目录时会自动给创建个目录
ls /tmp/initrd
vim init
将mkrootdev那行改成:mkrootdev -t ext3 -o defaults,ro sda2
然后将以下内容注释掉:
#echo Scanning and configuring dmraid supported devices
#echo Scanning logical volumes
#lvm vgscan --ignorelockingfailure
#echo Activating logical volumes
#lvm vgchange -ay --ignorelockingfailure VOLO
#resume LABEL=SWAP-sda3
#echo "loading dm-mirror.ko.module"
#insmod /lib/dm-mirror.ko
#echo "Loading dm-zero.ko.module"
#insmod /lib/dm-zero.ko
#echo "loading dm-snapshot.ko module"
#insmod /lib/dm-snapshot.ko
保存退出
find . | cpio --quiet -H newc -o |gzip -9 -n > /mnt/boot/initrd.gz(将当前目录下的展开的initrd
文件封装成/mnt/boot/下的initrd.gz
cd /mnt/boot
ls
ll -h 查看/mnt/boot下的文件的属性(权限,大小,创建日期等)
init和内核(vmlinux)都准备好了就可以编辑grub配置文件了
vim grub/grub.conf
default=0
timeout=2
title Mylinux
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda2
initrd /initrd.gz
好了保持退出
执行sync
sync
sync
sync
sync(多执行几遍sync将内存上的内容同步到硬盘上去)
小linux准备好了
下面就需要真正的根文件系统了
cd /mnt/sysroot
ls
mkdir etc lib bin sbin dev tmp sys proc
chmod 1777 tmp
sync
cp -r /sbin/init sbin(把宿主机上的init文件拷到自己的linux上的sbin下)
cp -r /bin/bash bin/(把宿主机上的bash文件拷到自己的lunux 上的bin下)
tree .(tree一下当前目录,查看目录树)
现在拷过来的init和bash并不能运行,需要把它们对应的库文件也拷过来才行
ldd /bin/bash(查看bash依赖的库文件)
ldd /sbin/init(查看init依赖的库文件)
cp /lib/libsepol.so.l lib/
cp /lib/libselinux.so.l lib/
cp /lib/libc.so.6 lib/
cp /lib/libdl.so.2 lib/
cp /lib/ld-linux.so.2 lib/
cp /lib/libtermcap.so.2 lib/
库文件拷贝完成
init需要正常运行需要一个配置文件
vim etc/inittab(当前目录下的etc即/mnt/sysroot下的)
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
因为这个小系统没有/rc.d/rc.sysinit
所以在/mnt/sysroot/etc下
mkdir rc.d
cd rc.d
ls
vim rc.sysinit(编辑sysinit脚本)
#!/bin/bash
#
echo -e "\tWelcome to \033[3lmMy\033[0m linux"
/bin/bash
保存退出
chmod a+x rc.sysinit(让该脚本拥有可执行的权限)
ll
sync
sync
sync
硬盘弄好了,下面新建一个linux,在选择硬盘时不要选择新建,要选择现存的硬盘(即
你自己设置的硬盘,找到你添加硬盘时的存放位置,加载进去即可)
下面就可以正常运行了
运行起来之后你会发现最基本的命令都不能使用,如果想使用这些命令该怎么做呢?
只需从宿主机上找到命令的位置,然后把命令和对应的库文件拷过来即可
以ls为例:
which ls(找到ls所在位置)
ldd /bin/ls( 查看ls依赖的库文件)
cd /mnt/sysroot
cp /bin/ls bin/(把命令拷过去)
cp /lib/librt.so.1 lib/(把库考过去)
cp /lib/libacl.so.1 lib/
cp /lib/libattr.so.1 lib/
cp /lib/libpthread.so.0 lib/
sync
sync
sync
小知识点:在vim编辑器中复制当前行是yy
复制n行是nyy
p是粘贴
阅读(1505) | 评论(0) | 转发(1) |