Man page - mount_namespaces(7)
Packages contains this manual
- shm_overview(7)
- nss(5)
- proc_mtrr(5)
- intro(7)
- tcp(7)
- iso_8859-9(7)
- armscii-8(7)
- proc_kpagecount(5)
- initrd(4)
- mouse(4)
- proc_stat(5)
- x25(7)
- proc_interrupts(5)
- fifo(7)
- repertoiremap(5)
- icmp(7)
- futex(7)
- feature_test_macros(7)
- lp(4)
- bpf-helpers(7)
- epoll(7)
- proc_sys_dev(5)
- namespaces(7)
- proc_sysrq-trigger(5)
- proc_bus(5)
- cp1251(7)
- proc_pid_maps(5)
- proc_sys_vm(5)
- proc_pid_projid_map(5)
- st(4)
- proc_pid(5)
- issue(5)
- pid_namespaces(7)
- unicode(7)
- inode(7)
- hosts.equiv(5)
- iso-8859-13(7)
- proc_fb(5)
- proc_modules(5)
- proc_pid_autogroup(5)
- keyrings(7)
- sysvipc(7)
- proc_kmsg(5)
- cgroups(7)
- latin6(7)
- proc_pid_uid_map(5)
- unix(7)
- proc_pid_io(5)
- pts(4)
- packet(7)
- ld-linux.so(8)
- tzselect(8)
- iconv(1)
- proc_pid_syscall(5)
- proc_pid_net(5)
- proc_pid_pagemap(5)
- tty(4)
- proc_profile(5)
- standards(7)
- proc_pid_mounts(5)
- filesystems(5)
- iso-8859-15(7)
- locale(5)
- iso_8859_3(7)
- xattr(7)
- iso-8859-2(7)
- proc_uptime(5)
- persistent-keyring(7)
- credentials(7)
- proc_pid_timers(5)
- utmpx(5)
- vcsa(4)
- proc_pid_exe(5)
- proc_net(5)
- proc_timer_stats(5)
- ip(7)
- proc_pid_fd(5)
- ptmx(4)
- user_namespaces(7)
- resolv.conf(5)
- url(7)
- iso_8859_5(7)
- iso_8859-8(7)
- urn(7)
- process-keyring(7)
- proc_pid_auxv(5)
- proc_ksyms(5)
- proc_ide(5)
- veth(4)
- ldd(1)
- proc_swaps(5)
- landlock(7)
- proc_vmstat(5)
- system_data_types(7)
- cp1252(7)
- lirc(4)
- proc_kpageflags(5)
- random(7)
- precedence(7)
- cpuset(7)
- proc_pid_ns(5)
- acct(5)
- latin4(7)
- proc_pid_cgroup(5)
- proc_cpuinfo(5)
- iso_8859-2(7)
- proc_keys(5)
- charsets(7)
- pldd(1)
- proc_pid_stat(5)
- rtnetlink(7)
- netlink(7)
- ram(4)
- mem(4)
- iso-8859-6(7)
- proc_key-users(5)
- iso_8859_15(7)
- fanotify(7)
- proc_sys_net(5)
- sysfs(5)
- math_error(7)
- latin1(7)
- proc_pid_root(5)
- nptl(7)
- proc_cgroups(5)
- proc_iomem(5)
- proc_pid_statm(5)
- sem_overview(7)
- hier(7)
- full(4)
- proc_pid_status(5)
- proc_pid_cwd(5)
- proc_pid_cpuset(5)
- proc_scsi(5)
- uri(7)
- proc_diskstats(5)
- iso_8859_6(7)
- latin2(7)
- latin5(7)
- man-pages(7)
- ld.so(8)
- uts_namespaces(7)
- proc_pid_mountstats(5)
- intro(3)
- proc_pid_seccomp(5)
- proc_pid_wchan(5)
- attributes(7)
- symlink(7)
- mount_namespaces(7)
- charmap(5)
- tis-620(7)
- iso-8859-10(7)
- getent(1)
- proc_buddyinfo(5)
- ttytype(5)
- rtc(4)
- proc_malloc(5)
- suffixes(7)
- sln(8)
- signal(7)
- proc_sys_abi(5)
- signal-safety(7)
- time_namespaces(7)
- proc_pid_comm(5)
- raw(7)
- gai.conf(5)
- proc_crypto(5)
- locale(1)
- iso-8859-3(7)
- motd(5)
- proc_meminfo(5)
- iso-8859-8(7)
- protocols(5)
- proc_pid_map_files(5)
- pthreads(7)
- null(4)
- proc(5)
- zdump(8)
- socket(7)
- proc_sys_kernel(5)
- ddp(7)
- memusagestat(1)
- hd(4)
- iso-8859-14(7)
- shells(5)
- pipe(7)
- glob(7)
- proc_self(5)
- network_namespaces(7)
- utmp(5)
- proc_kcore(5)
- nsswitch.conf(5)
- sd(4)
- iso-8859-5(7)
- iso_8859_16(7)
- man(7)
- iso_8859-6(7)
- dir_colors(5)
- mq_overview(7)
- vsock(7)
- ascii(7)
- thread-keyring(7)
- fs(5)
- proc_pid_attr(5)
- proc_sys_debug(5)
- proc_sys(5)
- proc_pid_cmdline(5)
- pty(7)
- services(5)
- cgroup_namespaces(7)
- securetty(5)
- netdevice(7)
- iso_8859_13(7)
- host.conf(5)
- proc_pid_setgroups(5)
- proc_slabinfo(5)
- sock_diag(7)
- iso_8859-14(7)
- iso-8859-11(7)
- iso_8859_11(7)
- operator(7)
- regex(7)
- wavelan(4)
- proc_sys_fs(5)
- nologin(5)
- proc_pci(5)
- koi8-r(7)
- erofs(5)
- intro(2)
- utf8(7)
- proc_kallsyms(5)
- proc_sysvipc(5)
- queue(7)
- proc_sys_sunrpc(5)
- intro(5)
- latin8(7)
- mtrace(1)
- ipc_namespaces(7)
- dsp56k(4)
- iso_8859_4(7)
- proc_pid_smaps(5)
- proc_cmdline(5)
- rpc(5)
- proc_tty(5)
- proc_version(5)
- smartpqi(4)
- proc_pid_timerslack_ns(5)
- aio(7)
- session-keyring(7)
- resolver(5)
- slabinfo(5)
- wtmp(5)
- iso_8859_9(7)
- proc_locks(5)
- mailaddr(7)
- proc_pid_oom_score(5)
- kmem(4)
- iconvconfig(8)
- iso_8859-7(7)
- glibc(7)
- hostname(7)
- proc_thread-self(5)
- ipv6(7)
- iso_8859_7(7)
- proc_kpagecgroup(5)
- core(5)
- time(7)
- units(7)
- proc_dma(5)
- loop(4)
- address_families(7)
- zero(4)
- intro(4)
- procfs(5)
- iso_8859-4(7)
- vdso(7)
- tmpfs(5)
- iso-8859-16(7)
- iso_8859_10(7)
- user-session-keyring(7)
- libc(7)
- proc_fs(5)
- koi8-u(7)
- latin3(7)
- proc_tid_children(5)
- proc_pid_limits(5)
- proc_pid_coredump_filter(5)
- iso_8859-15(7)
- arp(7)
- urandom(4)
- iso_8859-10(7)
- hpsa(4)
- proc_pid_environ(5)
- boot(7)
- ftm(7)
- ld-linux(8)
- proc_driver(5)
- loop-control(4)
- iso_8859-16(7)
- proc_filesystems(5)
- tzfile(5)
- sprof(1)
- proc_pid_task(5)
- proc_pid_oom_score_adj(5)
- proc_mounts(5)
- iso-8859-4(7)
- iso_8859-1(7)
- utf-8(7)
- iso_8859-13(7)
- intro(6)
- proc_timer_list(5)
- rtld-audit(7)
- iso_8859-3(7)
- group(5)
- sched(7)
- proc_pid_clear_refs(5)
- hosts(5)
- iso_8859-11(7)
- numa(7)
- iso_8859_2(7)
- locale(7)
- iso-8859-1(7)
- fuse(4)
- proc_tid(5)
- proc_execdomains(5)
- proc_pid_mountinfo(5)
- intro(8)
- iso_8859_8(7)
- proc_loadavg(5)
- proc_pid_oom_adj(5)
- re_format(7)
- iso_8859_14(7)
- zic(8)
- bootparam(7)
- inotify(7)
- posixoptions(7)
- proc_partitions(5)
- iso-8859-9(7)
- proc_pid_mem(5)
- networks(5)
- proc_sys_user(5)
- udp(7)
- proc_zoneinfo(5)
- latin10(7)
- proc_pid_fdinfo(5)
- proc_pid_stack(5)
- memusage(1)
- spufs(7)
- pkeys(7)
- path_resolution(7)
- proc_ioports(5)
- intro(1)
- ldconfig(8)
- msr(4)
- svipc(7)
- port(4)
- proc_pid_personality(5)
- cciss(4)
- latin9(7)
- capabilities(7)
- localedef(1)
- vcs(4)
- iso_8859-5(7)
- elf(5)
- proc_sys_proc(5)
- console_codes(4)
- random(4)
- iso-8859-7(7)
- termcap(5)
- cpuid(4)
- environ(7)
- string_copying(7)
- proc_pid_gid_map(5)
- queue(3)
- termio(7)
- user-keyring(7)
- complex(7)
- latin7(7)
- proc_config.gz(5)
- udplite(7)
- kernel_lockdown(7)
- proc_devices(5)
- proc_apm(5)
- iso_8859_1(7)
- proc_pid_numa_maps(5)
apt-get install manpages
Available languages:
en fr sv deManual
mount_namespaces
BEZEICHNUNGBESCHREIBUNG
GEMEINSAME UNTERBĂUME
Beispiel fĂŒr MS_SHARED und MS_PRIVATE
MS_SLAVE-Beispiel
MS_UNBINDABLE-Beispiel
Weiterleitungstyp-ĂbergĂ€nge
Semantik von Bind (MS_BIND)
Semantik von Move (MS_MOVE)
EinhÀnge-Semantik
AushÀnge-Semantik
Die /proc/-PID-/mountinfo-Markierung propagate_from
STANDARDS
GESCHICHTE
ANMERKUNGEN
BeschrĂ€nkungen fĂŒr EinhĂ€ngenamensrĂ€ume
BEISPIELE
SIEHE AUCH
ĂBERSETZUNG
BEZEICHNUNG
mount_namespaces - Ăberblick ĂŒber Linux-EinhĂ€nge-NamensrĂ€ume
BESCHREIBUNG
FĂŒr einen Ăberblick ĂŒber NamensrĂ€ume, siehe namespaces (7).
EinhÀngenamensrÀume ermöglichen es, die Listen der von Prozessen in jeder Namensrauminstanz gesehenen EinhÀngungen voneinander zu isolieren. Daher wird jeder Prozess in jeder der EinhÀnge-Namensrauminstanzen eine individuelle Einzelverzeichnis-Hierarchie sehen.
Die von den Dateien /proc/ PID /mounts , /proc/ PID /mountinfo und /proc/ PID /mountstats (alle In proc (5) beschrieben) bereitgestellten Ansichten entsprechen den EinhÀngenamensrÀumen, in denen sich der Prozess mit der PID PID befindet. (Alle Prozesse, die sich in dem gleichen EinhÀngenamensraum befinden, werden die gleiche Ansicht auf diese Dateien sehen.)
Ein neuer EinhÀngenamensraum wird entweder mittels clone (2) oder mittels unshare (2) mit dem Schalter CLONE_NEWNS erstellt. Wenn ein neuer EinhÀngenamensraum erstellt wird, wird seine EinhÀngeliste wie folgt initialisiert:
|
âą |
Falls der Namensraum mittels clone (2) erstellt wurde, ist die EinhÀngeliste des Nachfolgenamensraums eine Kopie der EinhÀngeliste des Namensraums des Elternprozesses. |
||
|
âą |
Falls der Namensraum mittels unshare (2) erstellt wurde, ist die EinhÀngeliste des neuen Namensraums eine Kopie der EinhÀngeliste in dem vorherigen Namensraum des aufrufenden Prozesses. |
Nachfolgende Ănderungen an der EinhĂ€ngeliste ( mount (2) und umount (2)) in jedem der NamensrĂ€ume wird (standardmĂ€Ăig) die EinhĂ€ngeliste, die in den anderen NamensrĂ€umen gesehen wird, nicht betreffen (lesen Sie allerdings auch die nachfolgende Diskussion von gemeinsamen UnterbĂ€umen).
GEMEINSAME UNTERBĂUME
Nachdem die Implementierung von EinhĂ€ngenamensrĂ€umen abgeschlossen war, zeigte die Erfahrung, dass die bereitgestellte Isolierung in einigen FĂ€llen zu weit ging. Um beispielsweise eine frisch geladene optische Platte in allen EinhĂ€ngenamensrĂ€umen zur VerfĂŒgung zu stellen, war in jedem der NamensrĂ€ume eine EinhĂ€ngeaktion notwendig. FĂŒr diesen und andere AnwendungsfĂ€lle wurde die FunktionalitĂ€t gemeinsamer UnterbĂ€ume in Linux 2.6.15 eingefĂŒhrt. Diese FunktionalitĂ€t erlaubt die automatische, kontrollierte Weiterleitung von mount (2)- und umount (2)- Ereignissen zwischen NamensrĂ€umen (oder genauer, zwischen EinhĂ€ngungen, die Mitglied einer Gemeinschaftsgruppe sind, die Ereignisse aneinander weiterleiten).
Jede
EinhÀngung wird (mittels
mount
(2)) markiert,
dass sie eine der folgenden
Weiterleitungstypen
hat:
MS_SHARED
Diese EinhÀngung nutzt Ereignisse mit Mitgliedern der Gemeinschaftsgruppe gemeinsam. mount (2)- und umount (2)-Ereignisse direkt unterhalb dieser EinhÀngung werden zu den anderen EinhÀngungen, die Mitglied dieser Gemeinschaftsgruppe sind, weitergeleitet. Weiterleitung bedeutet hier, dass der gleiche mount (2) oder umount (2) unter allen diesen EinhÀngungen in der Gemeinschaftsgruppe automatisch erfolgen wird. Entsprechend werden mount (2)- und umount (2)-Ereignisse, die unter anderen EinhÀngungen der Gruppe stattfinden, zu dieser EinhÀngung weitergeleitet.
MS_PRIVATE
Diese EinhÀngung ist privat; sie ist in keiner Gemeinschaftsgruppe. mount (2)- und umount (2)-Ereignisse werden nicht aus dieser EinhÀngung heraus oder in sie hinein weitergeleitet.
MS_SLAVE
mount (2)- und umount (2)-Ereignisse werden in diese EinhĂ€ngung von einer ĂŒbergeordneten (Master-) Gemeinschaftsgruppe weitergeleitet. mount (2)- und umount (2)-Ereignisse unterhalb dieser EinhĂ€ngung werden nicht zu anderen Mitgliedern der Gruppe weitergeleitet.
Beachten Sie, dass eine EinhÀngung eine AbhÀngige von einer anderen Gemeinschaftsgruppe sein kann und gleichzeitig ein Mitglied in einer zweiten Gemeinschaftsgruppe sein kann, an die und von der sie mount (2)- und umount (2)-Ereignisse sendet bzw. empfÀngt. (Genauer gesagt kann eine Gemeinschaftsgruppe eine AbhÀngige einer anderen Gemeinschaftsgruppe sein).
MS_UNBINDABLE
Dies ist wie eine private EinhÀngung und zusÀtzlich kann diese EinhÀngung nicht mit der Option bind erfolgen. Wird versucht, diese EinhÀngung mit der Option bind einzuhÀngen ( mount (2) mit dem Schalter MS_BIND ), dann schlÀgt dies fehl.
Wenn eine rekursive EinhÀngung mit der Option bind ( mount (2) mit den Schaltern MS_BIND und MS_REC ) auf einem Verzeichnisunterbaum erfolgt, werden alle EinhÀngungen mit der Option bind innerhalb des Unterbaums automatisch abgeschnitten (d.h. nicht repliziert), wenn der Unterbaum repliziert wird, um den Ziel-Unterbaum zu erstellen.
Bitte lesen Sie die HINWEISE fĂŒr eine Diskussion der Weiterleitungstypen, die einer neuen EinhĂ€ngung zugeordnet sind.
Der Weiterleitungstyp ist eine einhÀngungsbezogene Einstellung: einige EinhÀngungen könnten als gemeinsam gekennzeichnet sein (wobei jede gemeinsame EinhÀngung ein Mitglied einer unterschiedlichen Gemeinschaftsgruppe ist), wÀhrend andere privat (oder abhÀngig oder nicht-bind-fÀhig) sind.
Beachten Sie, dass der Weiterleitungstyp einer EinhĂ€ngung bestimmt, ob mount (2)- und umount (2) von EinhĂ€ngungen direkt unter der EinhĂ€ngung weitergeleitet werden. Daher betrifft der EinhĂ€ngungstyp nicht die Weiterleitung von Ereignissen fĂŒr weiter unten liegende EinhĂ€ngungen. Was passiert, wenn die EinhĂ€ngung selbst ausgehĂ€ngt wird, wird durch den Weiterleitungstyp bestimmt, der fĂŒr die ĂŒbergeordnete EinhĂ€ngung wirksam ist.
Mitglieder werden zu einer Gemeinschaftsgruppe hinzugefĂŒgt, wenn eine EinhĂ€ngung als gemeinsam markiert ist und entweder:
|
(a) |
die EinhÀngung wÀhrend der Erstellung eines neuen EinhÀngenamensraumes repliziert wird; oder |
||
|
(b) |
eine neue EinhÀngung mit der Option bind von dieser EinhÀngung erstellt wird. |
In beiden FÀllen tritt die neue EinhÀngung der Gemeinschaftsgruppe bei, bei der die bestehende EinhÀngung bereits Mitglied ist.
Eine neue Gemeinschaftsgruppe wird auch erstellt, wenn eine nachfolgende EinhĂ€ngung unter einer bestehenden EinhĂ€ngung, die als gemeinsam markiert ist, erstellt wird. In diesem Fall wird die nachfolgende EinhĂ€ngung als gemeinsam markiert und die entstehende Gemeinschaftsgruppe besteht aus allen EinhĂ€ngungen, die unterhalb der Mitglieder der ĂŒbergeordneten EinhĂ€ngung repliziert werden.
Eine EinhÀngung hört auf, Mitglied einer Gemeinschaftsgruppe zu sein, wenn die EinhÀngung entweder explizit ausgehÀngt wird oder wenn die EinhÀngung implizit ausgehÀngt wird, da der EinhÀngenamensraum entfernt wird (da er keinen Mitgliedsprozess mehr hat).
Der
Weiterleitungstyp der EinhÀngungen in einem
EinhÀngenamensraum kann mittels der »optionalen
Felder« in
/proc/
PID
/mountinfo
offengelegt werden. (Siehe
proc
(5) fĂŒr Details
zu dieser Datei.) Die folgenden Markierungen können in
den optionalen Feldern fĂŒr einen Datensatz in dieser
Datei auftauchen:
shared:X
Diese EinhÀngung wird in der Gemeinschaftsgruppe X gemeinsam benutzt. Jede Gemeinschaftsgruppe hat eine eindeutige Kennung, die durch den Kernel automatisch erstellt wird. Alle EinhÀngungen in der gleichen Gemeinschaftsgruppe werden die gleiche Kennung zeigen. (Diese Kennungen werden beginnend mit dem Wert 1 zugewiesen und können wiederbenutzt werden, wenn eine Gemeinschaftsgruppe keine Mitglieder mehr hat.)
master:X
Diese EinhÀngung ist eine AbhÀngige der gemeinsamen Gemeinschaftsgruppe X .
propagate_from:X (seit Linux 2.6.26)
Diese EinhÀngung ist eine AbhÀngige und empfÀngt Weiterleitungen von der gemeinsamen Gemeinschaftsgruppe X . Diese Markierung wird immer zusammen mit einer Markierung master:X auftauchen. Hier ist X die naheliegendste dominante Gemeinschaftsgruppe unter dem Wurzelverzeichnis des Prozesses. Falls X der direkte Master der EinhÀngung ist oder falls es keine dominante Gemeinschaftsgruppe unterhalb der gleichen Wurzel gibt, dann ist nur das Feld master:X und nicht das Feld propagate_from:X vorhanden. Weitere Details folgen weiter unten.
unbindable
Dies ist eine nicht-bind-fÀhige EinhÀngung.
Falls keine der obigen Markierungen vorhanden ist, dann ist dies eine private EinhÀngung.
Beispiel fĂŒr MS_SHARED und MS_PRIVATE
Nehmen wir an, dass wir im Terminal des anfÀnglichen EinhÀngenamensraums eine EinhÀngung als gemeinsam und eine andere als privat markieren, und uns dann die EinhÀngungen in /proc/self/mountinfo anschauen:
sh1#
mount
--make-shared /mntS
sh1#
mount --make-private /mntP
sh1#
cat /proc/self/mountinfo | grep '/mnt' | sed 's/ -
.*//'
77 61 8:17 / /mntS rw,relatime shared:1
83 61 8:15 / /mntP rw,relatime
In der Ausgabe in /proc/self/mountinfo können wir sehen, dass /mntS eine gemeinsame EinhĂ€ngung in der Gemeinschaftsgruppe 1 ist und dass /mntP keine optionalen Markierungen hat und damit anzeigt, dass es eine private EInhĂ€ngung ist. Die ersten zwei Felder in jedem Datensatz in dieser Datei sind die eindeutige Kennung fĂŒr diese EinhĂ€ngung und die EinhĂ€ngungskennung der ElterneinhĂ€ngung. Wir können diese Datei weiter untersuchen, um zu sehen, dass die ElterneinhĂ€ngung von /mntS und /mntP das Wurzelverzeichnis / ist, das privat eingehĂ€ngt wurde:
sh1#
cat
/proc/self/mountinfo | awk '$1 == 61' | sed 's/ - .*//'
61 0 8:2 / / rw,relatime
In einem zweiten Terminal erstellen wir einen neuen EinhĂ€ngenamensraum, in dem wir eine zweite Shell ausfĂŒhren und die EinhĂ€ngungen untersuchen:
$
PS1='sh2#
' sudo unshare -m --propagation unchanged sh
sh2#
cat /proc/self/mountinfo | grep '/mnt' | sed 's/ -
.*//'
222 145 8:17 / /mntS rw,relatime shared:1
225 145 8:15 / /mntP rw,relatime
Der neue EinhĂ€ngenamensraum erhielt eine Kopie der EinhĂ€ngungen des anfĂ€nglichen EinhĂ€ngenamensraumes. Diese neuen EinhĂ€ngungen behalten die gleichen Weiterleitungstypen bei, haben aber eindeutige EinhĂ€ngekennungen. (Die Option --propagation unchanged verhindert, dass unshare (1) alle EinhĂ€ngungen als privat markiert, wenn ein neuer EinhĂ€ngenamensraum erstellt wird, wie er es sonst standardmĂ€Ăig machen wĂŒrde.)
In dem zweiten Terminal erstellen wir jetzt UntereinhÀngungen unter sowohl /mntS als auch /mntP und untersuchen das Ergebnis:
sh2#
mkdir
/mntS/a
sh2#
mount /dev/sdb6 /mntS/a
sh2#
mkdir /mntP/b
sh2#
mount /dev/sdb7 /mntP/b
sh2#
cat /proc/self/mountinfo | grep '/mnt' | sed 's/ -
.*//'
222 145 8:17 / /mntS rw,relatime shared:1
225 145 8:15 / /mntP rw,relatime
178 222 8:22 / /mntS/a rw,relatime shared:2
230 225 8:23 / /mntP/b rw,relatime
In obiger Ausgabe kann erkannt werden, dass /mntS/a als gemeinsame EinhĂ€ngung (die Einstellung wurde von der ElterneinhĂ€ngung ĂŒbernommen) und /mntP/b als private EinhĂ€ngung erstellt wurde.
Wird zum ersten Terminal zurĂŒckgekehrt und das Ergebnis untersucht, können wir sehen, dass die neue EinhĂ€ngung, die unterhalb der gemeinsamen EinhĂ€ngung /mntS erstellt wurde, an die EinhĂ€ngungen in seiner Gemeinschaftsgruppe weitergeleitet wurde (im anfĂ€nglichen EinhĂ€ngenamensraum), aber die EinhĂ€ngung, die unter der privaten EinhĂ€ngung /mntP erstellt wurde, nicht weitergeleitet wurde:
sh1#
cat
/proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
77 61 8:17 / /mntS rw,relatime shared:1
83 61 8:15 / /mntP rw,relatime
179 77 8:22 / /mntS/a rw,relatime shared:2
MS_SLAVE-Beispiel
Wird eine EinhĂ€ngung eine AbhĂ€ngige, ist es möglich, weitergeleitete mount (2)- und umount (2)-Ereignisse von einer gemeinsamen Master-Gemeinschaftsgruppe zu erhalten und zugleich sie daran zu hindern, Ereignisse zu diesem Master weiterzuleiten. Dies ist nĂŒtzlich, wenn Sie (beispielsweise) ein EinhĂ€ngeereignis erhalten möchten, wenn eine optische Platte in der gemeinsamen Gemeinschaftsgruppe des Masters eingehĂ€ngt wird (in einem anderen EinhĂ€ngenamensraum), aber Sie verhindern möchten, dass mount (2)- und umount (2)-Ereignisse unter der EinhĂ€ngung der AbhĂ€ngigen zu Seiteneffekten in anderen NamensrĂ€umen fĂŒhren.
Wir zeigen die Auswirkung der AbhÀngigen, indem wir zuerst zwei EinhÀngungen als gemeinsam im anfÀnglichen Namensraum markieren:
sh1#
mount
--make-shared /mntX
sh1#
mount --make-shared /mntY
sh1#
cat /proc/self/mountinfo | grep '/mnt' | sed 's/ -
.*//'
132 83 8:23 / /mntX rw,relatime shared:1
133 83 8:22 / /mntY rw,relatime shared:2
Auf einem zweiten Terminal erstellen wir einen neuen EinhÀngenamensraum und untersuchen die EinhÀngungen:
sh2#
unshare
-m --propagation unchanged sh
sh2#
cat /proc/self/mountinfo | grep '/mnt' | sed 's/ -
.*//'
168 167 8:23 / /mntX rw,relatime shared:1
169 167 8:22 / /mntY rw,relatime shared:2
In dem neuen EinhÀngenamensraum können wir eine EinhÀngung als AbhÀngige markieren:
sh2#
mount
--make-slave /mntY
sh2#
cat /proc/self/mountinfo | grep '/mnt' | sed 's/ -
.*//'
168 167 8:23 / /mntX rw,relatime shared:1
169 167 8:22 / /mntY rw,relatime master:2
Aus der obigen Ausgabe kann gesehen werden, dass /mntY jetzt eine abhÀngige EinhÀngung ist, die Weiterleitungsereignisse von der gemeinsamen Gemeinschaftsgruppe mit der Kennung 2 erhÀlt.
Im neuen Namensraum wird jetzt fortgefahren und UntereinhÀngungen unter sowohl /mntX als auch /mntY erstellt:
sh2#
mkdir
/mntX/a
sh2#
mount /dev/sda3 /mntX/a
sh2#
mkdir /mntY/b
sh2#
mount /dev/sda5 /mntY/b
Wenn wir den Zustand der EinhÀngungen in den neuen EinhÀngenamensrÀumen untersuchen, sehen wir, dass /mntX/a als eine neue gemeinsame EinhÀngung erstellt wurde (die die Einstellung »shared« ihrer ElterneinhÀngung geerbt hat) und dass /mntY/b als eine private EinhÀngung erstellt wurde:
sh2#
cat
/proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
168 167 8:23 / /mntX rw,relatime shared:1
169 167 8:22 / /mntY rw,relatime master:2
173 168 8:3 / /mntX/a rw,relatime shared:3
175 169 8:5 / /mntY/b rw,relatime
ZurĂŒck im ersten Terminal (im anfĂ€nglichen EinhĂ€ngenamensraum) sehen wir, dass die EinhĂ€ngung /mntX/a zu dem Mitglied der Gemeinschaftsgruppe weitergeleitet wurde (der gemeinsame /mntX ), aber dass die EinhĂ€ngung /mntY/b nicht weitergeleitet wurde:
sh1#
cat
/proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
132 83 8:23 / /mntX rw,relatime shared:1
133 83 8:22 / /mntY rw,relatime shared:2
174 132 8:3 / /mntX/a rw,relatime shared:3
Jetzt erstellen wir eine neue EinhÀngung unter /mntY in der ersten Shell:
sh1#
mkdir
/mntY/c
sh1#
mount /dev/sda1 /mntY/c
sh1#
cat /proc/self/mountinfo | grep '/mnt' | sed 's/ -
.*//'
132 83 8:23 / /mntX rw,relatime shared:1
133 83 8:22 / /mntY rw,relatime shared:2
174 132 8:3 / /mntX/a rw,relatime shared:3
178 133 8:1 / /mntY/c rw,relatime shared:4
Wenn wir die EinhÀngungen in dem zweiten EinhÀngenamensraum untersuchen, sehen wir, dass in diesem Fall die EinhÀngung zu der abhÀngigen EinhÀngung weitergeleitet wurde und dass die neue EinhÀngung selbst eine AbhÀngige ist (von der Gemeinschaftsgruppe 4):
sh2#
cat
/proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
168 167 8:23 / /mntX rw,relatime shared:1
169 167 8:22 / /mntY rw,relatime master:2
173 168 8:3 / /mntX/a rw,relatime shared:3
175 169 8:5 / /mntY/b rw,relatime
179 169 8:1 / /mntY/c rw,relatime master:4
MS_UNBINDABLE-Beispiel
Einer der Hauptzwecke der nicht-bindfĂ€higen EinhĂ€ngungen ist die Vermeidung des Problems der »EinhĂ€ngeexplosionen«, bei der wiederholt durchgefĂŒhrte EinhĂ€ngungen mit der Option bind eines Unterbaums auf einer höheren Ebene in einer EinhĂ€ngung auf niedrigeren Ebene ausgefĂŒhrt werden. Das Problem wird in der nachfolgenden Shell-Sitzung dargestellt.
Nehmen wir an, wir haben ein System mit folgenden EinhÀngungen:
#
mount |
awk '{print $1, $2, $3}'
/dev/sda1 on /
/dev/sdb6 on /mntX
/dev/sdb7 on /mntY
Nehmen wir weiterhin an, dass wir das Wurzelverzeichnis rekursiv unter den Home-Verzeichnissen verschiedener Benutzer mit der Option bind einhĂ€ngen möchten. Wir machen dies fĂŒr den ersten Benutzer und untersuchen die EinhĂ€ngungen:
#
mount
--rbind / /home/cecilia/
#
mount | awk '{print $1, $2, $3}'
/dev/sda1 on /
/dev/sdb6 on /mntX
/dev/sdb7 on /mntY
/dev/sda1 on /home/cecilia
/dev/sdb6 on /home/cecilia/mntX
/dev/sdb7 on /home/cecilia/mntY
Wenn wir diese Aktion fĂŒr den zweiten Benutzer wiederholen, beginnen wir, das Explosionsproblem zu sehen:
#
mount
--rbind / /home/henry
#
mount | awk '{print $1, $2, $3}'
/dev/sda1 on /
/dev/sdb6 on /mntX
/dev/sdb7 on /mntY
/dev/sda1 on /home/cecilia
/dev/sdb6 on /home/cecilia/mntX
/dev/sdb7 on /home/cecilia/mntY
/dev/sda1 on /home/henry
/dev/sdb6 on /home/henry/mntX
/dev/sdb7 on /home/henry/mntY
/dev/sda1 on /home/henry/home/cecilia
/dev/sdb6 on /home/henry/home/cecilia/mntX
/dev/sdb7 on /home/henry/home/cecilia/mntY
Unter /home/henry haben wir nicht nur die EinhĂ€ngungen /mntX und /mntY rekursiv hinzugefĂŒgt, sondern auch die rekursiven EinhĂ€ngungen dieser Verzeichnisse unter /home/cecilia , die im vorherigen Schritt erstellt wurden. Bei der Wiederholung dieses Schrittes fĂŒr einen dritten Benutzer wird es offensichtlich, dass die Explosion von exponentieller Natur ist:
#
mount
--rbind / /home/otto
#
mount | awk '{print $1, $2, $3}'
/dev/sda1 on /
/dev/sdb6 on /mntX
/dev/sdb7 on /mntY
/dev/sda1 on /home/cecilia
/dev/sdb6 on /home/cecilia/mntX
/dev/sdb7 on /home/cecilia/mntY
/dev/sda1 on /home/henry
/dev/sdb6 on /home/henry/mntX
/dev/sdb7 on /home/henry/mntY
/dev/sda1 on /home/henry/home/cecilia
/dev/sdb6 on /home/henry/home/cecilia/mntX
/dev/sdb7 on /home/henry/home/cecilia/mntY
/dev/sda1 on /home/otto
/dev/sdb6 on /home/otto/mntX
/dev/sdb7 on /home/otto/mntY
/dev/sda1 on /home/otto/home/cecilia
/dev/sdb6 on /home/otto/home/cecilia/mntX
/dev/sdb7 on /home/otto/home/cecilia/mntY
/dev/sda1 on /home/otto/home/henry
/dev/sdb6 on /home/otto/home/henry/mntX
/dev/sdb7 on /home/otto/home/henry/mntY
/dev/sda1 on /home/otto/home/henry/home/cecilia
/dev/sdb6 on /home/otto/home/henry/home/cecilia/mntX
/dev/sdb7 on /home/otto/home/henry/home/cecilia/mntY
Das EinhĂ€nge-Explosionsproblem im obigen Szenario kann vermieden werden, indem jede der neuen EinhĂ€ngungen nicht-bindfĂ€hig gemacht wird. Die Auswirkung ist, dass rekursive EinhĂ€ngungen des Wurzelverzeichnisses sich nicht bei nicht-bindfĂ€higen EinhĂ€ngungen replizieren werden. Wir machen eine solche EinhĂ€ngung fĂŒr den ersten Benutzer:
# mount --rbind --make-unbindable / /home/cecilia
Bevor wir fortfahren, zeigen wir, dass die nicht-bindfÀhigen EinhÀngungen in der Tat nicht bindfÀhig sind:
#
mkdir
/mntZ
#
mount --bind /home/cecilia /mntZ
mount: wrong fs type, bad option, bad superblock on
/home/cecilia,
missing codepage or helper program, or other error
In einigen FÀllen könnnen in Syslog hilfreiche
Informationen gefunden
werden - versuchen Sie »dmesg | tail« oder
so.
Jetzt erstellen wir nicht bindfĂ€hige rekursive EinhĂ€ngungen mit der Option bind fĂŒr die anderen zwei Benutzer:
#
mount
--rbind --make-unbindable / /home/henry
#
mount --rbind --make-unbindable / /home/otto
Bei der Untersuchung der Liste der EinhÀngungen sehen wir, dass es keine Explosion der EinhÀngungen gab, da die nicht bindfÀhigen EinhÀngungen nicht unter den Verzeichnissen der jeweiligen Benutzer repliziert wurden:
#
mount |
awk '{print $1, $2, $3}'
/dev/sda1 on /
/dev/sdb6 on /mntX
/dev/sdb7 on /mntY
/dev/sda1 on /home/cecilia
/dev/sdb6 on /home/cecilia/mntX
/dev/sdb7 on /home/cecilia/mntY
/dev/sda1 on /home/henry
/dev/sdb6 on /home/henry/mntX
/dev/sdb7 on /home/henry/mntY
/dev/sda1 on /home/otto
/dev/sdb6 on /home/otto/mntX
/dev/sdb7 on /home/otto/mntY
Weiterleitungstyp-ĂbergĂ€nge
|
Die nachfolgende Tabelle zeigt die Auswirkung, die die Anwendung eines neuen Weiterleitungstyps (d.h. mount --make-xxxx ) auf bestehende Weiterleitungstypen einer EinhĂ€ngung hat. Die Zeilen entsprechen den bestehenden Weiterleitungstypen und die Spalten sind die neuen Weiterleitungseinstellungen. Aus PlatzgrĂŒnden ist »private« (privat) mit »priv« und »unbindable« (nicht bindfĂ€hig) mit »unbind« abgekĂŒrzt. |
Beachten Sie die folgenden Details zu der Tabelle:
|
[1] |
Falls eine gemeinsame EinhÀngung die einzige in ihrer Gemeinschaftsgruppe ist, wird sie als abhÀngige auch automatisch privat. |
||
|
[2] |
AbhÀngig machen einer nicht gemeinsamen EinhÀngung hat keine Auswirkung auf die EinhÀngung. |
Semantik von Bind (MS_BIND)
Nehmen wir an, dass der folgende Befehl ausgefĂŒhrt wird:
mount --bind A/a B/b
Hier ist A die QuelleinhÀngung, B die ZieleinhÀngung, a ist ein Unterverzeichnispfad unter dem EinhÀngungspunkt A und b ist ein Unterverzeichnispfad unter dem EinhÀngungspunkt B . Der Weiterleitungstyp der resultierenden EinhÀngung B/b hÀngt von den Weiterleitungstypen der EinhÀngungen A und B ab und wird in der folgenden Tabelle zusammengefasst.
Beachten Sie, dass ein rekursives Bind eines Unterbaums der gleichen Semantik wie der Bind-Aktion auf jede EinhÀngung im Unterbaum folgt. (Nicht-Bind-fÀhige EinhÀngungen werden automatisch am ZieleinhÀngepunkt abgeschnitten.)
FĂŒr weitere Details siehe Documentation/filesystems/sharedsubtree.rst in dem Kernelquellbaum.
Semantik von Move (MS_MOVE)
Nehmen wir an, dass der folgende Befehl ausgefĂŒhrt wird:
mount --move A B/b
Hier ist A die QuelleinhÀngung, B die ZieleinhÀngung und b ist der Unterverzeichnispfad unter dem EinhÀngepunkt B . Der Weiterleitungstyp der entstehenden EinhÀngung B/b hÀngt von den Weiterleitungstypen der EinhÀngungen A und B ab und wird in der nachfolgenden Tabelle zusammengefasst.
Hinweis: Das Verschieben einer EinhĂ€ngung, die sich unter einer gemeinsamen EinhĂ€ngung befindet, ist ungĂŒltig.
FĂŒr weitere Details siehe Documentation/filesystems/sharedsubtree.rst in dem Kernelquellbaum.
EinhÀnge-Semantik
Angenommen, wir verwenden folgenden Befehl, um eine EinhÀngung zu erstellen:
mount GerÀt B/b
Hier ist B die ZieleinhĂ€ngung und b der Unterverzeichnispfad unter dem EinhĂ€ngepunkt B . Der Weiterleitungstyp der entstehenden EinhĂ€ngung B/b folgt den gleichen Regeln wie fĂŒr eine EinhĂ€ngung mit der Option bind, bei der der Weiterleitungstyp der QuelleinhĂ€ngung immer als privat betrachtet wird.
AushÀnge-Semantik
Angenommen, wir verwenden folgenden Befehl, um eine EinhÀngung aufzulösen:
umount A
Hier ist A eine EinhĂ€ngung auf B/b , wobei B die ElterneinhĂ€ngung und b ein Unterverzeichnispfad unterhalb des EinhĂ€ngepunkts B ist. Falls B gemeinsam ist, dann werden alle kĂŒrzlich eingehĂ€ngten EinhĂ€ngungen ausgehĂ€ngt, die sich bei b befinden, die Weiterleitungen von der EinhĂ€ngung B erhalten und keine UntereinhĂ€ngungen haben.
Die /proc/-PID-/mountinfo-Markierung propagate_from
Die Markierung propagate_from:X wird in den optionalen Feldern des Datensatzes /proc/ PID /mountinfo gezeigt, falls es einen Prozess gibt, der den Master der direkt AbhÀngigen nicht sehen kann (d.h. der Pfadname vom Master ist von dem Dateisystemwurzelverzeichnis aus nicht erreichbar) und so nicht die Weiterleitungskette zwischen EinhÀngungen, die er sehen kann, bestimmen kann.
In dem folgenden Beispiel erstellen wir zuerst eine Kette aus zwei Gliedern zwischen Master und AbhÀngiger, zwischen den EinhÀngungen /mnt , /tmp/etc und /mnt/tmp/etc . Dann wird der Befehl chroot (1) verwandt, um den EinhÀngepunkt /tmp/etc vom Wurzelverzeichnis unerreichbar zu bekommen und damit eine Situation zu erstellen, bei der der Master von /mnt/tmp/etc nicht vom (neuen) Wurzelverzeichnis des Prozesses aus erreichbar ist.
Zuerst machen wir eine EinhÀngung mit der Option bind des Wurzelverzeichnisses auf /mnt und dann eine EinhÀngung mit der Option bind von /proc bei /mnt/proc , so dass nach einem spÀteren chroot (1) das Dateisystem proc (5) an dem korrekten Ort in der Umgebung innerhalb des Chroots sichtbar bleibt.
#
mkdir -p
/mnt/proc
#
mount --bind / /mnt
#
mount --bind /proc /mnt/proc
Als nÀchstes stellen wir sicher, dass die EinhÀngung /mnt eine gemeinsame EinhÀngung in der neuen Gemeinschaftsgruppe (ohne weitere Mitglieder) ist:
#
mount
--make-private /mnt
# Von jeder vorherigen
Gemeinschaftsgruppe isolieren
#
mount --make-shared /mnt
#
cat /proc/self/mountinfo | grep '/mnt' | sed 's/ -
.*//'
239 61 8:2 / /mnt ⊠shared:102
248 239 0:4 / /mnt/proc ⊠shared:5
Als nÀchstes hÀngen wir /mnt/etc auf /tmp/etc mit der Option bind ein:
#
mkdir -p
/tmp/etc
#
mount --bind /mnt/etc /tmp/etc
#
cat /proc/self/mountinfo | egrep '/mnt|/tmp/' | sed 's/
- .*//'
239 61 8:2 / /mnt ⊠shared:102
248 239 0:4 / /mnt/proc ⊠shared:5
267 40 8:2 /etc /tmp/etc ⊠shared:102
AnfÀnglich sind diese zwei EinhÀngungen in der gleichen Gemeinschaftsgruppe, aber dann machen wir /tmp/etc eine AbhÀngige von /mnt/etc , und dann machen wir /tmp/etc auch gemeinsam, so dass es Ereignisse an die nÀchste AbhÀngige in der Kette weiterleiten kann:
#
mount
--make-slave /tmp/etc
#
mount --make-shared /tmp/etc
#
cat /proc/self/mountinfo | egrep '/mnt|/tmp/' | sed 's/
- .*//'
239 61 8:2 / /mnt ⊠shared:102
248 239 0:4 / /mnt/proc ⊠shared:5
267 40 8:2 /etc /tmp/etc ⊠shared:105 master:102
Dann hÀngen wir /tmp/etc auf /mnt/tmp/etc mit der Option bind ein. Wieder sind die zwei EinhÀngungen anfÀnglich in der gleichen Gemeinschaftsgruppe, aber wir machen /mnt/tmp/etc eine AbhÀngige von /tmp/etc :
#
mkdir -p
/mnt/tmp/etc
#
mount --bind /tmp/etc /mnt/tmp/etc
#
mount --make-slave /mnt/tmp/etc
#
cat /proc/self/mountinfo | egrep '/mnt|/tmp/' | sed 's/
- .*//'
239 61 8:2 / /mnt ⊠shared:102
248 239 0:4 / /mnt/proc ⊠shared:5
267 40 8:2 /etc /tmp/etc ⊠shared:105 master:102
273 239 8:2 /etc /mnt/tmp/etc ⊠master:105
In vorhergehender Ausgabe können wir sehen, dass /mnt der Master der AbhÀngigen /tmp/etc ist, die wiederum der Master der AbhÀngigen /mnt/tmp/etc ist.
Dann wechseln wir mit chroot (1) zu dem Verzeichnis /mnt , wodurch die EinhÀngung mit der Kennung 267 vom (neuen) Wurzelverzeichnis aus nicht mehr erreichbar ist:
# chroot /mnt
Wenn wir den Zustand der EinhÀngungen innerhalb der Chroot-Umgebung untersuchen, sehen wir folgendes:
#
cat
/proc/self/mountinfo | sed 's/ - .*//'
239 61 8:2 / / ⊠shared:102
248 239 0:4 / /proc ⊠shared:5
273 239 8:2 /etc /tmp/etc ⊠master:105
propagate_from:102
Oben sehen wir, dass die EinhĂ€ngung mit der Kennung 273 eine AbhĂ€ngige ist, deren Master die Gemeinschaftsgruppe 105 ist. Der EinhĂ€ngepunkt fĂŒr diesen Master kann nicht erreicht werden, und daher wird eine Markierung propagate_from angezeigt, die darauf aufmerksam macht, dass die nahest-liegende dominante Gemeinschaftsgruppe (d.h. der nĂ€chste erreichbare EinhĂ€ngepunkt in der AbhĂ€ngigkeitskette) die Gemeinschaftsgruppe mit der Kennung 102 ist (die dem EinhĂ€ngepunkt /mnt entspricht, bevor der chroot (1) durchgefĂŒhrt wurde.)
STANDARDS
Linux.
GESCHICHTE
Linux 2.4.19.
ANMERKUNGEN
Der einer neuen EinhÀngung zugewiesene Weiterleitungstyp hÀngt vom Weiterleitungstyp der ElterneinhÀngung ab. Falls die EinhÀngung eine ElterneinhÀngung hat (d.h. der EinhÀngungspunkt ist nicht die Wurzel) und der Weiterleitungstyp der ElterneinhÀngung MS_SHARED ist, dann ist der Weiterleitungstyp der neuen EinhÀngung auch MS_SHARED . Andernfalls ist der EinhÀngungstyp der neuen EinhÀngung MS_PRIVATE .
Unbenommen der Tatsache, dass der Standard-Weiterleitungstyp fĂŒr neue EinhĂ€ngungen in vielen FĂ€llen MS_PRIVATE ist, ist MS_SHARED normalerweise nĂŒtzlicher. Aus diesem Grund hĂ€ngt systemd (1) beim Systemstart alle EinhĂ€ngungen neu mit MS_SHARED ein. Daher ist auf modernen Systemen der Standard-Weiterleitungstyp in der Praxis MS_SHARED .
Da bei der Verwendung von unshare (1) typischerweise das Ziel darin besteht, vollstĂ€ndige Isolierung der EinhĂ€ngungen in dem neuen Namensraum zu erreichen, kehrt unshare (1) (seit util-linux 2.27) den durch systemd (1) durchgefĂŒhrten Schritt um, indem es in dem neuen Namensraum alle EinhĂ€ngungen zu privaten macht. Das bedeutet, unshare (1) fĂŒhrt das Ăquivalent des folgenden Befehls im neuen Namensraum aus:
mount --make-rprivate /
Um dies zu verhindern, können Sie die Option --propagation unchanged fĂŒr unshare (1) verwenden.
Eine Anwendung, die einen neuen EinhĂ€ngenamensraum direkt mit clone (2) oder unshare (2) erzeugt, könnte den Wunsch haben, die Weiterleitung von EinhĂ€ngeereignissen in andere EinhĂ€ngenamensrĂ€ume zu verhindern (wie dies durch unshare (1) erfolgt). Dies kann durch Ănderung des EinhĂ€ngetyps von EinhĂ€ngungen in dem neuen Namensraum auf entweder MS_SLAVE oder MS_PRIVATE erfolgen, indem ein Aufruf folgender Art erfolgt:
mount(NULL, "/", MS_SLAVE | MS_REC, NULL);
FĂŒr eine Diskussion von Weiterleitungstypen beim Verschieben von EinhĂ€ngungen ( MS_MOVE ) und der Erstellung von EinhĂ€ngungen mit der Option bind ( MS_BIND ) siehe Documentation/filesystems/sharedsubtree.rst .
BeschrĂ€nkungen fĂŒr EinhĂ€ngenamensrĂ€ume
Beachten Sie die folgenden Punkte in Hinblick auf EinhÀngenamensrÀume:
|
[1] |
Jeder EinhĂ€ngenamensraum hat einen EigentĂŒmer-Benutzernamensraum. Wie oben beschrieben wird beim Erstellen eines neuen EinhĂ€ngenamensraumes seine EinhĂ€ngeliste als Kopie der EinhĂ€ngeliste eines anderen EinhĂ€ngenamensraums initialisiert. Falls der neue Namensraum und der Namensraum, von dem die EinhĂ€ngeliste kopiert wurde, verschiedenen BenutzernamensrĂ€umen gehören, dann wird der neue EinhĂ€ngenamensraum als weniger privilegiert betrachtet. |
||
|
[2] |
Beim Erstellen eines weniger privilegierten EinhÀngenamensraums werden gemeinsame EinhÀngungen zu abhÀngigen EinhÀngungen reduziert. Dies stellt sicher, dass Abbildungen, die in weniger privilegierten NamensrÀumen erfolgen, nicht in mehr privilegierte NamensrÀume weitergeleitet werden. |
||
|
[3] |
EinhĂ€ngungen, die als gemeinsame Einheit von einem mehr privilegierten EinhĂ€ngenamensraum kommen, werden zusammengeklemmt und können in einem weniger privilegierten Namensraum nicht getrennt werden. (Die Aktion unshare (2) CLONE_NEWNS bringt alle EinhĂ€ngungen von dem ursprĂŒnglichen EinhĂ€ngenamensraum als gemeinsame Einheit herĂŒber und rekursive EinhĂ€ngungen, die zwischen EinhĂ€ngenamensrĂ€umen weiterleiten, werden als gemeinsame Einheit weitergeleitet.) |
In diesem Kontext bedeutet »können nicht getrennt werden«, dass die EinhÀngungen zusammengeklemmt sind, so dass sie nicht einzeln ausgehÀngt werden können. Betrachten Sie folgendes Beispiel:
$
sudo
sh
#
mount --bind /dev/null /etc/shadow
#
cat /etc/shadow
# Ergibt keine Ausgabe
Die obigen Schritte, die in einem mehr privilegierten EinhĂ€ngenamensraum ausgefĂŒhrt werden, haben eine EinhĂ€ngung mit der Option bind erstellt, die die Inhalte der Schatten-Passwortdatei /etc/shadow verdeckt. Aus SicherheitsgrĂŒnden sollte es nicht möglich sein, einen umount (2) dieser EinhĂ€ngungen in einem weniger privilegierten EinhĂ€ngenamensraum durchzufĂŒhren, da dies den Inhalt von /etc/shadow offenlegen wĂŒrde.
Nehmen wir an, dass wir einen EinhĂ€ngenamensraum erstellen, der einem neuen Benutzernamensraum gehört. Der neue EinhĂ€ngenamensraum wird Kopien aller EinhĂ€ngungen von dem vorherigen EinhĂ€ngenamensraum erben. Allerdings werden diese EinhĂ€ngungen zusammengeklemmt werden, da der neue EinhĂ€ngenamensraum weniger privilegiert ist. Konsequenterweise wird ein Versuch, einen umount (2) der EinhĂ€ngung durchzufĂŒhren, fehlschlagen, wie dies im folgenden Schritt zu sehen ist:
#
unshare
--user --map-root-user --mount \
strace -o /tmp/log \
umount /mnt/dir
umount: /etc/shadow: nicht eingehÀngt.
#
grep '^umount' /tmp/log
umount2("/etc/shadow", 0) = -1 EINVAL (Invalid
argument)
Die Fehlermeldung von mount (8) irritiert etwas, aber die Ausgabe von strace (1) verrÀt, dass der zugrundeliegende Systemaufruf umount2 (2) mit dem Fehler EINVAL fehlschlug. Der Kernel liefert diesen Fehler, um anzuzeigen, dass die EinhÀngung geklemmt ist.
Beachten Sie allerdings, dass eine EinhÀngung oben auf eine geerbte geklemmte EinhÀngung in einem weniger privilegierten EinhÀngenamensraum aufgesetzt oder von dort wieder entfernt werden kann:
#
echo
'aaaaa' > /tmp/a
# Datei, die auf /etc/shadow
eingehÀngt werden soll
#
unshare --user --map-root-user --mount \
sh -c 'mount --bind /tmp/a /etc/shadow; cat /etc/shadow'
aaaaa
#
umount /etc/shadow
Der abschlieĂende Befehl umount (8) oben, der im anfĂ€nglichen EinhĂ€ngenamensraum durchgefĂŒhrt wird, macht die ursprĂŒngliche Datei /etc/shadow wieder in diesem Namensraum sichtbar.
|
[4] |
Beachten Sie anschlieĂend an Schritt [3], dass es möglich ist, einen umount (2) auf einen gesamten Unterbaum von EinhĂ€ngungen, der als Einheit in einen weniger privilegierten EinhĂ€ngenamensraum weitergeleitet wurde, durchzufĂŒhren. Das wird im nachfolgenden Beispiel dargestellt. |
Zuerst erstellen wir mittels unshare (1) einen neuen Benutzer- und EinhÀngenamensraum. In dem neuen EinhÀngenamensraum wird der Weiterleitungstyp aller EinhÀngungen auf privat gesetzt. Wir erstellen dann eine gemeinsame EinhÀngung mit der Option bind von /mnt und eine kleine Hierarchie von EinhÀngungen unterhalb dieser EinhÀngung.
$
PS1='ns1#
' sudo unshare --user --map-root-user \
--mount --propagation private bash
ns1#
echo $$
# Wir benötigen die PID dieser
Shell spÀter
778501
ns1#
mount --make-shared --bind /mnt /mnt
ns1#
mkdir /mnt/x
ns1#
mount --make-private -t tmpfs none /mnt/x
ns1#
mkdir /mnt/x/y
ns1#
mount --make-private -t tmpfs none /mnt/x/y
ns1#
grep /mnt /proc/self/mountinfo | sed 's/ - .*//'
986 83 8:5 /mnt /mnt rw,relatime shared:344
989 986 0:56 / /mnt/x rw,relatime
990 989 0:57 / /mnt/x/y rw,relatime
In der gleichen Shell-Sitzung fahren wir fort und erstellen eine zweite Shell in einem neuen Benutzernamensraum und einen (weniger privilegierten) EinhĂ€ngenamensraum und prĂŒfen den Zustand der weitergeleiteten EinhĂ€ngungen, deren Wurzel bei /mnt liegt.
ns1#
PS1='ns2# ' unshare --user --map-root-user \
--mount --propagation unchanged bash
ns2#
grep /mnt /proc/self/mountinfo | sed 's/ - .*//'
1239 1204 8:5 /mnt /mnt rw,relatime master:344
1240 1239 0:56 / /mnt/x rw,relatime
1241 1240 0:57 / /mnt/x/y rw,relatime
Bemerkenswert in der obigen Ausgabe ist, dass der Weiterleitungstyp der EinhÀngung /mnt zu einer AbhÀngigen reduziert wurde, wie in Schritt [2] erlÀutert. Das bedeutet, dass UntereinhÀngungsereignisse vom Master in »ns1« weitergeleitet werden, aber Weiterleitungen nicht in die umgekehrte Richtung erfolgen werden.
In einem anderen Terminalfenster verwenden wir nsenter (1), um den EinhÀngungs- und Benutzernamensraum zu betreten, der »ns1« entspricht. In diesem Terminalfenster hÀngen wir mit der Option bind rekursiv /mnt/x am Ort /mnt/ppp ein.
$
PS1='ns3#
' sudo nsenter -t 778501 --user --mount
ns3#
mount --rbind --make-private /mnt/x /mnt/ppp
ns3#
grep /mnt /proc/self/mountinfo | sed 's/ - .*//'
986 83 8:5 /mnt /mnt rw,relatime shared:344
989 986 0:56 / /mnt/x rw,relatime
990 989 0:57 / /mnt/x/y rw,relatime
1242 986 0:56 / /mnt/ppp rw,relatime
1243 1242 0:57 / /mnt/ppp/y rw,relatime shared:518
Da der Weiterleitungstyp der ElterneinhĂ€ngung /mnt gemeinsam war, leitete die rekursive EinhĂ€ngung mit der Option bind einen kleinen Unterbaum von EinhĂ€ngungen unter der abhĂ€ngigen EinhĂ€ngung /mnt nach »ns2« weiter. Dies kann durch AusfĂŒhren der folgenden Befehle in dieser Shell-Sitzung bestĂ€tigt werden:
ns2#
grep
/mnt /proc/self/mountinfo | sed 's/ - .*//'
1239 1204 8:5 /mnt /mnt rw,relatime master:344
1240 1239 0:56 / /mnt/x rw,relatime
1241 1240 0:57 / /mnt/x/y rw,relatime
1244 1239 0:56 / /mnt/ppp rw,relatime
1245 1244 0:57 / /mnt/ppp/y rw,relatime master:518
Es ist zwar nicht möglich, einen umount (2) auf einen Teil des weitergeleiteten Unterbaums ( /mnt/ppp/y ) in »ns2« durchzufĂŒhren, aber es ist möglich, einen umount (2) auf den gesamten Unterbaum durchzufĂŒhren. Dies wird durch die folgenden Befehle gezeigt:
ns2#
umount
/mnt/ppp/y
umount: /mnt/ppp/y: nicht eingehÀngt.
ns2#
umount -l /mnt/ppp | sed 's/ - .*//'
#
ErfolgreichâŠ
ns2#
grep /mnt /proc/self/mountinfo
1239 1204 8:5 /mnt /mnt rw,relatime master:344
1240 1239 0:56 / /mnt/x rw,relatime
1241 1240 0:57 / /mnt/x/y rw,relatime
|
[5] |
Die Schalter MS_RDONLY , MS_NOSUID , MS_NOEXEC von mount (2) und die »atime«-Schalter-Einstellungen ( MS_NOATIME , MS_NODIRATIME , MS_RELATIME ) werden geklemmt, wenn sie von einem mehr privilegierten in einen weniger privilegierten EinhĂ€ngenamensraum weitergeleitet werden und dĂŒrfen in dem weniger privilegierten Namensraum nicht geĂ€ndert werden. |
Dieser Punkt wird im nachfolgenden Beispiel verdeutlicht. Hier erstellen wir in einem mehr privilegierten EinhĂ€ngenamensraum eine EinhĂ€ngung mit der Option bind, die als nur-lesbar markiert ist. Aus SicherheitsgrĂŒnden sollte es nicht möglich sein, die EinhĂ€ngung in einem weniger privilegierten EinhĂ€ngenamensraum schreibbar zu machen und tatsĂ€chlich verhindert der Kernel das:
$
sudo mkdir
/mnt/dir
$
sudo mount --bind -o ro /some/path /mnt/dir
$
sudo unshare --user --map-root-user --mount \
mount -o remount,rw /mnt/dir
mount: /mnt/dir: Zugriff verweigert.
|
[6] |
Eine Datei oder ein Verzeichnis, das ein EinhĂ€ngepunkt in einem Namensraum ist, der kein EinhĂ€ngepunkt in einem anderen Namensraum ist, kann umbenannt, mit der Funktion »unlink« gelöscht oder in dem EinhĂ€ngenamensraum, in dem er kein EinhĂ€ngepunkt ist, gelöscht ( rmdir (2)) werden (abhĂ€ngig von den normalen BerechtigungsprĂŒfungen). Konsequenterweise wird der EinhĂ€ngepunkt in dem EinhĂ€ngenamensraum, in dem er ein EinhĂ€ngepunkt war, entfernt. |
FrĂŒher (vor Linux 3.18) fĂŒhrte der Versuch, eine Datei oder ein Verzeichnis, das ein EinhĂ€ngepunkt in einem anderen Namensraum war, mit »unlink« zu löschen, umzubenennen oder zu entfernen zu dem Fehler EBUSY . Dieses Verhalten hatte technische Probleme bei der Durchsetzung (z.B. fĂŒr NFS) und ermöglichte Diensteverweigerungsangriffe gegen mehr privilegierte Benutzer (d.h. Verhinderung der Aktualisierung einzelner Dateien durch EinhĂ€ngungen mit der Option bind darĂŒber).
BEISPIELE
Siehe pivot_root (2).
SIEHE AUCH
unshare (1), clone (2), mount (2), mount_setattr (2), pivot_root (2), setns (2), umount (2), unshare (2), proc (5), namespaces (7), user_namespaces (7), findmnt (8), mount (8), pam_namespace (8), pivot_root (8), umount (8)
Documentation/filesystems/sharedsubtree.rst im Kernelquellbaum.
ĂBERSETZUNG
Die deutsche Ăbersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> erstellt.
Diese Ăbersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezĂŒglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ĂŒbernommen.
Wenn Sie Fehler in der Ăbersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ăbersetzer: debian-l10n-german@lists.debian.org .