zoukankan      html  css  js  c++  java
  • 细说linux挂载——mount(一)

    (2012-07-20 10:59:26)

    转载▼

    原文出自 http://forum.ubuntu.org.cn/viewtopic.php?f=120&t=257333

    linux的系统组织方式是——整个系统从根开始,按树形目录依次向下逐渐扩大,分类存放不同用途的文件,/读作“斜线”,英文slash;当其写作一个路径时,第一个/表示根,即root,其他的/表示路径分割符,但都读作“斜线”或“slash”。

    系统启动时,首先有一个分区被挂载到了/,可以理解为该分区被分配了/这个奇怪“盘符”(注意,在windows里,这个符号被用做命令参数引导符号,而反斜线,英文backslash作为路径分割符,习惯不同而已,就像英国行车靠左一样,没啥可奇怪的)。
    这 个被挂载为/的分区,就叫做根分区(不管它是主分区还是逻辑分区),它从此开始在整儿linux系统里具有了特殊的地位,因为整儿电脑里的所有硬盘,包括 其上的所有其他分区,不管是主分区、逻辑分区,都将以这个“根分区为主干,开始构造linux大树,并最终成为这颗树上的一个分支或树叶。整个 linux的系统结构里,有且只有一个root(根分区),不可能有第二个(其实,任何一个分区,都可以挂载为/,windows分区也可以。只不过挂载 根分区的目的是启动系统,如果/下面没有linux内核及其所需的系统文件的话,将无法引导系统而已。所以这个根分区并不神秘)。

    你的其他分区只能被继续挂载到/(根分区)下的某个目录里,比如“/mnt”或者“/media”或者“/什么什么”目录,看你喜欢喽。挂载好之后,当你 向这个目录读写数据的时候,其实是在向被挂载到该目录的另一个分区读写数据。多个分区在同一个时候只能被挂载到多个不同的目录,比如“/mnt/a”、“ /media/123”或者“/home/anywhere”,任何一个处于/之下的目录,都可以用来作为挂载其他分区的“平台”,当然系统需要的目录可 不要用哈,你自己新建你自己的用吧。
    挂载好之后,你硬盘里的数据,就可以通过类似/path/to/anywhere这样的方式找到;如果没有挂载就找不到喽。
    用 一个庸俗的比喻来说,“/”相当于c:,而“/etc、/bin、/sbin、/lib”这些目录大概相当于c:windows和c: program files,“/home”相当于c:Documents and Settings,而当你把第二分区挂载到“/mnt/partition2”的时候,这个目录就相当于d:了,你地明白?

    不信就挂一次试试:

    代码:

    cd /mnt                  (切换到/mnt目录)
    sudo mkdir partition2      (新建一个名为partition2的空目录,你可以随意用其他名称)
    sudo mount /dev/sda5 partition2   (如果你只有一个硬盘且第二分区是逻辑分区的话,这个命令就将挂载该分区到partition2)
    cd partition2            (切换到/mnt/partition2目录)
    ls                     (列出该目录的文件)


    这样应该可以看到你的D盘下的文件了。
    既然能挂载就一定能反挂载:

    代码:

    sudo umount /dev/sda5   (或者/mnt/partition2)


    这个命令将“卸载”该分区,现在你再看会发现partition2又是空目录了。

    到这里,有人可能会说“linux太麻烦了,我有十几个分区,难道让我每次都要敲几十行命令?为什么不像windows那样启动时就全给我自动挂上呢?”
     1. 我是说过要敲命令,可我没说过“每次”!下面将会介绍的fstab文件将会使你在这件事上一劳永逸的解决问题;事实上,甚至还有一种“零”劳永逸的方法,你甚至一个命令都不用敲,点几下鼠标就好了;
     2. 像windows那样全自动挂上?也没有问题啊,装上一两个软件即可,不过我想提醒你:
    这样真的好吗?未必。我可以肯定,你大多数时间只会使用几个特定的分区;再退一步讲,即使你是例外,但你也应该为别人想想吧?比如我,有一个分区有“敏 感”数据(是啥你自己猜),而且不常用,以前用windows的时候,我对这种做法就很讨厌,谁都可以随便瞅一瞅,不好!后来全搬家到linux分区了, 平时不挂载,要用才挂上,哈哈哈,我的系统我做主!从此不再受那微软的苦~~~
     “像windows那样”,你的脑子里为什么每时每刻都在这样想?是因为windows的方法最“好”?也未必,顶多只是你习惯了“那样”而已。试想如果 你从来都用linux的“这样”,然后有一天我突然给你一台windows电脑的时候,你也一样会疑惑的问我:“我的家目录哪去了?”,“为什么不能搞得 像linux那样?”。
    承认了吧,所谓“最好”的“那样”是没有的,除了你那个有衰老迹象的思维里,哪儿都没有!赶快活动活动吧。

    一个例子______________________________________________________________

    /         (这就是著名的根)
    ├── bin         (你在终端运行的大多数程序,比如cp、mv...)
    ├── boot         (内核放在这里,这个目录也经常被作为某个独立分区的挂载点)
    │   └── grub   (grub引导程序和引导菜单就放在这里)
    ├── cdrom
    ├── dev         (存放设备文件,这里相当于一个设备管理器,由系统自动生成。视硬件环境不同变化很大)
    │   ├── block
    │   ├── bsg
    │   ├── bus
    │   ├── char
    │   ├── disk         (磁盘信息,要挂载硬盘分区就要注意这里的信息喽)
    │   │   ├── by-id      (硬盘分区的永久性符号链接)
    │   │   ├── by-label   (按卷标识别的硬盘分区,常用于挂载)
    │   │   ├── by-path   (硬盘分区的节点链接)
    │   │   └── by-uuid   (按UUID识别的硬盘分区,常用于挂载)
    │   ├── dri
    │   ├── fd
    │   ├── input
    │   ├── net
    │   ├── pts
    │   ├── shm
    │   └── snd
    ├── etc         (存放所有程序和系统的配制文件和全局变量,对所有用户生效,非常值得备份)
    ├── home         (这就是著名的home目录了,注意不是”家目录”,强烈建议把一个独立分区挂载到这里!)
    │   ├── adagio   (这才是我真正的家!一般来说目录名就是帐号名,当然也可以不是,随便。命令行中用波浪线~代表这里)
    │   ├── MNT      (这是我挂载其它硬盘分区的地方,你可以看到用硬盘品牌、容量或用途区分的目录名)
    │   │   ├── MAX40NT1   (迈拓40G)
    │   │   ├── ST160NT1   (希捷160G第一分区,下面两个类似)
    │   │   ├── ST160NT2
    │   │   ├── ST160SYS
    │   │   ├── ST320G      (希捷320G)
    │   │   │   ├── MOVIE
    │   │   │   ├── MUSIC
    │   │   │   └── P2P   (电驴、BT的缓冲区)
    │   │   ├── ST80G      (希捷80G)
    │   │   │   ├── PROGRAM
    │   │   │   ├── ST80PE
    │   │   │   └── YEAR
    │   │   └── WD1000      (西数1T)
    │   │       ├── WD2
    │   │       ├── WD3
    │   │       ├── WD5
    │   │       ├── WD6.Lib
    │   │       └── WD7
    │   └── test   (我建立的另一个帐号的家目录,专门用于测试,一旦搞到无法收拾的地步,只需简单的
    │                把里面的所有文件删除,就可以恢复默认。实际上你可以拥有无数个帐号)
    ├── lib         (所有程序共享的库文件)
    ├── lost+found   (磁盘扫描出现的丢失的数据)
    ├── media      (你在文件管理器里点击后自动挂载的分区就在这里,按卷标命名,没有卷标则按大小命名)
    ├── mnt         (同样用于挂载磁盘,这是最传统的位置,喜欢挂哪里随便)
    ├── opt         (某些特殊的程序喜欢把数据放在这里,比如JAVA)
    ├── proc         (当前系统所有的详细信息,这里的”文件”并不存在于硬盘中,而是在内存或缓存里,每次启动后都不一样)
    ├── root       (这是系统最高权威root用户的家!他是老大,所以不住在/home里,那里是草民住的)
    ├── sbin         (类似/bin,存放常用程序,但这里的程序都是要命的啊,比如格式化,所以只有root用户或sudo程序有权使用)
    ├── srv         (一些服务所要访问的文件)
    ├── sys         (系统的核心文件,类似/proc,不必管它)
    ├── tmp         (存放临时文件,所有用户均可使用,不过你要小心啊,这里的所有文件一旦重启就全没了,自动清空的)
    ├── usr         (你在X下使用的所有程序数据都在这里了,包括图标、manual等。所有用户都可以使用。也是最庞大的目录)
    └── var         (variation,顾名思义就是变量,这里存放系统中经常变化的数据。和/tmp不同啊,很有用的地方)
        ├── backups
        ├── cache
        │   └── apt
        │        └── archives  (存放你安装的所有程序的deb包!重装系统时太有用了,一定要备份好,到时候放回来。
        │           我建议把整儿/var单独挂载到一个独立分区,像/home一样。这样你重装好系统后,只
        │           需要简单的把整儿分区挂载到/var就行了,省去了备份-还原的时间。要知道这些deb包
        │          可不是几十M而已,而是有可能几百M、几个G,一来一回可够呛的。你也可以单独挂载
        │          个分区到/var/cache/apt/archives,其他的都不要。
        │          当然,这样又增加了一点系统构造的复杂度,喜欢怎样请自己斟酌。)
        ├── crash
        ├── games
        ├── lib
        ├── local
        ├── lock
        ├── log      (呵呵,这里的文件是系统运行的完整记录,出了问题一定要来这里看看)
        ├── mail      (这里是存放所有用户email的地方)
        ├── opt
        ├── run
        ├── spool
        └── tmp

    OK,现在咱们再具体一点,用我的ubuntu的启动过程来做个实例,看看linux是怎么逐步种出这颗大树的。
    首先还是说一句,你必需知道UUID是啥玩意儿,或者至少要明白hda、sdc这些编号是啥意思。否则肯定是鸡同鸭讲了。
    grub________________________________________________
     系统启动当然是从grub开始了,请打开你的/boot/grub/grub.cfg文件,找到类似下面这一段(以下以grub2的菜单为样本,grub0.97的menu.lst其实也类似)。

    代码:

    menuentry "Ubuntu 9.10, kernel 2.6.31-17-generic" {
    search --no-floppy --fs-uuid --set f1bafdd4-73c2-44b2-9a62-d50a2da4d019
    linux /boot/vmlinuz-2.6.31-17-generic root=UUID=f1bafdd4-73c2-44b2-9a62-d50a2da4d019 ro splash
    initrd /boot/initrd.img-2.6.31-17-generic
    }


    也可能是这个样子

    代码:

    menuentry "Ubuntu 9.10, kernel 2.6.31-17-generic" {
    set root=(hd2,6)
    linux /boot/vmlinuz-2.6.31-17-generic root=/dev/sdc5 ro splash
    initrd /boot/initrd.img-2.6.31-17-generic
    }


    这是一个标准的ubuntu引导菜单,menuentry那一行仅仅显示了该项目的名称(包括了后面被花括号围住的所有语句),不必管它;
    第二行开始,才真正进入linux系统的引导过程,search顾名思义就是要寻找喽,找什么呢?找内核。
    打开你的/boot目录,看看是不是有一个名为vmlinuz-xxxxx的文件,大小一般在10M以内,这就是有名的linux内核。
    有了内核,你就有了半个linux操作系统,可以开始引导系统了。
    第三行的linux /boot/vmlinuz-2.6.31-17-generic 这部分,linux是一个指令,它告诉grub程序:“请使用后面给出的这个内核”,于是名为“/boot/vmlinuz-2.6.31-17- generic”的内核将被载入内存,并读取“root=UUID=f1bafdd4-73c2-44b2-9a62- d50a2da4d019(sdc5)”这个分区的一些必需的文件。
    第三行的意思是:用名为“/boot/initrd.img- 2.6.31-17-generic”的文件先在内存中构造一个“虚拟”的根文件系统,以便于内核检测完硬件信息后载入必需的模块等等,其实这个 initrd也可以认为是内核的一部分,只是为了保持vmlinuz的简洁而分离出来的,有的内核甚至根本不需要这个咚咚。
    OKgrub的工作到此结束,下面将由linux内核这半个系统接管电脑的控制权,开始初始化阶段。
     注意,到目前为止还没有开始挂载根分区,所以你可以看到root=xxxxxxxx(sdc5)这个分区是只读(ro)挂载的。

    如果你去掉了第三行里的“quiet”参数的话,就可以在屏幕上看到内核初始化中整个儿过程的输出,当然,屏幕滚动会很快,而且内容很多,主要有检测硬件环境、载入相应模块、启动服务等等……。嗯,要启动一台电脑可不是件容易的事是不?
    好在目前你只需要关心一件事——挂载。请注意在大约中间阶段将会出现的一行字——Mounting Locale Filesystem
    如果你的linux刚装好的话,因为挂载项不多,可能一闪而过。而如果需要挂载的分区很多,特别是pass参数为1或者2的时候,你就能看见逐一列出的挂载情况了。

    fstab_____________________________________________
     YEAH!真正的分区挂载就此开始。

    这个时候linux将会读取一个名为fstab的文件,并按照其中的指令逐行执行,直到读完所有内容,进入系统后快打开看看吧,他位于/etc/fstab。以下是我的(不要以为我说“指令”就怕怕,其实里面的内容很简单,地球人都能看懂)。

    代码:

    # /etc/fstab: static file system information.
    #
    # Use 'blkid -o value -s UUID' to print the universally unique identifier
    # for a device; this may be used with UUID= as a more robust way to name
    # devices that works even if disks are added and removed. See fstab(5).
    #
    # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    proc   /proc   proc   defaults   0   0
    # / was on /dev/sda5 during installation
    UUID=ce8493a2-73a2-46d3-ac32-fe28ac9ec860   /   ext4   errors=remount-ro   0   0
    # /home was on /dev/sda6 during installation
    UUID=5ae0aea4-f7bb-4504-bf0c-f3dbffc8fa0f   /home   ext4   defaults   0   0
    # swap was on /dev/sda7 during installation
    UUID=db44da00-1b52-4d25-a870-57d36a6a2a85   none   swap   sw   0   0


    或者也可能被写成了这样

    代码:

    # /etc/fstab: static file system information.
    #
    # Use 'blkid -o value -s UUID' to print the universally unique identifier
    # for a device; this may be used with UUID= as a more robust way to name
    # devices that works even if disks are added and removed. See fstab(5).
    #
    # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    proc   /proc   proc   defaults   0   0
    # / was on /dev/sda5 during installation
    /dev/sdc6   /   ext4   errors=remount-ro   0   0
    # /home was on /dev/sda6 during installation
    /dev/sdc5   /home   ext4   defaults   0   0
    # swap was on /dev/sda7 during installation
    /dev/sdc4   none   swap   sw   0   0


    1. 请忽略所有以#开头的行,这是注释,给自己看的,linux不会执行它,就算是一行完整的命令也一样,它将被完全的无视。
    2. 请记住,每一行就是一条完整命令,不能有换行符。或者说换行符(回车)的作用相当于文章中的句号。
    3. 每行中的每个空格或TAB符号是参数分割符号,起作用相当于文章中的逗号。多个相连的空格或TAB将被视为一个。
    4. linux挂载分区的时候将自上而下,顺序执行

    第一个起作用的行(第8行)是proc,1楼已经解释过了,咱们不管它;
    第二个起作用的行(第10行)是/dev/sdc6那里,这就是linux最先被挂载的根分区了;
    再下来(第12行)将继续把sdc5挂载到/home,也就是说,sdc5这个本来关系平等的分区,现在感觉上成了sdc6的一个下级目录;
    最后(第14行)将“挂载”swap分区,之所以打上引号,是因为这个交换分区有点特殊,因为他并没有被“附属”于/,而是独立使用的,至少你从根目录开始是找不到它的(所以挂载点并没有被写成/swap),总之,它被系统“霸占”了,你不能直接在这个分区读写任何数据。

     到此为止,一个真正“可用”的linux系统创建完毕,可以交付你使用了。

    the object is not found
  • 相关阅读:
    【leetcode】1215.Stepping Numbers
    【leetcode】1214.Two Sum BSTs
    【leetcode】1213.Intersection of Three Sorted Arrays
    【leetcode】1210. Minimum Moves to Reach Target with Rotations
    【leetcode】1209. Remove All Adjacent Duplicates in String II
    【leetcode】1208. Get Equal Substrings Within Budget
    【leetcode】1207. Unique Number of Occurrences
    【leetcode】689. Maximum Sum of 3 Non-Overlapping Subarrays
    【leetcode】LCP 3. Programmable Robot
    【leetcode】LCP 1. Guess Numbers
  • 原文地址:https://www.cnblogs.com/sunofwe/p/4778767.html
Copyright © 2011-2022 走看看