Existe um comando simples que usa o nó do dispositivo de um disco como entrada e me informa onde (e se) esse disco está montado? É possível obter o ponto de montagem sozinho para poder passá-lo para outro comando?
Estou trabalhando em um sistema Debian Squeeze live com uma instalação mínima (posso instalar pacotes extras, se necessário).
Responder1
No Linux, agora você pode usar o findmnt
comando 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
Esse 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 findmnt
retorna com um status de saída de falha se o dispositivo não estiver montado, não lsblk
.
Entã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
Responder2
No Linux, você pode obter informações do ponto de montagem diretamente do kernel no formato /proc/mounts
. O mount
programa registra informações semelhantes em formato /etc/mtab
. Os caminhos e opções podem ser diferentes, pois /etc/mtab
representam o que mount
foi passado para o kernel e /proc/mounts
mostram os dados vistos dentro do kernel. /proc/mounts
está sempre atualizado, mas /etc/mtab
pode não estar se /etc
fosse somente leitura em algum momento que não era esperado pelos scripts de inicialização. O formato é semelhante ao/etc/fstab
.
Em ambos os arquivos, o primeiro campo separado por espaços 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 o awk:
grep "^$device_path " /proc/mounts | cut -d ' ' -f 2
Existem vários casos extremos em que você pode não conseguir o que espera. Se o dispositivo foi montado por um caminho diferente /dev
que designa o mesmo dispositivo, você não notará desta forma. Em /proc/mounts
, as montagens de ligação são indistinguíveis do original. Pode haver mais de uma correspondência se um ponto de montagem sombrear outro (isso é incomum).
Em /proc/self
ou /proc/$pid
, existe um mounts
arquivo por processo que imita o arquivo global. As informações de montagem podem variar entre processos, por exemplo devido achroot
. Existe um arquivo adicional chamado mountinfo
que possui um formato diferente e inclui mais informações, principalmente os números maiores e menores do dispositivo. Dedocumentaçã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
Então, se você está procurando um dispositivo por número, pode fazer assim:
awk -v dev="$major:minor" '$3==dev {print $5}'
awk -v dev="$(stat -L -c %t:%T /dev/block/something)" '$3==dev {print $5}'
Responder3
O mount
comando sem argumentos listará todos os sistemas de arquivos montados atualmente; você pode grep
fazer isso para o disco que deseja (ou grep
/etc/mtab
, qual é o arquivo mount
do qual lê as informações):
$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0
Responder4
Não conheço uma maneira limpa e simples de detectar se um nó de dispositivo /dev
está montado ou não. Isso é o que posso oferecer, no entanto. Ele lida com dispositivos montados diretamente ( /dev/sda1
) e dispositivos montados por UUID ( /dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f
). Ele quebra 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 escreve a entrada de /proc/mounts
parasaída padrãose encontrado, também definindo o status de saída como 0. Caso contrário, o status de saída será 1.