Magenta - Namespace
Magenta的Namespace当前比较简单,只实现了类似于Linux的Mount-space,其他的space隔离暂未看到。Namespace的实现和其文件系统密切相关,后续有机会详细描述,现在只大概说明。
Magenta是以Client/Service的方式实现了文件系统。在devmgr进程中,除了做设备管理之外(device add,device remove, etc),还有1个线程mxio-dispatcher作为文件操作service(open,close,read,write, etc)。其他进程在打开文件时,会通过channel将request发送给service,service执行完文件操作后,将结果返回。
可见在上述的文件架构上,还是很容易实现mount-space的。即本地先创建一个虚拟的文件目录,并将本地的文件映射到service可见的对应的文件即可。
在目前Magenta有个测试程序namespace-test,我们可以实际跑起来看看效果。namespace-test运行时可带参数或不带参数。
当不带参数时,创建如下的映射:
{ "/bin", "/boot/bin" },
{ "/lib", "/boot/lib" },
{ "/fake", "/boot" },
{ "/fake/dev", "/dev" },
{ "/fake/tmp", "/tmp" },
{ "/fake/dev/class/pci/xyz", "/boot/src" },
前者是本地的虚拟文件或目录,后者是root目录下的文件或目录。运行以后,枚举前者目录下的文件,会发现和后者下的文件一样。
我们重点看看带参数运行的情况。
$ namespace-test /bin=/boot/bin
{ .handle = 0x6ce666a3, type = 0x00000020, .path = '/bin' },
在本地只创建1个目录/bin,对应到目录/boot/bin。
$ ls /
d 1 0 bin
可见当前根目录下只有1个目录。
$ ps
/boot/bin/sh: 2: ps: not found
$ echo $PATH
/system/apps:/system/bin:/boot/bin
执行ps失败,是因为/bin目录默认不在PATH路径中,所以未搜索到命令ps。
$ PATH=/system/apps:/system/bin:/boot/bin:/bin
$ ps
dlsvc: could not open 'ld.so.1'
/boot/bin/sh: 5: Cannot create child process: (UNKNOWN): elf_load: handle_interp failed
将/bin目录添加进PATH路径中,可以搜索到ps,但执行失败,因为我们没有映射lib库,导致搜索不到ld.so.1。
我们重新执行namespace-test,将目录/boot/lib也映射。
$ namespace-test /bin=/boot/bin /boot/lib=/boot/lib
{ .handle = 0x36307b6d, type = 0x00000020, .path = '/boot/lib' },
{ .handle = 0x36f07b69, type = 0x00010020, .path = '/bin' },
$ ls /
d 1 0 bin
d 1 0 boot
$ ls /boot/
d 1 0 lib
$ PATH=/system/apps:/system/bin:/boot/bin:/bin
$ ps
task-utils/walker: cannot open sysinfo: 2
WARNING: walk_root_job_tree failed: ERR_NOT_FOUND (-25)
ps命令还是执行失败,这是因为ps需要读取文件/dev/misc/sysinfo,但我们并未映射目录/dev。
我们重新执行namespace-test,将目录/dev也映射。
$ namespace-test /bin=/boot/bin /boot/lib=/boot/lib /dev=/dev
{ .handle = 0x62cdf50f, type = 0x00000020, .path = '/dev' },
{ .handle = 0x63bdf561, type = 0x00010020, .path = '/boot/lib' },
{ .handle = 0x6045f55f, type = 0x00020020, .path = '/bin' },
$ ls /
d 1 0 bin
d 1 0 boot
d 1 0 dev
$ ps
/boot/bin/sh: 2: ps: not found
$ PATH= PATH=/system/apps:/system/bin:/boot/bin:/bin
$ ps
TASK PSS PRIVATE SHARED NAME
j:1028 root
p:1043 1373.8k 1372k 28k bin/devmgr
j:1082 magenta-drivers
p:1245 789.8k 788k 28k /boot/bin/acpisvc
p:1659 249.8k 248k 28k devhost:root
p:1720 645.8k 644k 28k devhost:misc
p:1786 253.8k 252k 28k devhost:platform
p:1955 7329.8k 7328k 28k devhost:pci#1:1234:1111
p:2017 24.4M 24.4M 28k devhost:pci#3:8086:2922
j:1103 magenta-services
p:1104 293.8k 292k 28k crashlogger
p:1193 237.8k 236k 28k netsvc
p:2291 509.8k 508k 28k sh:console
p:2364 241.8k 240k 28k sh:vc
p:2498 241.8k 240k 28k sh:vc
p:2569 237.8k 236k 28k sh:vc
p:6875 329.8k 328k 28k /boot/bin/namespace-test
p:6960 381.8k 380k 28k /boot/bin/sh
p:7047 249.8k 248k 28k /bin/ps
TASK PSS PRIVATE SHARED NAME
DONE!