AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 676413
Accepted
MountainX
MountainX
Asked: 2021-11-06 21:43:50 +0800 CST2021-11-06 21:43:50 +0800 CST 2021-11-06 21:43:50 +0800 CST

Como montar automaticamente um ponto de montagem de pré-requisito para o que estou montando?

  • 772

Estou executando o Arch Linux e o systemd.

Em /etc/fstabeu tenho algo assim:

LABEL=XYZ       /mypath       vfat    noauto,[...]
/mypath/main    /newplace     none    bind,noauto    0 0

Atualmente tenho que montar /newplacecom dois comandos:

mount /mypath
mount /newplace

Eu também tenho que umountambos.

Eu preciso simplificar isso para apenas um mount(ou umount) comando:

mount /newplace

Eu preciso usar o comando exato mount(e relacionado umount) mostrado imediatamente acima por causa de um script existente. Esclarecer:

O comando único mount /newplacedeve primeiro montar /mypath, depois montar /newplacee /mypathdeve permanecer montado.

O comando umount /newplacedeve primeiro umount /newplacee depois também umount /mypath.

Posso alterar /etc/fstabe alguns outros detalhes do meu aparelho. Mas não consigo alterar o script que chama mount /newplace. Também não consigo montar automaticamente /newplaceporque geralmente precisa permanecer desmontado, exceto quando o script é executado.

Eu tenho lido sobre montagens de ligação recursivas, compartilhadas, privadas, escravas e outras opções de montagem, mas não vi uma maneira de alcançar o que estou procurando.

Atualização: em resposta aos comentários, isso obviamente não é uma montagem recursiva, então eu a chamei de montagem "pré-requisito". Espero que o termo seja apropriado. Eu pensei sobre o termo "montagem recursiva reversa", mas isso parece muito ruim. Estou tomando "pré-requisito" como algo que deve vir antes e que fornece a base contínua para o requisito. Geralmente, o pré-requisito não pode ser esquecido ou removido enquanto continua com o requisito.

Nesse caso, /mypath(pré-requisito) e /newplace(requisito) permanecem montados quando /newplacesão montados e ambos seriam desmontados (provavelmente na ordem inversa, é claro) ao chamar umount /newplace.

A solução ideal usará systemd, Python 3 ou Xonsh. (Um script Bash também é aceitável. Não tenho zsh ou outros shells instalados.)

mount
  • 1 1 respostas
  • 99 Views

1 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2021-11-07T06:35:08+08:002021-11-07T06:35:08+08:00

    Se você quiser que o subdiretório "principal" do FS LABEL=XYZseja montado em /newplace, sem precisar que todo o FS seja montado em /mypath, você pode adicionar uma linha como:

    LABEL=XYZ /newplace subdir subdir=main,srctype=vfat,noauto,... 0 0
    

    E crie o /sbin/mount.subdirauxiliar (chamado por mount /newplace, não deve ser chamado diretamente) como um script como:

    #! /bin/zsh -p
    (( EUID == 0 )) || exec sudo -- "$0" "$@"
    PATH=/bin:/sbin:/usr/bin:/usr/sbin
    
    # mount -t subdir -o subdir=foo -o otheroption source /dest calls us
    # as mount.subdir source /dest -o rw,subdir=foo,otheroption
    dev=${1?} dest=${2?} opts=( ${(s[,])4?} )
    
    # extract mandatory subdir option
    (( i = $opts[(I)subdir=*] )) || exit
    subdir=${opts[i]#*=}
    opts[i]=()
    
    # extract optional srctype option
    if (( i = $opts[(I)srctype=*] )); then
      type=(-t "$opts[i]")
      opts[i]=()
    else
      type=()
    fi
    
    tmpdir=$(mktemp -d) || exit
    
    mounted()true
    if
      mount "$type[@]" -o "${(j[,])opts}" -- "$dev" "$tmpdir"
    then
      mount --bind -- "$tmpdir/$subdir" "$dest" || mounted()false
      umount -- "$tmpdir"
    fi && rmdir -- "$tmpdir" && mounted
    

    Que monta todo o FS em um tmpdir, monta o subdiretório no destino e depois desmonta e remove o tmpdir.


    Se, conforme esclarecido em sua edição posterior, você deseja que ambos /newplacee /mypathsejam montados e /mypathnão seja apenas uma etapa intermediária para o objetivo final de ter um subdiretório do FS montado em /myplace, você pode adotar uma abordagem semelhante, e isso se torna mais fácil à medida que você só precisa do ajudante para montar o(s) FS(s) de pré-requisito:

    LABEL=XYZ /mypath vfat noauto,[...]
    /myplace/main /newplace prereq prereq=/myplace,noauto,... 0 0
    

    E crie o /sbin/mount.prereqauxiliar como um script como:

    #! /bin/zsh -p
    (( EUID == 0 )) || exec sudo -- "$0" "$@"
    PATH=/bin:/sbin:/usr/bin:/usr/sbin
    
    src=${1?} dst=${2?} opts=( ${(s[,])4?} )
    
    # extract prereq options
    for prereq in ${(M)opts:#prereq=*}; do
      prereq=${prereq#*=}
      mountpoint -q -- $prereq ||
        mount -- $prereq ||
        exit
    done
    opts=(${opts:#prereq=*})
    
    exec mount --bind -o "${(j[,])opts}" -- "$src" "$dst"
    

    Observe que /mypathnão é desmontado automaticamente depois de /newplacedesmontado.

    O mesmo com a sintaxe do shell POSIX (portanto, deve funcionar em bash) pode ser assim:

    #! /bin/sh -
    [ "$(id -u)" -eq 0 ] || exec sudo -- "$0" "$@"
    PATH=/bin:/sbin:/usr/bin:/usr/sbin
    
    src="${1?}" dst="${2?}"
    
    set -o noglob
    IFS=,
    set -- ${4?}
    
    # extract prereq options
    for opt do
      case $opt in
        (prereq=*)
          prereq=${opt#*=}
          mountpoint -q -- "$prereq" ||
            mount -- "$prereq" ||
            exit
          ;;
        (*)
          set -- "$@" "$opt"
      esac
      shift
    done
    opts="$*"
    
    exec mount --bind -o "$opts" -- "$src" "$dst"
    

    (não testado).

    Se você não pode editar seu script, você pode instrumentá-lo. Por exemplo, se estiver escrito em bash, chame-o como:

    bash -c '
      mount() {
        if [[ $1 = "/newplace" ]]; then
          command mount /mypath || return
        fi
        command mount "$@"
      }
      export -f mount
      exec "$0" "$@"' your-script its args
    

    Ou se estiver escrito em zsh, adicione a ~/.zshenv(ou /some/dir/.zshenve defina ZDOTDIR=/some/dirpara esse script):

    if [[ $ZSH_SCRIPT:P = /path/to/your-script ]]; then
      mount() {
        if [[ $1 = /newplace ]]; then
          command mount /mypath || return
        fi
        command mount "$@"
      }
    fi
    

    Ou para qualquer shell, adicione um mountscript /some/dirque faça o mesmo:

    #! /bin/sh -
    if [ "$1" = /newplace ]; then
      /bin/mount /mypath || exit
    fi
    exec /bin/mount "$@"
    

    E chame seu script como:

    PATH="/some/dir:$PATH" your-script its args
    
    • 2

relate perguntas

  • Montando permanentemente um diretório com LVM

  • Impedir que montagens NFS quebradas bloqueiem um diretório no solaris 11.3?

  • Como montar partições de unidade zfs no solaris 11.3

  • Bloqueando montagem syscall

  • montar lan hdd no linux fedora

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve