Existe um comando para ver onde um disco está montado?

28

Existe um comando simples que pega o nó do dispositivo de um disco como entrada e me diz onde (e se) esse disco está montado? É possível obter o ponto de montagem por si só, para que eu possa passá-lo para outro comando?

Estou trabalhando em um sistema ao vivo Debian Squeeze com uma instalação mínima (posso instalar pacotes extras, se necessário).

detly
fonte

Respostas:

13

No Linux, você pode obter informações sobre o ponto de montagem diretamente do kernel no /proc/mounts. O mountprograma registra informações semelhantes em /etc/mtab. Os caminhos e opções podem ser diferentes, pois /etc/mtabrepresenta o que foi mountpassado para o kernel e /proc/mountsmostra os dados como vistos dentro do kernel. /proc/mountsestá sempre atualizado, ao passo que /etc/mtabpode não estar se /etcfosse somente leitura em algum momento que não era esperado pelos scripts de inicialização. O formato é semelhante a /etc/fstab.

Nos dois arquivos, o primeiro campo separado por espaço em branco contém o caminho do dispositivo e o segundo campo contém o ponto de montagem.

awk -v needle="$device_path" '$1==needle {print $2}' /proc/mounts

ou se você não tiver awk:

grep "^$device_path " /proc/mounts | cut -d ' ' -f 2

Há vários casos extremos em que você pode não obter o que espera. Se o dispositivo foi montado por um caminho diferente /devque designa o mesmo dispositivo, você não o notará dessa maneira. Em /proc/mounts, montagens de ligação são indistinguíveis do original. Pode haver mais de uma correspondência se um ponto de montagem sombrear outra (isso é incomum).

Em /proc/selfou /proc/$pid, há um mountsarquivo por processo que imita o arquivo global. As informações de montagem podem variar entre os processos, por exemplo, devido a chroot. Há um arquivo adicional chamado mountinfoque possui um formato diferente e inclui mais informações, em particular os números principais e secundários do dispositivo. A partir da documentação :

36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue
(1)(2)(3)   (4)   (5)      (6)      (7)   (8) (9)   (10)         (11)

(1) mount ID:  unique identifier of the mount (may be reused after umount)
(2) parent ID:  ID of parent (or of self for the top of the mount tree)
(3) major:minor:  value of st_dev for files on filesystem
(4) root:  root of the mount within the filesystem
(5) mount point:  mount point relative to the process's root
(6) mount options:  per mount options
(7) optional fields:  zero or more fields of the form "tag[:value]"
(8) separator:  marks the end of the optional fields
(9) filesystem type:  name of filesystem of the form "type[.subtype]"
(10) mount source:  filesystem specific information or "none"
(11) super options:  per super block options

Portanto, se você estiver procurando por um dispositivo por número, faça o seguinte:

awk -v dev="$major:minor" '$3==dev {print $5}'
awk -v dev="$(stat -L -c %t:%T /dev/block/something)" '$3==dev {print $5}'
Gilles 'SO- parar de ser mau'
fonte
"Se o dispositivo foi montado por um caminho diferente em / dev que designa o mesmo dispositivo, você não notará dessa maneira." - Esse é realmente o caso: eu tenho o udiskslink simbólico (em / dev / disk / by-label / ...). Mas eu posso resolver para um nó de dispositivo usando readlink -f. Gosto da /proc/mountsideia, acho que pode ser um pouco mais confiável do que /etc/mtab.
detly
@detly Ou você pode usar mountinfo. Ligue statpara obter os números do dispositivo (veja minha resposta atualizada, esqueci de incluir o comando anteriormente).
Gilles 'SO- stop be evil'
Você pode precisar da -d " "opção cutnesse grepcomando.
Craig McQueen
26

No Linux, agora você pode usar o findmntcomando de util-linux(desde a versão 2.18):

$ findmnt -S /dev/VG_SC/home
TARGET SOURCE                 FSTYPE OPTIONS
/home  /dev/mapper/VG_SC-home ext4   rw,relatime,errors=remount-ro,data=ordered

Ou lsblk(também de util-linux, desde 2.19):

$ lsblk /dev/VG_SC/home
NAME       MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
VG_SC-home 254:2    0  200G  0 lvm  /home

Essa também é útil para encontrar todo o sistema de arquivos montado em um dispositivo específico (disco ou partição ...):

$ lsblk  /dev/sda2
NAME                    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda2                      8:2    0  59.5G  0 part
├─linux-debian64 (dm-1) 252:1    0    15G  0 lvm
└─linux-mint (dm-2)     252:2    0    15G  0 lvm  /

Para obter apenas o ponto de montagem:

$ findmnt -nr -o target -S /dev/storage/home
/home
$ lsblk -o MOUNTPOINT -nr /dev/storage/home
/home

Acima, findmntele retorna com um status de falha de saída se o dispositivo não estiver montado, não lsblk.

Tão:

if mountpoint=$(findmnt -nr -o target -S "$device"); then
  printf '"%s" is mounted on "%s"\n' "$device" "$mountpoint"
else
  printf '"%s" does not appear to be directly mounted\n' "$device"
fi
Stéphane Chazelas
fonte
É sempre bom aprender algo novo
roaima
6

O mountcomando sem argumentos listará todos os sistemas de arquivos atualmente montados; você pode fazer grepisso para o disco que deseja (ou grep /etc/mtabqual arquivo mountlê as informações):

$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0
Michael Mrozek
fonte
Isso tem muito texto estranho. Eu preciso ser capaz de passar o ponto de montagem para outros comandos. (Desculpe, eu
esclarei
Ah, grep ${NODE} /etc/mtab | cut -d ' ' -f 2deveria fazê-lo.
detly
Embora grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2"seja muito menos frágil ...
detly
2

Sim. Você pode ver Exibindo apenas pontos de montagem interessantes / filtrando tipos não interessantes ou diretórios de listagem em /que não estão sob o mesmo ponto de montagem para um exemplo de uso, mas também há um breve resumo abaixo. O comando que você está perguntando é findmnt (embora lsblktambém possa servir) :

lsblk -f /dev/sda[12]

NAME FSTYPE LABEL UUID                                 MOUNTPOINT
sda1 vfat   ESP   F0B7-5DAE                            /esp
sda2 btrfs  sys   94749918-bde1-46e6-b77c-b66e0368ecdb /    

Now, as you can see, /dev/sda1 is mounted on /esp. I wonder if it is mounted elsewhere as well?

findmnt /dev/sda1

TARGET SOURCE                    FSTYPE OPTIONS
/esp   /dev/sda1                 vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro
/boot  /dev/sda1[/EFI/arch_root] vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro

Aha. Entendo. Uma subpasta também é --bindmontada sobre a inicialização. Está bem...

sudo umount /boot /esp
findmnt /dev/sda1

Nada. Que diabos?

echo "$?"

1

Ohhh ... Bem, isso é legal. Hummm ...

for d in 1 2
do    findmnt "/dev/sda$d" >/dev/null
      printf  "/dev/sda$d%.$((6>>!$?))s%s\n"\
              " isn't" " currently mounted."
done

/dev/sda1 isn't currently mounted.
/dev/sda2 is currently mounted.

Ah, sim, isso é muito legal.

for d in /dev/sd*
do    findmnt -noSOURCE,TARGET "$d"
done

/dev/sda2[/arch_root] /

Agora vamos colocar o sda1 de volta onde ele pertence e tentar novamente ...

sudo mount -a
for d in /dev/sd*
do    findmnt -noSOURCE,TARGET "$d"
done

/dev/sda1                 /esp
/dev/sda1[/EFI/arch_root] /boot
/dev/sda2[/arch_root] /

Mas onde eu encontrei esse comando mágico?

man mount | sed -e:n -e'/findmnt/!d;N;/\n$/q;bn'

Para saída mais robusta e personalizável, use findmnt(8) , especialmente em seus scripts. Observe que os caracteres de controle no nome do ponto de montagem são substituídos por ?.

mikeserv
fonte
1

Não conheço uma maneira limpa e simples de detectar se um nó do dispositivo /devestá ou não montado. É isso que eu posso oferecer. Ele lida com dispositivos montados diretamente ( /dev/sda1) e dispositivos montados por UUID ( /dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f). É interrompido se os nomes dos seus dispositivos contiverem espaços em branco.

deviceIsMounted()
{
    local DEVICE="$1"
    local MOUNT=$(
        (
            echo "$DEVICE"
            find /dev -type l -lname "*${DEVICE/*\/}" -exec readlink -f {} \; -print |
                xargs -n2 |
                awk -v device="$DEVICE" '$1 == device {print $2}'
        ) |
            xargs -n1 -i{} grep -F {} /proc/mounts
    )
    test -n "$MOUNT" && echo "$MOUNT"
}

deviceIsMounted /dev/sda1 && echo yes              # Mountpoint and status
deviceIsMounted /dev/md2 >/dev/null && echo yes    # Just status

A função grava a entrada de /proc/mountspara stdout se for encontrada, também configurando o status de saída como 0. Caso contrário, o status de saída é 1.

roaima
fonte
-1

Basta executar o comando abaixo:

df -h
Steve
fonte