您的位置:首页 > 运维架构 > Linux

深度探索linux操作系统系统构建和原理解析第四章

2014-07-12 19:49 716 查看
4.4构建一个基本的initramfs

创建一个initramfs文件夹

vita@lx-VirtualBox:/vita$ mkdir initramfs

vita@lx-VirtualBox:/vita/initramfs$ vim init

!/bin/bash

echo "Hello Linux!"

exec /bin/bash

vita@lx-VirtualBox:/vita/initramfs$ chmod a+x init

vita@lx-VirtualBox:/vita/initramfs$ mkdir bin

vita@lx-VirtualBox:/vita/initramfs$ cp ../sysroot/bin/bash bin/

检查bash的动态库

vita@lx-VirtualBox:/vita/initramfs$ ldd bin/bash

        0x00000001 => (not found)

        0x00000001 => (not found)

        0x00000001 => (not found)

由于之前问题没有解决所以只能这样了

initramfs中安装这三个库

vita@lx-VirtualBox:/vita/initramfs$ cp -d /vita/sysroot/lib/libdl* lib/

vita@lx-VirtualBox:/vita/initramfs$ cp \

> /vita/sysroot/lib/libc-2.15.so lib/

vita@lx-VirtualBox:/vita/initramfs$ cp -d \

> /vita/sysroot/lib/libc.so.6 lib/

vita@lx-VirtualBox:/vita/initramfs$ cp \

> /vita/cross-tool/i686-none-linux-gnu/lib/libgcc_s.so.1 lib/

vita@lx-VirtualBox:/vita/initramfs$ cp -d /vita/sysroot/lib/ld-* lib/

中间ldd检查还是没有解决问题忽略继续

vita@lx-VirtualBox:/vita/initramfs$ find .

.

./bin

./bin/bash

./lib

./lib/ld-linux.so.2

./lib/libdl.so.2

./lib/libc-2.15.so

./lib/libc.so.6

./lib/libdl-2.15.so

./lib/libgcc_s.so.1

./lib/ld-2.15.so

./init

vita@lx-VirtualBox:/vita/initramfs$  find . | cpio  -o -H newc | gzip  -9 > /vita/initrd.img

将之放入boot中

vita@lx-VirtualBox:/vita/initramfs$ sudo mv ../initrd.img ../boot/

之后修改grub.cfg为下面

menuentry 'vita' {

        set root='(hd0,2)'

        linux  /boot/bzImage root=/dev/sda2 ro

        initrd /boot/initrd.img

}

vita@lx-VirtualBox:/vita/build$ tar xvf ../source/coreutils-8.20.tar.xz

vita@lx-VirtualBox:/vita/build/coreutils-8.20$ ./configure --prefix=/usr

vita@lx-VirtualBox:/vita/build/coreutils-8.20$ echo $?

0

vita@lx-VirtualBox:/vita/build/coreutils-8.20$ make install

vita@lx-VirtualBox:/vita/build/coreutils-8.20$ echo $?

0

检查依赖

vita@lx-VirtualBox:/vita$ ldd sysroot/usr/bin/ls

        0x00000001 => (not found)

        0x00000001 => (not found)

        0x00000001 => (not found)

之前ldd问题一直没有解决

vita@lx-VirtualBox:/vita$ ldd sysroot/lib/librt.so.1

        0x00000001 => (not found)

        0x00000001 => (not found)

        0x00000001 => (not found)

vita@lx-VirtualBox:/vita$ ldd sysroot/lib/libpthread.so.0

        0x00000001 => (not found)

        0x00000001 => (not found)

将这些动态链接库复制到initramfs中去

vita@lx-VirtualBox:/vita$ cp sysroot/usr/bin/ls initramfs/bin/

vita@lx-VirtualBox:/vita$ cp -d sysroot/lib/librt* initramfs/lib/

vita@lx-VirtualBox:/vita$ cp -d sysroot/lib/libpthread*  initramfs/lib/

编译工具mount

vita@lx-VirtualBox:/vita/build$ tar xvf ../source/util-linux-2.22.tar.xz

vita@lx-VirtualBox:/vita/build/util-linux-2.22$ ./configure \

> --prefix=/usr --disable-use-tty-group --disable-login \

> --disable-sulogin --disable-su --without-ncurses

vita@lx-VirtualBox:/vita/build/util-linux-2.22$ echo $?

0

配置成功编译

vita@lx-VirtualBox:/vita/build/util-linux-2.22$ make && make install

接下来用ldd检测mount依赖,这里忽略

vita@lx-VirtualBox:/vita$ cp -d sysroot/lib/libmount.so.1* \

>  initramfs/lib/

vita@lx-VirtualBox:/vita$ cp -d sysroot/lib/libblkid.so.1*  initramfs/lib/

vita@lx-VirtualBox:/vita$ cp -d sysroot/lib/libuuid.so.1*  initramfs/lib/

 接下来就是配置内核,忽略

内核编译好后添加了devtmpfs将至复制过去

lxiang@lxiang-Aspire-5750G:~/workplace_IDE/deepin_linux_workplace/linux-3.7.4$ scp arch/x86/boot/bzImage  root@192.168.56.101:/vita/boot

root@192.168.56.101's password:

bzImage                                       100% 1595KB   1.6MB/s   00:00   

重新将磁盘驱动编译为模块

lxiang@lxiang-Aspire-5750G:~/workplace_IDE/deepin_linux_workplace/linux-3.7.4$ make bzImage && make modules

make \

> INSTALL_MOD_PATH=$SYSROOT modules_install

vita@lx-VirtualBox:/vita$ mkdir -p \

> initramfs/lib/modules/3.7.4/kernel/drivers/ata

vita@lx-VirtualBox:/vita$ cp \

> sysroot/lib/modules/3.7.4/kernel/drivers/ata/* initramfs/lib/modules/3.7.4/kernel/drivers/ata

安装kmod

vita@lx-VirtualBox:/vita/build/kmod-12$ tar xvf ../source/kmod-12.tar.xz

vita@lx-VirtualBox:/vita/build/kmod-12$ cd kmod-12/

vita@lx-VirtualBox:/vita/build/kmod-12$ ./configure --prefix=/usr

vita@lx-VirtualBox:/vita/build/kmod-12$ make && make install

vita@lx-VirtualBox:/vita/build/kmod-12$ find $SYSROOT \

> -name "*.la" -exec rm -f '{}' \;、

检测kmod依赖并复制动态链接库

vita@lx-VirtualBox:/vita$ cp sysroot/usr/bin/kmod initramfs/usr/bin/

复制动态链接库

vita@lx-VirtualBox:/vita$ cp -d sysroot/usr/lib/libkmod.so.2* initramfs/lib/

为kmod创建符号链接

vita@lx-VirtualBox:/vita/sysroot/sbin$ ln -s ../usr/bin/kmod  insmod

vita@lx-VirtualBox:/vita/sysroot/sbin$ ln -s ../usr/bin/kmod  rmmod

vita@lx-VirtualBox:/vita/sysroot/sbin$ ln -s ../usr/bin/kmod  modinfo

vita@lx-VirtualBox:/vita/sysroot/sbin$ ln -s ../usr/bin/kmod  lsmod  

vita@lx-VirtualBox:/vita/sysroot/sbin$ ln -s ../usr/bin/kmod  modprobe

vita@lx-VirtualBox:/vita/sysroot/sbin$ ln -s ../usr/bin/kmod  depmod 

拷贝到iinitramfs

vita@lx-VirtualBox:/vita/sysroot/sbin$ cd ../../

vita@lx-VirtualBox:/vita$ mkdir initramfs/sbin

vita@lx-VirtualBox:/vita$ cd sysroot/sbin/

vita@lx-VirtualBox:/vita/sysroot/sbin$ cp -d insmod rmmod modinfo lsmod modprobe depmod /vita/initramfs/sbin/

重新压缩initrd.img

vita@lx-VirtualBox:/vita$ cd initramfs/

vita@lx-VirtualBox:/vita/initramfs$ find . | cpio  -o -H newc | gzip  -9 > /vita/initrd.img

34056 blocks

#!/bin/bash
echo "Hello Linux!"
export PATH=/usr/sbin:/usr/bin:/sbin:/bin
#mount  devtmpfs
mount -n -t devtmpfs udev /dev
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
exec /bin/bash



之后的编辑后忘了保存,大伙儿自己敲吧!!

switch_root.c
#include<errno.h>
#include<dirent.h>
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/mount.h>
#include<fcntl.h>
#include<unistd.h>

int delet_dir(char *directory);

void delete(char *what)
{
if(unlink(what)){
if (errno ==EISDIR){
if (!delete_dir(what))rmdir(what);
}
}
}

int delete_dir(char *directory)
{
DIR *dir;
struct dirent *d;
struct stat st1,st2;
char path[PATH_MAX];
if(lstat(directory,&st1))return errno;
if(!(dir = opendir(directory)))return errno;
while((d = readdir(dir))){
if(d->d_name[0] == '.' && (d->d_name[1] == '\0' || (d->d_name[1] == '.' && d->d_name[2] == '\0') ))continue;
sprintf(path,"%s/%s",directory,d->d_name);
if(st2.st_dev != st1.st_dev)continue;

delete(path);
}
closedir(dir);
return 0;
}

int main(int argc,char*argv[])
{
int console_fd;
chdir(argv[1]);
delete_dir("/");
mount(".","/",NULL,MS_MOVE,NULL);
chroot(".");
chdir("/");

console_fd = open("/dev/console",O_RDWR);
dup2(console_fd,0);
dup2(console_fd,1);
dup2(console_fd,2);
close(console_fd);
execlp(argv[2],argv[2],NULL);
return 0;

}

#!/bin/bash
echo "Hello Linux!"
export PATH=/usr/sbin:/usr/bin:/sbin:/bin
export ROOTMNT=/root
export ROFLAG=-r
mount -n -t devtmpfs udev /dev
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
mount -n -t ramfs ramfs /run
udevd --daemon
udevadm trigger --action=add
udevadm settle

for x in $(cat /proc/cmdline); do
case $x in
root=*)
ROOT=${x#root=}
;;
ro)
ROFLAG=-r
;;
rw)
ROFLAG=-w
;;
esac
done

mount ${ROFLAG} ${ROOT} ${ROOTMNT}

# Stop udevd
udevadm control --exit
# Move to the real filesystem
mount -n --move /dev ${ROOTMNT}/dev
mount -n --move /run ${ROOTMNT}/run
mount -n --move /proc ${ROOTMNT}/proc
mount -n --move /sys ${ROOTMNT}/sys

switch_root ${ROOTMNT} /sbin/init
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: