找到了要 mount 的目录,下面就开始实际的mount过程 mount的过程就是把设备的文件系统加入到 vfs 框架中 1. 首先,要mount一个新的设备,需要创建一个新的 super block。 这通过要mount的文件系统的 file_system_type, 调用其 get_sb 方法来创建一个新的 super block
2. 对于任何一个 mount 的文件系统,都要有一个 vfsmount, 创建这个vfsmount, 并设置好其属性(就是 vfsmount 中的各个成员)
3. 将创建好的 vfsmount 加入到系统中。
整个过程如下所示: /---------> /---> dentry ("/") <-----------\ | | +--------------+ | | \----| d_parent | | | +--------------+ | | | d_child | | | +--------------+ | | /-------->| d_subdirs |<-----------|-------\ | | +--------------+ | | | | | d_mounted | | | | | +--------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | dentry ("home") <-\ | | | | +--------------+ | | | | | | d_parent |----|-------/ | | | +--------------+ | | | \-------->| d_child |<---|- ...... ------/ | +--------------+ | | /------>| d_subdirs |<---|-------------\ | | +--------------+ | | | | | d_mounted | | | | | +--------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | dentry ("xpl") <--------------------------------------\ | | +--------------+ | | | | | | d_parent |----/ | | | | +--------------+ | | | \------>| d_child |<---- ...... ----/ | | +--------------+ | | | d_subdirs | | | +--------------+ | | | d_mounted | | | +--------------+ | | | | | | | | | | | | task_struct | | +-------------+ | | | | | | +-------------+ | | | name_space |---------\ | | +-------------+ | | | fs_struct <-----| fs | | | | +----------+ +-------------+ | | +----<----| root | | | | | | +----------+ | | | | pwd | | | | +----------+ | | | /------| rootmnt | | | | | +----------+ | | | | | pwdmnt | namespace <---/ | | | +----------+ +---------+ | | | | | | count | | | | +---------+ | | | | root | | | | +---------+ | | | /--------------------------->| list |<-------------------\ | | | | +---------+ | | | | | | sem | | | | | | +---------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | \----------> vfsmount <----\ vfsmount(new) | | | | +---------------+ | +---------------+ | | | \------| mnt_list |<-----|------>| mnt_list |<----/ | | +---------------+ | +---------------+ | | | mnt_parent | \-------| mnt_parent | | | +---------------+ +---------------+ | | | mnt_mountpoint| | mnt_mountpoint|----------/ | +---------------+ +---------------+ \-----<--------| mnt_root | | mnt_root |------------\ +---------------+ +---------------+ | /--------| mnt_mounts |<----\ | mnt_mounts | | | +---------------+ | +---------------+ | | | mnt_sb | | | mnt_sb |--------\ | | +---------------+ | +---------------+ | | | | mnt_child | \------->| mnt_child |<---\ | | | +---------------+ +---------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \------------------------------------------------------------/ | | | | | | | | | | | | | | | | | | | | super_block ---------------------------------/ | +-----------+ | | s_list | | +-----------+ | | s_inodes | | +-----------+ | | s_files | | +-------------+ +-----------+ | | "/dev/hdb1" |<------| s_id | | +-------------+ +-----------+ | | s_op | | +-----------+ | | s_root |-----> dentry ("/" of hdb1) <--------/ +-----------+ +--------------+ | | | d_parent | +--------------+ | d_child | +--------------+ | d_subdirs | +--------------+ | d_mounted | +--------------+ | |
从这张图可以看