简单看Mac OS X文件系统

本文以一个不常见的线索,介绍一下Mac OS X的文件系统的基础,后面会逐步深入。这个线索就是“域”。
域(domain)是Mac OS X管理所有文件系统资源的方法,它不是体现在某个看得见摸得着的文件或者界面上,它是Mac OS X的一种管理组织哲学。如果说一个企业内部的管理有等级制,那么Mac OS X就有“域”制。“域”是Apple管理文件系统的办法,传统Unix以及Linux系统上很少提到。

在Mac OS X中,共有四个域:User,Local,Network,System。这四个域涵盖了Mac OS X操作系统的方方面面。此贴先看看User域。

User域中包含了一个用户登录到系统后,可以支配的文件资源。简单地说,User域是由用户的主目录来定义的。主目录通常情况下是/Users/下的某个目录,比如用户Bill Gates,他的主目录很可能是/Users/bgates或者/Users/bill。当然,这个主目录也可以重新指定到另一个位置,比如另一个分区,或者一个分区上的某个目录,甚至是网络上的某个目录或者移动硬盘上的一个目录。在某些公司或者学校等组织中,通常做法是把全部用户的主目录集中存放在一台服务器上,这样用户就可以在任何一台客户端机器上登录访问自己的主目录下的资源。

用户的主目录是用户自己的天下!主目录下面存放了主人的一切信息,比如你的系统偏好信息,Terminal的命令历史记录,应用程序配置信息,等等等等,凡是属于该用户,或者由该用户修改和产生的信息,都放在主目录下面。主目录名是该用户的系统登录名(短)。不允许出现重复的用户登录名,所以也不允许出现相同的主目录名。

主目录为每个用户提供了一个私有且与众不同的工作环境,用户登录的时候,Finder根据该用户主目录中的配置文件,为该用户打造了一个独一无二的工作环境,相应地,当用户启动应用程序的时候,那些程序会在用户主目录下找到与自己有关的配置文件或者用户的使用偏好信息,网络设置信息,电子邮件设置,字体,颜色配置等等等等。总而言之,User域为每个用户定义了一个私有空间,这个私有空间存放了用户的一切相关信息。

值得一提的是,如果一个用户拥有一个.Mac账号,那么该用户登录以后,主目录中的配置信息会同步到该用户的iDisk上。

Mac OS X下的用户类型
Mac OS X下的“等级制”其实也是存在的,好比一艘船的船长,大副和普通水手。这里船长相当于root(又叫超级管理员,超级账户),大副相当于管理员,普通水手相当于普通用户(又叫标准用户)。系统里可以有很多普通用户和管理员,但只能有一个root用户。除此之外,还有三个比较特别的账户——访客用户,共享用户,系统进程用户。

用户与账户
用户指人,而账户指Mac OS X赋予某用户的系统身份。
为了便于理解,假设不存在几个人共享一个账户登录的情况,这样的话,用户跟账户(指常规登录账户,非系统进程账户)便一一对应起来,下面说的账户与用户,如果没有特别标明,那么两者不加区分。

Mac OS X的船长——root账户
船长拥有最高权限,它是系统里的上帝,如果你以root身份登录了Mac OS X,那么你就相当于进入了“上帝模式”,是的,这是个万能也因此十分危险的角色。默认情况下,Mac OS X会把系统超级账户——root禁用。事实上,这里的禁用是将root账户的密码设为一个随机值,它存在,但没人知道是什么。在这种情况下,不知道密码是不能够使用root账户的,系统随机给root设置一个密码,就被看做是禁用root账户的标志,也就相当于被禁用了。要想“启用”root账户,至少有如下三种办法:

方法一:sudo passwd root命令
在terminal中,输入:
sudo passwd root
复制代码
再输入两次您的root账户密码。

方法二:dsenableroot命令
在terminal中,输入:
dsenableroot
复制代码
然后输入当前账户的密码,前提是,当前账户必须是一个管理员账户。然后输入两次root账户的新密码。这样root账户就启用了。
如何禁用root账户呢?输入:
dsenableroot -d
复制代码
,root即被禁用。
其它用法请参考dsenableroot联机手册。

方法三:使用Directory Utility.app
在Mac OS X 10.5 Leopard中,Directory Utility.app位置在/Applications/Utilities目录里,而在Mac OS X 10.6 Snow Leopard中,Directory Utility.app被转移到了/System/Library/CoreServices目录。运行Directory Utility.app,点击左下角的锁头图标,输入管理员账号的密码(管理员很可能就是您当前使用的账号)进入编辑模式,点击Directory Utility程序菜单栏中的Edit,就会看到Enable Root User选项,如果在这之前root账户没有被启用过,这步会提示您输入新的root账户的密码两次,完成后,root账户就被启用了。若要禁用root 账户,则再次找到该菜单位置,选择Disable Root User就可以了,此外,要更改root账户密码,就选择Change Root Password,输入旧密码后,接着按提示输入新密码。
另外一个启动Directory Utility.app的方法是,System Preferences -> Accounts -> Login Options -> Network Account Server -> Join -> Open Directory Utility…,就能启动Direcotry Utility.app。

Mac OS X的大副——管理员账户
作为一台Mac除了内建的root之外的第一个用户,你自然而然地承担者管理系统的角色——系统管理员。Setup Assistant让你光荣地成为了可能是唯一的一个的系统管理员。因此,你可以修改系统偏好中的任意项目,安装应用程序,在系统中添加可以被所有用户共享的任何资源,但是你不能碰船长的东西——关键的系统文件,以及其它用户除了Public和Sites目录中的文件——毕竟,管理员账户也不过是被加入了Admin用户组的普通用户,User域要确保用户之间有一定的独立性。看到了吗?在系统偏好的账户面板中,Admin清楚地表明你是一个管理者,在Mac OS X中,至少要有一个Admin用户组的普通用户,因为Mac OS X不鼓励root来管理系统,普通用户也不能管理系统。凡是属于Admin用户组的普通账户,即被赋予了这些基本的管理权限,否则,就是普通用户——水手。

Mac OS X的水手——普通账户
普通账户能做的事情就有限得多,他只能使用全部应用程序的一个子集,修改与本账户有关的系统偏好。但像Security, Energy Saver, Print & Fax, Network, Sharing, Accounts, Date & Time, and Startup Disk preferences这些系统范围的设置,普通用户是不能碰触的——除非大副或者船长告诉你他们的密码。根据“域”的管理哲学,普通用户不应该看到或者更改其它普通用户的私有资源——其他用户的主目录,当然,每个人的Public和Sites中的内容是开放的。

Mac OS X的外来者——访客账户
从Mac OS X 10.5开始,新增加了这样一个账户,它更像是船上的一个临时窝棚,供客人歇脚。访客账户没有自己的密码,所以任何人都可以访客身份使用Mac OS X,而一旦访客离开了系统,这个临时窝棚会被拆除——访客的主目录会被删除!里面的任何东西都被扔掉了,比如上网历史记录,偏好文件等等。直到再次有人以访客身份登录系统,这个临时窝棚才会被重建,当然,也会被再次删除。

Mac OS X上的“黑奴”——共享用户
最没“地位”的用户就是共享用户了,因为这类用户没有自己的私有空间(主目录),甚至连个临时歇脚的窝棚都没有。共享用户一般不能登录系统,因为默认他们没有自己的密码,而能去的地方也只有别人的Public目录和DropBox——除非管理员来改变这一切。基于这些,共享目录甚至不能称得上是Mac OS X这艘船上的一个正常人。

Mac OS X中的“隐形者”——系统账户
系统账户是系统针对特定进程进行操作的一类账户,如果你在另一台电脑上███登陆到你的Mac,那么前提是你的Mac一定要有个“_███d”账户在后台默默地维护着”███”进程,再比如说,Apache服务如果开启了,那么“_www”账户会在后台维护着”httpd”进程,如果你又安装了MySQL数据库,那么“_mysql”账户会在后台维护着“mysqld”进程。看到了吗,这种系统账户都有个共同的特点,就是以一个下划线”_”开头,从Mac OS X 10.5开始,Apple给系统账户加了个“_”姓,以便于区分系统账户和其它账户。那么这类账户有多少?在Mac OS X 10.6中,有40个左右,这个数字取决于你开启的系统服务还有是否安装了一些比较“个性”的程序。这些系统账户也有自己的主目录,但绝对不在/Users下面,而是它们各自安装目录。如果你发现某个文件夹或者文件资源的所有者是一个你不认识但姓“_”的账户,那么那个资源就是那个系统账户的。

主目录下的子目录布局
这里的“主目录”是指管理员和普通账户的主目录,不包括root,访客,共享和系统账户。因为用户的主目录是用户自己说得算的目录,所以用户可以在主目录中建立任意文件和目录。默认情况下,有一些已经存在的目录,它们是Mac OS X本身“认识”的子目录:

Desktop
传统Unix-like操作系统基于命令界面,没有“桌面”这个概念,而图形界面的产生,使主目录下多了一个文件夹,用来存放用户在图形界面登录后看到的目录——桌面。

Documents
包含用户的个人文档。某些应用程序特别喜爱这个目录,比如Office。

Downloads
默认下载目录。如果你用Firefox下载了一个文件,却希望在自己的桌面上找到它的话,你就会失望了。Firefox等浏览器会悄悄地把下载来的文件放在Downloads目录,除非你更改这一行为。

Library
存放用户的应用程序设置,偏好,以及与该用户相关的其他系统资源。这些资源包括:字体,联系人,邮件,屏保,等等等等。所以,用户的各种各样的个人资源都放在这里了。

Movies
存放数字影片文件——iTunes,iDVD,和iMovie会默认把这里当做影片文件的存放地点。

Music
存放数字音乐文件——iTunes,GarageBand,和Logic会默认把这里当做数字音乐的存放地点。

Pictures
存放数字图片文件——iTunes,iPhoto,和Aperture会默认把这里当做图片的存放地点。

Public
存放用户希望跟其他用户共享的文件,默认地,这个目录可以被其他用户访问。

Public/Drop Box
用户个人的“收件室”——其他用户可以往里面放东西,但除此之外什么都做不了——甚至看不到里面。

Sites
包含用户的个人网站文件。当Apache服务开启时,该目录称为该用户个人站点的根目录。

Applications目录
当一个新建立一个用户时,该用户主目录下并不会像上述目录一样被自动创建,但是,如果用户自己手动建立Applications目录,并把应用程序安装到该目录的话,Mac OS X会自动在该目录找到安装的应用程序,并且该用户独自拥有该应用程序的使用权。

既然主目录是用户的天下,那么用户的的确确是可以随意乱放文件的,比如你偏偏要把歌曲放在Pictures下面,把视频(可能是敏感的)文件放在Public下面,把自己的文档文本统统放在Library下面——这些在Mac OS X看来都是“合法”的,但你知道,这是“不道德”的。

其实,在用户主目录下建立的目录还是有一定规则的,这些规则内建在Mac OS X系统中,比如,在Apache配置文件中就会记录把用户主目录下的Sites目录当做该用户个人站点的根目录,一些其他的应用程序如iTunes,iPhoto等等会到相应的子目录下寻找或建立自己需要的资源文件。你看,这些系统认识的目录都被系统悄悄地打上了“烙印”——那些漂亮的带暗花的目录图标。当你在主目录下新建一个目录时,目录图标就是一个普通的文件夹,而当主目录下的子目录是Mac OS X“认识”的,那它的外观肯定与众不同——你可能是第一次在自己的主目录下新建一个Applications目录,试试看吧。

/User███ared
上面提到的目录都是主目录下的子目录,而各个主目录默认都放在/Users目录下,比如/Users/bgates。而/Users下还有一个特别的目录——/User███ared。
这个目录并不表示系统中有一个用户叫做“Shared”,所以他不是任何用户的主目录(千万别把它当成“共享(sharing)用户”的主目录!),那么它是做什么的呢?Mac OS X系统希望通过这样一个目录提供另外一种用户之间共享数据的方法。该目录可以被任意用户读写,但它不应该存放与任何应用程序有关的信息,当然,除非某用户非要这么做。这个目录很像传统Unix系统中的/tmp目录,用于各(系统)用户临时存放或者交换文件。

个人账户在Mac OS X中的管理
Mac OS X以其内在的Unix本质管理着User域的一切。如果说文件是系统的细胞,那么账户就是文件通过系统跟人打交道的通道。每个文件都有一个账户作为它的所有者,因此,系统里任何一个文件都有“主儿”,根据User域的管理哲学,一个账户的资源,该账户有权决定其它账户是否可以访问,这样Mac OS X便形成了一个统一的权限体系。而如何管理账户以及之间的关系,就成了基础中的基础。
跟传统Unix不同,Mac OS X把本地所有账户信息集中存储在一个目录中:/private/var/db/dslocal/nodes/Default/Users。
这个目录就是该机器的“户口中心”,每一个用户都有一个对应的XML格式的property list文本文件,后缀名为.plist。关于某一账户的内部信息,全都在这里了,如果你有root权限,你可以打开几个你关心的账户对应的.plist文件看看:(但是不要直接修改里面的内容)

generateduid:
看看Mac OS X是怎么给你起名字的:它用一种特殊的算法,把该账户创建时间和地点也考虑进去,在全世界范围内,生成唯一的字符串。这个字符串就是机器给你的ID,它是唯一的——哪怕你在其它机器上先删除然后再次创建一个同名账户,哪怕你用系统还原,重装,时间机器,等等任何方法手段再次生成同名账户,哪怕你的账户名跟地球上另一台机器上的某一账户同名,这个ID都是不同的,因此它也叫做“Universally Unique ID (UUID)”。有了它,该账户便会被永久性地被追踪——只要系统得到了这个UUID,那无论你改了用户名,改了密码,洗了澡,整了容,穿了马甲,烧成灰 系统都人得你。别忘了,账户都是有密码的,当账户名和密码匹配时,系统才认定你是真正的用户,那么你改了账户名怎么办?于Mac OS X来讲,无所谓,系统永远把你的UUID和密码看做真正的匹配条件。

gid:
组ID。对于账户所在的组也一样,机器分配给每个组一个ID用于追踪,只不过这个ID没有那么“复杂的身世“,作用范围仅仅限于本地系统,所以,两台机器上是会重复的。

hint:
还记得创建账户时填写的一项“密码提示问题”么?存在儿呢。

home:
主目录路径。在Accounts面板中的用户头像上点击右键,可找到一处“安全”修改用户主目录的地方,所谓安全,是指重新制定一个主目录,以便在该用户下次登录系统的时候使用,但是记住,Mac OS X不会把你旧的主目录内的个人资源数据拷贝到新主目录下,而仅仅建立一个新的主目录结构,仿佛刚刚新建了一个账户一样。当然,旧主目录中的数据还在,Mac OS X不会去碰它,好吧,如果你这样做了,记得把旧的东西搬到新的地方。

jpegphoto:
你头像的二进制表示。

name:
账户名的缩写。这个name其实相当于一个可变的ID,便于用户使用,因此,这个字段的出生完全是为了方便用户而已,Mac OS X已经有了无敌的UUID。

passwd:
这里当然不是你账户的密码,Mac OS X用一种单向算法转换成其它字串,且只记录换算后的密文。当然了,就算是密文,Mac OS X还是把它单独存储在了另一个地方,这里你只能看到”*“符号。

