没有合适的资源?快使用搜索试试~ 我知道了~
解析linux根文件系统的挂载过程.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 126 浏览量
2021-11-04
20:38:57
上传
评论
收藏 218KB PDF 举报
温馨提示
试读
13页
解析linux根文件系统的挂载过程.pdf
资源推荐
资源详情
资源评论
一:前言
前段时间在编译 kernel 的时候发现 rootfs 挂载不上。 相同的 root 选项设置旧版的 image 却可
以。为了彻底解决这个问题。研究了一下 rootfs 的挂载过程。特总结如下 ,希望能给这部份
知识点比较迷茫的朋友一点帮助。
二: roo
一:前言
前段时间在编译 kernel 的时候发现 rootfs 挂载不上。 相同的 root 选项设置旧版的 image 却可
以。为了彻底解决这个问题。研究了一下 rootfs 的挂载过程。特总结如下 ,希望能给这部份
知识点比较迷茫的朋友一点帮助。
二: rootfs 的种类
总的来说, rootfs 分为两种:虚拟 rootfs 和真实 rootfs. 现在 kernel 的发展趋势是将更多的功
能放到用户空间完成。以保持内核的精简。虚拟 rootfs 也是各 linux 发行厂商普遍采用的一
种方式。 可以将一部份的初始化工作放在虚拟的 rootfs 里完成。 然后切换到真实的文件系统 .
在虚拟 rootfs 的发展过程中。又有以下几个版本:
initramfs:
Initramfs 是在 kernel 2.5 中引入的技术, 实际上它的含义就是: 在内核镜像中附加一个 cpio
包,这个 cpio 包中包含了一个小型的文件系统,当内核启动时,内核将这个 cpio 包解开,
并且将其中包含的文件系统释放到 rootfs 中,内核中的一部分初始化代码会放到这个文件系
统中, 作为用户层进程来执行。 这样带来的明显的好处是精简了内核的初始化代码, 而且使
得内核的初始化过程更容易定制。这种这种方式的 rootfs 是包含在 kernel image 之中的 .
cpio-initrd: cpio 格式的 rootfs
image-initrd: 传统格式的 rootfs
关于这两种虚拟文件系统的制作请自行参阅其它资料
三: rootfs 文件系统的挂载过程
这里说的 rootfs 不同于上面分析的 rootfs。这里指的是系统初始化时的根结点。即 /结点。它
是其于内存的 rootfs 文件系统。这部份之前在 << linux 启动过程分析 >>和文件系统中已经分
析过。为了知识的连贯性这里再重复一次。
Start_kernel() àmnt_init():
void __init mnt_init(void)
{
……
……
init_rootfs();
init_mount_tree();
}
Init_rootfs 的代码如下:
int __init init_rootfs(void)
{
int err;
err = bdi_init(&ramfs_backing_dev_info);
if (err)
return err;
err = register_filesystem(&rootfs_fs_type);
if (err)
bdi_destroy(&ramfs_backing_dev_info);
return err;
}
这个函数很简单。就是注册了 rootfs 的文件系统 .
init_mount_tree() 代码如下:
static void __init init_mount_tree(void)
{
struct vfsmount *mnt;
struct mnt_namespace *ns;
struct path root;
mnt = do_kern_mount("rootfs", 0, "rootfs", NULL);
if (IS_ERR(mnt))
panic("Can't create rootfs");
ns = kmalloc(sizeof(*ns), GFP_KERNEL);
if (!ns)
panic("Can't allocate initial namespace");
atomic_set(&ns->count, 1);
INIT_LIST_HEAD(&ns->list);
init_waitqueue_head(&ns->poll);
ns->event = 0;
list_add(&mnt->mnt_list, &ns->list);
ns->root = mnt;
mnt->mnt_ns = ns;
init_task.nsproxy->mnt_ns = ns;
get_mnt_ns(ns);
root.mnt = ns->root;
root.dentry = ns->root->mnt_root;
set_fs_pwd(current->fs, &root);
set_fs_root(current->fs, &root);
}
在这里,将 rootfs 文件系统挂载。它的挂载点默认为” /”.最后切换进程的根目录和当前目
录为” /”.这也就是根目录的由来。不过这里只是初始化。等挂载完具体的文件系统之后,
一般都会将根目录切换到具体的文件系统。所以在系统启动之后,用 mount 命令是看不到
rootfs 的挂载信息的 .
四:虚拟文件系统的挂载
根目录已经挂上去了,可以挂载具体的文件系统了 .
在 start_kernel() àrest_init() àkernel_init():
static int __init kernel_init(void * unused)
{
……
……
do_basic_setup();
if (!ramdisk_execute_command)
ramdisk_execute_command = "/init";
if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {
ramdisk_execute_command = NULL;
prepare_namespace();
}
/*
* Ok, we have completed the initial bootup, and
* we're essentially up and running. Get rid of the
* initmem segments and start the user-mode stuff..
*/
init_post();
return 0;
}
do_basic_setup()是一个很关键的函数, 所有直接编译在 kernel 中的模块都是由它启动的。 代
码片段如下:
static void __init do_basic_setup(void)
{
/* drivers will send hotplug events */
init_workqueues();
剩余12页未读,继续阅读
资源评论
霖落^0^时空
- 粉丝: 3
- 资源: 9万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功