自从10.7系统之后,苹果系统内核也有了个大改变,比如客户端用户认证的服务,10.5和10.6的时候统管叫做DirectoryServices,10.7之后改称为使用OpenDirectoryd服务,当然了在10.4及其之前使用NetInfo用于用户认证以及系统配置等等,不过由于NetInfo本身的限制,另Apple转移到开放目录。这种重大改变也秉承了苹果系统之传统,在用户级别上给普通用户的使用体验上没有太大影响的同时,系统内部却会大刀阔斧地进行改变。这些系统级别的改变虽然对最终用户的影响不大,不过却常常给系统管理带来一些麻烦,这主要是因为在系统管理中不会仅仅使用Apple所提供的GUI的方式,无论是bash还是python,perl脚本才是最经常使用的,从管理的角度来说苹果的兼容性的确不如Windows,很明显的一个例子,摒弃了NetInfo致使原来的系统管理方式发生根本变化,小的方面,诸如系统登陆界面的背景,也会是不同版本不同的方式,而且它至今也没有固定下来,真不明白,这些小的细节有什么可以被神秘的。系统大的变化文档一些可以在man中找到。
说回OpenDirectoryd服务,这不仅仅是从名称上的改变,在集成到现有的目录服务系统的实践中还是有一些改变的,当初也为企业管理带来了不小的麻烦,想当初在10.7的时候,会带来一些不习惯,比如bind和unbind的时候,设置管理用户组时要使用\\,后来到了10.8就更接近使用习惯了,使用\就可以了;如果计算机名中有"-"减号,Directory Utility居然会默认改变为"_"下划线,这如果没有被注意,那么bind的时候肯定会出问题;而且unbind的时候也方便了,当然,命令行也方便多了。
通过现在的OpenDirectoryd内核,系统级别上相比较之前,从底层上更好的支持对于Active Directory | LDAP | Local Database | NIS等等目录服务系统的连接和配置,这也为OS X更好地融入到Active Directory目录服务系统中提供了坚实的基础。而LDAP主要是对于诸如苹果服务器上所支持的Open Directoryd目录服务的,当然也可以用于其他符合LDAP/X500标准的轻量目录服务系统,这得益于它的定制化能力。
基于Apple的官方文档,10.9中的opendirectoryd支持模块,这是与DirectoryServices的重要不同之处。一个模块在私有空间运行,使用XPC与opendirectoryd通讯,所以它的崩溃不会影响其他模块以及opendirectoryd本身,并且
odutil命令:
为了与OpenDirectryd服务进行配置,需要使用命令行odutil,当初NetInfo时,使用的命令叫做niutil,可以看出这种命名规范还是没有改变的。
$ odutil show configuration "/Active Directory/ORG"
{
"module options" = {
ActiveDirectory = {
"admin group list" = (
"ORG\\WSAdmins_L",
"ORG\\CS_ITS_G"
);
"admin group list enabled" = 1;
"allow multi-domain" = 1;
"cache last user logon" = 1;
"cache last user warning" = 0;
"default user shell" = "/bin/bash";
"default user shell enabled" = 1;
domain = "org.youcompany.com";
"force home local" = 1;
forest = "youcompany.com";
"generate authentication authority" = 1;
"managed client template" = {
"mcx_application_data" = {
"com.apple.MCX" = {
Forced = (
{
"mcx_precedence" = 500;
"mcx_preference_settings" = {
"com.apple.cachedaccounts.CreateAtLogin" = 1;
"com.apple.cachedaccounts.WarnOnCreate" = 1;
};
}
);
};
"com.apple.dock" = {
Forced = (
{
"mcx_precedence" = 500;
"mcx_preference_settings" = {
"AppItems-Raw" = (
);
"DocItems-Raw" = (
);
"MCXDockSpecialFolders-Raw" = (
AddDockMCXOriginalNetworkHomeFolder
);
};
"mcx_union_policy_keys" = (
{
"mcx_input_key_names" = (
"AppItems-Raw"
);
"mcx_output_key_name" = "static-apps";
"mcx_remove_duplicates" = 1;
},
{
"mcx_input_key_names" = (
"DocItems-Raw"
);
"mcx_output_key_name" = "static-others";
"mcx_remove_duplicates" = 1;
},
{
"mcx_input_key_names" = (
"MCXDockSpecialFolders-Raw"
);
"mcx_output_key_name" = MCXDockSpecialFolders;
"mcx_remove_duplicates" = 1;
}
);
}
);
};
loginwindow = {
Forced = (
{
"mcx_precedence" = 500;
"mcx_preference_settings" = {
"AutoLaunchedApplicationDictionary-raw" = (
{
AuthenticateAsLoginUserShortName = 1;
"MCX-NetworkHomeDirectoryItem" = 1;
}
);
};
"mcx_union_policy_keys" = (
{
"mcx_input_key_names" = (
"AutoLaunchedApplicationDictionary-raw"
);
"mcx_output_key_name" = "AutoLaunchedApplicationDictionary-managed";
"mcx_remove_duplicates" = 1;
}
);
}
);
};
};
};
"mount home as sharepoint" = 1;
"mount style" = smb;
"reject MD5 servers" = 0;
"require sign or seal" = 1;
"require strong key" = 0;
"seal secure channel" = 1;
"sign secure channel" = 1;
"trust domain" = "org.youcompany.com";
"trust password change in days" = 14;
"use Windows UNC path" = 1;
};
};
"node name" = ORG;
options = {
"connection idle disconnect" = 90;
"connection setup timeout" = 10;
"man-in-the-middle" = 1;
"no cleartext authentication" = 1;
"packet encryption" = 0;
"packet signing" = 0;
"query timeout" = 30;
};
template = "Active Directory";
trustaccount = "w430-275$";
trustkerberosprincipal = "430-275$@ORG.youcompany.com";
trustoptions = (
"system keychain"
);
trusttype = joined;
"virtual subnodes" = (
"All Domains"
);
}
其中主要的node name, Options, Virtual subnotes是比较重要的。
$ odutil show statistics
Statistics:
Report for Kernel
=================
Counters:
Translation (Cache Hit) - 5914
Translation (Cache Miss) - 16
Membership Checks (Cache Hit) - 1452
Membership Checks (Cache Miss) - 79
Translation (Cache Hit) metrics:
10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
+----+----+----+----+----+----+----+----+----+----+
1 us |*********
2 us |**
4 us |************
8 us |*************
16 us |**********
32 us |*
Membership Checks (Cache Miss) metrics:
10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
+----+----+----+----+----+----+----+----+----+----+
4 ms |*****
8 ms |**********
16 ms |***
32 ms |*********
64 ms |*****
128 ms |
256 ms |*
512 ms |****
1 s |*****
2 s |*
4 s |*
8 s |*
Report for Userland
=================
Counters:
Translation (Cache Hit) - 5591
Translation (Cache Miss) - 4
Membership Checks (Cache Hit) - 3321
Membership Checks (Cache Miss) - 51
GetGrouplist (Cache Hit) - 320
GetGrouplist (Cache Miss) - 15
GetGrouplist (Cache Hit) metrics:
10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
+----+----+----+----+----+----+----+----+----+----+
1 us |
2 us |*
4 us |***********************
8 us |*******************
16 us |****
32 us |*
64 us |
GetGrouplist (Cache Miss) metrics:
10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
+----+----+----+----+----+----+----+----+----+----+
8 ms |****************
16 ms |**********
32 ms |
64 ms |
128 ms |*************
256 ms |
512 ms |***
1 s |***
2 s |***
Report for Queries
=================
Counters:
Total Queries - 6271
Failed Queries - 3423
GroupMembership - 172
GroupMembers - 79
NestedGroups - 7245
GroupMembers metrics:
10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
+----+----+----+----+----+----+----+----+----+----+
2 ms |
4 ms |********
8 ms |********
16 ms |*
32 ms |*
64 ms |********
128 ms |******
256 ms |
512 ms |**
1 s |*****
2 s |***
4 s |
NestedGroups metrics:
10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
+----+----+----+----+----+----+----+----+----+----+
256 us |
512 us |
1 ms |*
2 ms |
4 ms |
8 ms |
16 ms |******************************
32 ms |*********
64 ms |***
128 ms |
这里只是选取了一些比较缓慢的请求统计。可以看出,不在缓存中而且是组/嵌套组查询会非常耗时,不过还不算太坏,这与AD服务器配置和性能息息相关,除了增加缓存击中率外,客户端基本上没有可优化的。
$ odutil show nodenames
Nodenames:
Name State Refs Type External Locked Hidden
---------------------------------------------- ------ ---- ------------ -------- ------ ------
/Active Directory Online 2 X X
/Active Directory/ORG Online 17
/Active Directory/ORG/All Domains Online 21 Virtual node
/Active Directory/ORG/Global Catalog Online 21 Virtual node X
/Active Directory/ORG/youcompany.com Online 8 Virtual node X
/Active Directory/ORG/org.youcompany.com Online 24 Virtual node X
/Active Directory/ORG/public.youcompany.com Online 4 Virtual node X
/Configure Online 1 X X
/Contacts Online 4
/LDAPv3 Online 1 X X
/Local 2 X X
/Local/Default Online 53 X
/NIS 1 X X
/Search Online 94
{
"Libinfo": {
"pw_gid": 24,
"pw_passwd": "*",
"pw_uid": "24",
"pw_gecos": "Network Services",
"pw_name": "_networkd",
"pw_shell": "/usr/bin/false",
"pw_dir": "/var/empty",
"pw_uuid": FFFFEEEE-1111-222-3333-000000000000
},
"Member Of": [
"065C3919-0000-4444-0000-CDEF000000E1",
"ABCDEFAB-0001-ABCD-EFAB-CDEF00000000",
"ABCDEFAB-0001-ABCD-EFAB-CDEF00000001",
"ABCDEFAB-0001-ABCD-EFAB-CDEF00000002",
"D7306BDC-0011-4444-0000-CDEF000000E0"
],
"Membership Phase": "Pending Network Direct Member Query",
"Found By": [
"Name",
"ID",
"UUID",
"SID"
],
"Expires": "13071",
"Last Refresh": "1329",
"Last Access": "627",
"Entry Flags": [
"Local",
"Membership Refresh Required"
],
"Node": "/Local/Default",
"Names": [
"_networkd"
],
"NFSv4": [
"_networkd@430-275.local"
],
"ID": "24",
"UUID": "FFFFEEEE-1111-2222-3333-000000000000",
"SID": "S-1-5-21-3838272839-0101010101-1898976543-1111",
"RefCount": "5",
"Detail Flags": "0x000009F1"
},
可以得到用户的UUID, SID, name, 用户文件夹位置等等。
odutil show cache > ~/Desktop/odutilCache.txt
sed -i 's/ : \([A-Z0-9-]*\),/ : "\1",/g' ~/Desktop/odutilCache.txt
cat ~/Desktop/odutilCache.txt | jq '.' >jq.txt
plutil -covert xml1 jq.txt -o jq.plist
这样就可以使用Property List Editor来方便编辑了。