realname:
账户名,非缩写。你其实可以每次都使用这个真名加密码登陆系统的。如果说realname和name分别是你的”全名“和”昵称“的话,那么当你每次希望跟系统沟通需要授权时,Mac OS X都会把realname和name映射到你的UID后,才进行进一步密码匹配授权。看得出,realname和name都是可变的,更没有谁先谁后的问题,你完全可以使用”William Henry Bill Gates III”作为你的realname,然后使用“Jobs”作为name,最后使用这两个字串任何一个来登录系统——Mac OS X会把它们指向同一个UID(注意不是UUID)。

shell:
默认使用哪一种shell。如果现在你还不知道Shell是什么,那么你以后会知道的,至于什么时候知道?取决于你什么时候真正想查一查它。
你可以简单把shell理解成计算机和人交流的界面——“人机界面”,或者“用户界面”,所以Mac OS X有两种内建的shell,一种是“GUI”(图形用户界面),一种是“CLI”(命令行界面)。对于后者,在GUI下,Mac OS X使用了terminal来模拟真正的CLI。除了日常使用Finder等GUI程序进行操作,熟悉CLI也是非常重要的,除非你不想知道GUI背后发生了什么。GUI做不到的一些事情用CLI是有可能完成的。例如,我们知道在Finder中可以修改一个文件的“所有者”,以及“权限”等基本Unix文件属性,但对于在Mac OS X 10.4中引入的ACL(访问控制列表——请别联想到路由器),直到Mac OS X 10.6中,依然没有给出一个GUI程序来控制(这里仅指Client版,Server版有GUI程序可以做到。)一个文件的ACL属性,在这种情况下,我们只能使用CLI或者说“模拟的CLI”——terminal程序来修改ACL。对于文件权限以及ACL的更多问题,可能会在另一篇文章中介绍。

uid:
在本地机器上,用于识别账户的一个数字ID。跟组ID一样,这个也叫做“用户ID”,它也是用来在本地范围内跟踪用户的一个ID,既然是本地范围,那么两台机器上完全可以出现同一个UID对应不同用户——它毕竟不是UUID。
UID和GID会在terminal中显示——当你用“ls -n”命令时,系统不用用户名和组名标明一个文件的所有者,相应地,系统用UID和GID来显示。好吧,没关系,现在可以不去管它。

组账户在Mac OS X中的管理
组,仅仅是一个归类用户的一个列表。把一个或者多个用户逻辑上划分为一个组,可以针对文件和一些系统级的操作形成更为细化且方便的控制机制。比如,一个公司里的员工可以有一个“人力资源部”,处于这一部门(逻辑上的组)的员工(个人账户)就可以被赋予查看或处理公司的一些敏感信息(文件或者某些程序),用于给员工加薪,发放工资或者培训之类的操作。一个员工可以属于多个部门,所以一个账户可以属于多个组。
默认情况下,普通用户被指定为“stuff”组,管理员被指定为“Admin”组和“stuff”组,而root账户,则会被指定为“wheel”组。
注意,组是可以嵌套的,你可以把一个小组整体作为另一个小组的成员。一个不恰当的比喻是,个人账户像是一个文件,而一组账户放进一个文件夹(目录)之后可以被看做是一个组,而一个文件夹(目录)可以放进另一个文件夹(目录)。

密码
账户密码:
在传统Unix系统中,密码和账户信息是分开存储的。比如:/etc/passwd文件存储了:账户名,密码是否加密的标记,UID(用户ID),默认组,主目录,默认登陆Shell以及注释信息,而/etc/shadow文件存储了UID(用户ID),加密后的密码,最近一次修改的天数,密码有效时限等等等等。在Mac OS X上,稍有不同:

用户信息存储在:/private/var/db/dslocal/nodes/Default/Users目录下的.plist文件里,而这里要说的账户密码,存储在:/private/var/db/shadow/hash目录下的那些文件中,以每个账户的UUID作为文件名的文件中,当然,里面内容是“可读”但“读不懂”的,Mac OS X甚至用二进制代码来记录该账户使用密码的历史情况,如:曾经该账户被尝试登陆时密码输入不匹配的次数,上次登陆时间,上次密码更改日期等等信息。

简单看Mac OS X文件系统
标签: