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 / 464959
Accepted
Iskustvo
Iskustvo
Asked: 2018-08-27 12:20:52 +0800 CST2018-08-27 12:20:52 +0800 CST 2018-08-27 12:20:52 +0800 CST

A regra Udev para dispositivos de mídia de montagem automática parou de funcionar depois que o systemd foi atualizado para a versão 239

  • 772

Por algum tempo eu tinha uma regra udev funcionando para automontar dispositivos de mídia.

/etc/udev/rules.d/61-mount_media_by_label.rules

#
# To propagate udev's mountpoint to the user space, MountFlags must have a value "shared" in the /usr/lib/systemd/system/systemd-udevd.service.
#

# Ignore devices that aren't storage block-devices and block-devices that are already listed in /etc/fstab.
KERNEL!="sd[a-z][1-9]*", GOTO="mount_media_by_label_end"
PROGRAM="/bin/grep -e '^UUID=%E{ID_FS_UUID}' /etc/fstab", RESULT!="", GOTO="mount_media_by_label_end"

# Decide the name for device's mountpoint directory, based on device's label.
ENV{ID_FS_LABEL}!="", ENV{mountpoint}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{mountpoint}="usb-%k"

# If device is being plugged in, set options for mount command.
ACTION=="add", ENV{mount_options}="relatime"
ACTION=="add", ENV{ID_FS_TYPE}=="vfat|ntfs", ENV{mount_options}="%E{mount_options},utf8,gid=100,umask=002"

# If device is being plugged in, create mountpoint directory in /media and mount device node to it.
ACTION=="add", RUN+="/bin/mkdir -p /media/%E{mountpoint}", RUN+="/bin/mount -o %E{mount_options} /dev/%k /media/%E{mountpoint}"

# If device is being plugged out, unmount it and delete its mountpoint directory.
ACTION=="remove", ENV{mountpoint}!="", RUN+="/bin/umount -l /media/%E{mountpoint}", RUN+="/bin/rmdir /media/%E{mountpoint}"

# Label for early exit.
LABEL="mount_media_by_label_end"

Para fazer esta regra funcionar, eu só tive que alterar o valor da MountFlagsopção para sharedem
/usr/lib/systemd/system/systemd-udevd.service
Depois de atualizar systemdpara version 239, este arquivo parece diferente.
Percebi 2 mudanças que podem ser problemáticas:

  1. A MountFlagsopção não é especificada nas configurações padrão.
  2. Há uma nova opção PrivateMountsdefinida como yes.

Da documentaçãosystemd do 's eu percebi que agora eu só preciso definir e a propagação do mountpoint chegaria ao espaço do usuário. PrivateMounts=no

No entanto, este não é o caso.
eu tentei

  1. MudandoPrivateMounts=no
  2. Alterando PrivateMounts=noe adicionandoMountFlags=shared

mas também não funciona.

Qual é a maneira correta de montar dispositivos de mídia a partir de regras do udev em systemd v239e posteriormente?

mount systemd
  • 1 1 respostas
  • 3758 Views

1 respostas

  • Voted
  1. Best Answer
    sourcejedi
    2018-08-28T01:39:36+08:002018-08-28T01:39:36+08:00

    Esta abordagem pode ser sub-ótima. Por exemplo, se você suportar a montagem de NTFS gravável usando ntfs-3g, o ntfs-3gprocesso será encerrado sempre que você reiniciar o udev.

    Observe que a doutrina de segurança moderna sugere que os desktops devem começar a usar o FUSE para montar todos os sistemas de arquivos removíveis. https://lwn.net/Articles/755593/

    Seria preferível se você pudesse descobrir como iniciar (e parar?) uma unidade systemd separada ... e escrever isso como a abordagem preferida, em quaisquer documentos peculiares que continuem sugerindo que os usuários do Arch usem esse padrão :-). Usar uma unidade systemd separada evitará as restrições aplicadas ao serviço udev.

    Por exemplo, inicie um comando em uma unidade de escopo systemd usando systemd-run --no-block --scope -- my mount command here.

    Infelizmente, se você deseja que a unidade que contém ntfs-3gtenha um nome identificável , não é imediatamente óbvio qual é a maneira 100% correta. Se uma unidade antiga com esse nome ainda for rastreada como "ativa", mas o processo acabou de sair, simplesmente pedir ao serviço para iniciar não fará nada. Você pode ignorar o problema, gerar um sufixo aleatório para o nome ou tentar descartar essa sequência de eventos... mas talvez haja uma maneira melhor.

    Eu não testei isso com o FUSE, mas acho que a maneira de fazer isso seria o systemd-mountcomando.

    Uma resposta de superusuário sugere que o uso systemd-mountem um dispositivo enquanto a regra do udev ainda está em execução pode não funcionar corretamente. Isso exigiria soluções alternativas bastante barrocas. ( RUN+="/path/to/my/script %k"que corre systemd-run --no-block --scope --unit=mount-$1 sh -c "systemctl start /dev/$1; systemd-mount ...").

    Eu acho que a maneira de fazer isso seria algo como

    ENV{SYSTEMD_WANTS}=my-mounter@%k.service

    # /etc/systemd/system/[email protected]
    [Service]
    Type=oneshot
    ExecStart=systemd-mount %I
    
    #!/bin/sh
    # /usr/local/lib/my-mounter
    # You can make this as complicated as you want.
    # (Although curiously systemd-mount also reads SYSTEMD_MOUNT_WHERE and
    # SYSTEMD_MOUNT_OPTIONS properties if you set them on the udev device.)
    # You could also read udev properties yourself using 
    # eval "$(udevadm info --query=property --export)"
    
    DEVNAME="$1"
    systemd-mount "/dev/$DEVNAME"
    

    Os padrões para systemd-mountfazem com que o sistema de arquivos seja desmontado automaticamente na remoção, mas eles não limpam o diretório do ponto de montagem criado automaticamente posteriormente (!).


    Houve duas mudanças separadas na v239 - duas diretivas separadas que você deve reverter para obter o comportamento antigo.

    1. PrivateMounts=yes. Substitua isso por PrivateMounts=no.
    2. SystemCallFilter=@system-service @module @raw-io

      O uso desta diretiva é novo na v239. Portanto, a maneira mais simples de recuperar o comportamento anterior é removê-lo completamente.

    • 1

relate perguntas

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

  • Use o suporte de watchdog do systemd para reiniciar o aplicativo

  • Bloqueando montagem syscall

  • montar lan hdd no linux fedora

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 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

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 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
    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
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +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