Um diretório existente é necessário como um ponto de montagem .
$ ls
$ sudo mount /dev/sdb2 ./datadisk
mount: mount point ./datadisk does not exist
$ mkdir datadisk
$ sudo mount /dev/sdb2 ./datadisk
$
Acho confuso, pois sobrepõe o conteúdo existente do diretório. Existem dois conteúdos possíveis do diretório do ponto de montagem que podem ser alternados inesperadamente (para um usuário que não está executando a montagem).
Por que não mount
acontece em um diretório recém-criado? É assim que os sistemas operacionais gráficos exibem mídia removível. Ficaria claro se o diretório está montado (existe) ou não está montado (não existe). Tenho certeza de que existe um bom motivo, mas ainda não o descobri.
udisksctl
. Por que usarmount
?better design than Unix!
[citação necessário]Respostas:
Este é um caso de um detalhe de implementação que vazou.
Em um sistema UNIX, todo diretório consiste em uma lista de nomes mapeados para números de inode . Um inode contém metadados que informam ao sistema se é um arquivo, diretório, dispositivo especial, pipe nomeado etc. Se for um arquivo ou diretório, também informa ao sistema onde encontrar o conteúdo do arquivo ou diretório no disco. A maioria dos inodes são arquivos ou diretórios. A
-i
opção parals
listar os números dos inodes.A montagem de um sistema de arquivos pega um inode de diretório e define um sinalizador na cópia em memória do kernel para dizer "na verdade, ao procurar o conteúdo desse diretório, observe esse outro sistema de arquivos" (consulte o slide 10 desta apresentação ). Isso é relativamente fácil, pois altera um único item de dados.
Por que ele não cria uma entrada de diretório para você apontar para o novo inode? Há duas maneiras de implementar isso, ambas com desvantagens. Uma é escrever fisicamente um novo diretório no sistema de arquivos - mas isso falhará se o sistema de arquivos for somente leitura! A outra é adicionar a cada processo de listagem de diretórios uma lista de coisas "extras" que realmente não existem. Isso é complicado e potencialmente gera um pequeno impacto no desempenho em todas as operações de arquivo.
Se você deseja pontos de montagem criados dinamicamente, o
automount
sistema pode fazer isso. Sistemas de arquivos não-disco especiais também podem criar diretórios à vontade, por exemploproc
,sys
,devfs
e assim por diante.Editar: veja também a resposta para O que acontece quando você 'monta' uma pasta existente com conteúdo?
fonte
sudo mount --bind / /mnt ; ls /mnt/proc
-> vazio. Eu me pergunto como isso funciona.fs/namespace.c
, eu acho; Não estou familiarizado com a fonte e não queria gastar muito tempo detalhando os detalhes. A "bandeira no inode" recebi da apresentação vinculada./var/cache
algum momento quando/var
não for possível montar.) Veja tambémpath_resolution(7)
. (As linux-manpages antigas tinham essa página de manual na seção 2, como die.net) IDK como o Linux realmente funciona internamente, para otimizar a verificação de cada componente do diretório como uma possível montagem. Talvez fixar essa entrada VFS no cache?fs/namei.c
(caminho -> pesquisa de inode) chama o namespace.clookup_mnt()
. Há um sinalizador no dentry (entrada no cache do diretório). Mas isso é apenas uma otimização, também conhecida como detalhe da implementação. Ele não informa qual sistema de arquivos está montado lá; você tem que olhar na mesa de montagem. (Veja m_hash (), para obter mais detalhes da implementação. O Linux, pelo menos, evita comparações adicionais de cadeias de caracteres, e o AFAICS ao mesmo tempo consegue reutilizar os dentrys em, por exemplo, montagens de bind, porque é escrito por assistentes).man 8 mount
::mount --bind foo foo
. Amount
chamada de ligação anexa apenas (parte de) um único sistema de arquivos, não é possível enviar submontagens. Toda a hierarquia de arquivos, incluindo submontagens, é anexada em um segundo lugar usando :mount --rbind olddir newdir
Se
mount(2)
necessário, a criação de um novo diretório para ser o ponto de montagem, você não poderá montar nada em um sistema de arquivos somente leitura. Isso seria idiota, para que possamos descartar isso.Se mount opcionalmente criou um novo diretório para ser o ponto de montagem, isso seria estranho. Não é como montar / desmontar acontecer o tempo todo, portanto, colocar lógica extra no kernel para executar essas duas etapas com uma única chamada do sistema não seria uma aceleração importante. Apenas deixe espaço para o usuário fazer uma
mkdir(2)
chamada do sistema, se desejar. A resposta de Dmitry aponta quemount(2)
fazer as duas coisas a tornaria não atômica. E você iria querer um argumento extra paramount(2)
com bandeiras do modo comoopen(2)
toma, paraO_CREAT
,O_EXCL
, etc. Seria apenas ser bobo em comparação a deixar o espaço do usuário fazê-lo.Ou talvez você estivesse perguntando sobre ter
mount(8)
(o programa tradicional que fazmount(2)
chamadas do sistema) fazer isso? Isso seria possível, mas já existe algo perfeitamente bommkdir(1)
para o trabalho, e o design do Unix é sobre boas ferramentas pequenas que podem ser combinadas. Se você deseja uma ferramenta que faça as duas coisas, é fácil escrever um script de shell para criar essa ferramenta com duas ferramentas mais simples. (Ou, como muru comentou,udisksctl
já faz isso, para que você não precise escrevê-lo.) Além disso, o normal do Linux amount(8)
partir do util-linux suporta omount -o x-mount.mkdir[=mode]
uso de suax-
sintaxe para opções de espaço do usuário, em vez de opções a serem passadas para o sistema de arquivos.Agora, a pergunta mais interessante: por que deve haver um diretório no sistema de arquivos pai?
Como a resposta de pjc50 aponta (sem relação, mesmo que ele tenha minhas iniciais!), Ter pontos de montagem exibidos nas listagens de diretório exigiria uma verificação extra em todos os itens
readdir()
.Ter pontos de montagem como diretórios no diretório que os contém (no FS pai) é um bom truque.
readdir()
não precisa perceber que é um ponto de montagem. Isso só acontece se o ponto de montagem for usado como um componente do caminho. É claro que a resolução do caminho precisa verificar a tabela de montagem para todos os componentes de diretório de um caminho.fonte
If mount(2) required the creation of a new directory to be the mount point, you couldn't mount anything under a read-only filesystem. That would be dumb
- Eu diria que mais inteligente: Da perspectiva do usuário, um read-only sistema de arquivos não deve mudar, mas permitindo que monta significa que ele podero
. Existem muitos casos de uso para sistemas de arquivos somente leitura em que seu argumento não faz sentido.man 8 mount
:x-mount.mkdir[=mode]
Permite criar um diretório de destino (ponto de montagem). O modo de argumento opcional especifica o modo de acesso ao sistema de arquivos usadomkdir(2)
na notação octal. O modo padrão é 0755. Essa funcionalidade é suportada apenas para usuários root./tmp
e/home
. Ou montado em NFS somente leitura/usr
com um local/usr/local
montado nele. Ou, geralmente, qualquer imagem somente leitura compartilhada com uma parte modificável montada sobre ela. (mods locais para uma imagem somente leitura também podem ser feitos por arquivo com sistemas de arquivos personalizados, como overlayfs ou outros sistemas de arquivos de união para Linux, usados em imagens inicializáveis do LiveCD.) Eu estava inicialmente pensando no RO raiz inicialmente montado no inicializar, mas torná-lo rw pode acontecer antes de outras montagens.A montagem no diretório existente faz uma chamada para
mount
praticamente atômica: ela é bem-sucedida ou falha, pelo menos da perspectiva do usuário. Semount
fosse necessário criar o ponto de montagem, ele teria dois pontos de falha, tornando impossível garantir uma reversão limpa. Imagine o seguinte cenário:mount
cria com êxito o ponto de montagemmount
tenta montar um novo sistema de arquivos nesse diretório, mas falhamount
tenta remover o ponto de montagem, mas falhaO sistema acaba com um efeito colateral de uma falha
mount
.Aqui está mais um:
umount
desmonta com sucesso um sistema de arquivosumount
tenta remover o ponto de montagem, mas falhaAgora, deve
umount
retornar sucesso ou fracasso?fonte
mount
possui 8 códigos de retorno diferentes para erros que também podem ser combinados. Ele poderia apenas adicionar outro quando a remoção do diretório falhar. man7.org/linux/man-pages/man8/mount.8.html#RETURN_CODESmount
chamada do sistema não o cria. Embora talvez fosse apenas minha interpretação / expectativa do que eu pensava que o OP queria perguntar, ou o que eu teria perguntado se estivesse perguntando.Outro caso que pode ocorrer:
Quando você inicializa, uma imagem básica somente leitura é carregada no diretório raiz. Então, você gostaria de substituí-lo quando quiser montar uma raiz real. Então você pode imaginar que o mount syscall apenas troque o
ro
ponto de montagem pararw
.Aqui, vamos imaginar que você tenha um problema no sistema de arquivos no ponto de montagem raiz, você gostaria de tentar consertá-lo. Com a sobreposição de montagem, é possível desmontar o sistema de arquivos e usar
fsck
a imagem básica para resolvê-lo.Esse recurso também pode ser útil em sistemas que precisam de segurança forte para rastrear as alterações entre uma
ro
partição e umarw
.fonte
mount
necessário, criando um novo diretório no local do ponto de montagem, não foi possível montar nada sobre um sistema de arquivos somente leitura? O parágrafo de abertura é confuso: não é assim que o Linux initrd funciona. Ele usa apivot_root
chamada do sistema para alterar o root fs, e não apenas montar mais coisas sobre ele. Isso tornou difícil seguir sua lógica nos próximos parágrafos, porque eu pensei que você estava falandopivot_root(2)
.pivot_root
e, em seguida,umount
o disco RAM. Mas initramfs é rootfs: você não pode nempivot_root
rootfs nem desmontá-lo . Tudo em vez de exclusão fora de rootfs para liberar o espaço (find -xdev / -exec rm {} \;
), rootfs Overmount com a nova raiz (cd /newmount; mount --move . /; chroot .
), anexar stdin / stdout / stderr para o novo / dev / console, eexec
o novoinit
Eu sempre me perguntei isso também.
Um invólucro simples, como:
salvo como um script executável nomeado
mount
em um diretório que substitui o/bin
seu PATH deve cuidar disso se isso o incomodar demais(Antes de executar o
mount
binário real , ele cria um diretório nomeado após o último argumentomount
, se esse diretório ainda não existir.)Como alternativa, se você não deseja que invocações com falha do
mount
wrapper criem diretórios, você pode:fonte
mount
comando não deve usar o diretório assim criado?mount /dev/foo /some/path
:? Eu supus que funcionaria comoudisksctl
funciona, então você correriamount /dev/foo
.eval
expandir$#
, usando"${@:-1}"
. Eu testei isso com o DASH, pois acho que ele não suporta nada além do que o POSIX sh é necessário para suportar./bin/dash -c 'echo ${@:-1}' foo bar
impressõesbar
.man -o x-mount.mkdir
...