免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: chishanmingshen
打印 上一主题 下一主题

[文件系统] 根文件系统的疑惑... [复制链接]

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
11 [报告]
发表于 2013-02-01 09:48 |只看该作者
start_kernel里
这个也像
vfs_caches_init -> mnt_init -> init_rootfs -> init_mount_tree

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2013-02-01 09:53 |只看该作者
本帖最后由 chishanmingshen 于 2013-02-01 09:54 编辑

这个是虚拟的吧...
回复 11# T-Bagwell


   

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
13 [报告]
发表于 2013-02-01 10:17 |只看该作者
本帖最后由 T-Bagwell 于 2013-02-01 10:22 编辑

  1. [root@T-bagwell linux-2.6]# cat /proc/mounts
  2. rootfs / rootfs rw 0 0
  3. /proc /proc proc rw,relatime 0 0
  4. /sys /sys sysfs rw,relatime 0 0
  5. udev /dev devtmpfs rw,relatime,size=1020184k,nr_inodes=255046,mode=755 0 0
  6. devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0
  7. tmpfs /dev/shm tmpfs rw,relatime 0 0
  8. /dev/sda1 / ext4 rw,relatime,barrier=1,data=ordered 0 0
  9. /proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
  10. none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
  11. none /proc/fs/vmblock/mountPoint vmblock rw,relatime 0 0
  12. [root@T-bagwell linux-2.6]#
复制代码
rootfs在vfs_caches_init -> mnt_init -> init_rootfs里面搞定的
最终我们的/dev/blockdevice会挂在这个的节点下面

从start_kernel按照流程往下走
先过vfs_init,然后过rest_init
然后创建线程kernel_init

  1. kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
复制代码
进去后

  1. 807 static int __ref kernel_init(void *unused)
  2. 808 {
  3. 809         kernel_init_freeable();
  4. 810         /* need to finish all async __init code before freeing the memory */
  5. 811         async_synchronize_full();
  6. 812         free_initmem();
  7. 813         mark_rodata_ro();
  8. 814         system_state = SYSTEM_RUNNING;
  9. 815         numa_default_policy();
  10. 816
  11. 817         flush_delayed_fput();
  12. 818
  13. 819         if (ramdisk_execute_command) {
  14. 820                 if (!run_init_process(ramdisk_execute_command))
  15. 821                         return 0;
  16. 822                 printk(KERN_WARNING "Failed to execute %s\n",
  17. 823                                 ramdisk_execute_command);
  18. 824         }
  19. 825
  20. 826         /*
  21. 827          * We try each of these until one succeeds.
  22. 828          *
  23. 829          * The Bourne shell can be used instead of init if we are
  24. 830          * trying to recover a really broken machine.
  25. 831          */
  26. 832         if (execute_command) {
  27. 833                 if (!run_init_process(execute_command))
  28. 834                         return 0;
  29. 835                 printk(KERN_WARNING "Failed to execute %s.  Attempting "
  30. 836                                         "defaults...\n", execute_command);
  31. 837         }
  32. 838         if (!run_init_process("/sbin/init") ||
  33. 839             !run_init_process("/etc/init") ||
  34. 840             !run_init_process("/bin/init") ||
  35. 841             !run_init_process("/bin/sh"))
  36. 842                 return 0;
  37. 843
  38. 844         panic("No init found.  Try passing init= option to kernel. "
  39. 845               "See Linux Documentation/init.txt for guidance.");
  40. 846 }

复制代码
很明显了



rootfs的注册

  1. 259 static struct file_system_type ramfs_fs_type = {
  2. 260         .name           = "ramfs",
  3. 261         .mount          = ramfs_mount,
  4. 262         .kill_sb        = ramfs_kill_sb,
  5. 263 };
  6. 264 static struct file_system_type rootfs_fs_type = {
  7. 265         .name           = "rootfs",
  8. 266         .mount          = rootfs_mount,
  9. 267         .kill_sb        = kill_litter_super,
  10. 268 };
  11. 269
  12. 270 static int __init init_ramfs_fs(void)
  13. 271 {
  14. 272         return register_filesystem(&ramfs_fs_type);
  15. 273 }
  16. 274 module_init(init_ramfs_fs)
  17. 275
  18. 276 int __init init_rootfs(void)
  19. 277 {
  20. 278         int err;
  21. 279
  22. 280         err = bdi_init(&ramfs_backing_dev_info);
  23. 281         if (err)
  24. 282                 return err;
  25. 283
  26. 284         err = register_filesystem(&rootfs_fs_type);
  27. 285         if (err)
  28. 286                 bdi_destroy(&ramfs_backing_dev_info);
  29. 287
  30. 288         return err;
  31. 289 }
  32. "fs/ramfs/inode.c" 289L, 6876C  
复制代码
挂载

  1. 2647 static void __init init_mount_tree(void)
  2. 2648 {
  3. 2649         struct vfsmount *mnt;
  4. 2650         struct mnt_namespace *ns;
  5. 2651         struct path root;
  6. 2652         struct file_system_type *type;
  7. 2653
  8. 2654         type = get_fs_type("rootfs");
  9. 2655         if (!type)
  10. 2656                 panic("Can't find rootfs type");
  11. 2657         mnt = vfs_kern_mount(type, 0, "rootfs", NULL);
  12. 2658         put_filesystem(type);
  13. 2659         if (IS_ERR(mnt))
  14. 2660                 panic("Can't create rootfs");
  15. 2661
  16. 2662         ns = create_mnt_ns(mnt);
  17. 2663         if (IS_ERR(ns))
  18. 2664                 panic("Can't allocate initial namespace");
  19. 2665
  20. 2666         init_task.nsproxy->mnt_ns = ns;
  21. 2667         get_mnt_ns(ns);
  22. 2668
  23. 2669         root.mnt = mnt;
  24. 2670         root.dentry = mnt->mnt_root;
  25. 2671
  26. 2672         set_fs_pwd(current->fs, &root);
  27. 2673         set_fs_root(current->fs, &root);
  28. 2674 }

复制代码

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
14 [报告]
发表于 2013-02-01 10:29 |只看该作者
至于你说的rdinit

  1. 308 static int __init rdinit_setup(char *str)
  2. 309 {
  3. 310         unsigned int i;
  4. 311
  5. 312         ramdisk_execute_command = str;
  6. 313         /* See "auto" comment in init_setup */
  7. 314         for (i = 1; i < MAX_INIT_ARGS; i++)
  8. 315                 argv_init[i] = NULL;
  9. 316         return 1;
  10. 317 }
  11. 318 __setup("rdinit=", rdinit_setup);
复制代码
ramdisk_execute_command 在前面代码已经贴过了

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
15 [报告]
发表于 2013-02-01 16:39 |只看该作者
本帖最后由 chishanmingshen 于 2013-02-01 16:41 编辑

要的就是这个.

在哪个地方挂载的?,具体点...啊,在哪个脚本的哪个地方?

谢谢!!!回复 10# T-Bagwell


   

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
16 [报告]
发表于 2013-02-01 17:16 |只看该作者
稍等
我解开initrd给你找一下

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
17 [报告]
发表于 2013-02-01 17:20 |只看该作者

如果使用initrd参数,就一定得在相应的脚本文件中挂载实际根,否则会panic,是吧?

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
18 [报告]
发表于 2013-02-01 17:23 |只看该作者
initrd.tar.bz2 (1.51 MB, 下载次数: 8)

附件里面就是initrd.img里面的东西,我把lib,lib64里的内容删掉了,要不太大了
你可以看里面的/init
看一下自然明了

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
19 [报告]
发表于 2013-02-01 17:25 |只看该作者
本帖最后由 T-Bagwell 于 2013-02-01 17:26 编辑
chishanmingshen 发表于 2013-02-01 17:20
如果使用initrd参数,就一定得在相应的脚本文件中挂载实际根,否则会panic,是吧?


在上面代码里我贴过了,找不到那几个init或者linuxrc,或者在那之前找不到你指定的fs,或者block,就肯定会报和mount有关的panic了

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
20 [报告]
发表于 2013-02-02 12:38 |只看该作者
回复 10# chishanmingshen


    不知道你看的内核是哪个版本  我看手头上是没有init_post了。其实代码分析类的博客看看就行了,主要还是看代码。相信自己看到的逻辑
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP