Bir diskin nereye monte edildiğini görmek için bir komut var mı?


28

Bir diskin aygıt düğümünü giriş olarak alan ve bana o diskin nereye (ve nasıl) monte edildiğini söyleyen basit bir komut var mı? Bağlantı noktasını kendi başına almak mümkün müdür, böylece başka bir komuta geçebilir miyim?

Minimum kurulum ile Debian Squeeze canlı sistemi üzerinde çalışıyorum (gerekirse ekstra paketler yükleyebilirim).

Yanıtlar:


13

Linux altında, bağlama noktası bilgisini doğrudan çekirdekten alabilirsiniz /proc/mounts. mountProgram benzer bilgileri kaydeder /etc/mtab. Yollar ve seçenekler , çekirdeğe /etc/mtabneyin mountgeçtiğini temsil ederken /proc/mounts, çekirdeğin içinde görülen verileri gösterirken farklı olabilir . /proc/mountsdaima günceldir, oysa boot bültenleri tarafından beklenmeyen bir noktada salt okunur /etc/mtabolsaydı olmayabilir /etc. Biçim benzer /etc/fstab.

Her iki dosyada da, boşlukla ayrılmış ilk alan, aygıt yolunu ve ikinci alan da bağlama noktasını içerir.

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

veya eğer awk yoksa:

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

Beklediğiniz şeyi elde edemeyeceğiniz bir dizi son durum var. Aygıt, /devaynı aygıtı belirten farklı bir yolla monte edilmişse , bunu bu şekilde farketmezsiniz. İçinde /proc/mounts, bağlama yuvaları orijinalden ayırt edilemez. Bir montaj noktası diğerini gölgelerse birden fazla eşleşme olabilir (bu olağandışıdır).

İçinde /proc/selfveya /proc/$pid, mountsgenel dosyayı taklit eden bir işlem başına dosya var. Montaj bilgisi, örneğin aşağıdakiler gibi işlemler arasında değişebilir chroot. mountinfoFarklı bir formata sahip ve daha fazla bilgi içeren, özellikle cihazın ana ve küçük sayıları olan ek bir dosya var. Gönderen belgeler :

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

Yani, numarasına göre bir cihaz arıyorsanız, bu şekilde yapabilirsiniz:

awk -v dev="$major:minor" '$3==dev {print $5}'
awk -v dev="$(stat -L -c %t:%T /dev/block/something)" '$3==dev {print $5}'

"Aygıt, aynı aygıtı belirten / dev içinde farklı bir yolla monte edilmişse, bu şekilde farketmezsiniz." - Aslında durum şu: udisksbağlantıya sahipim (in / dev / disk / by-label / ...). Ancak kullanarak bir cihaz düğümünü çözebilirim readlink -f. /proc/mountsFikir hoşuma gitti, bence biraz daha güvenilir olabilir /etc/mtab.
12'de

@detly Veya kullanabilirsiniz mountinfo. Çağrı statcihazı numaraları almak için (benim güncellenmiş cevaba bakınız, daha önce komutu eklemeyi unutmuşum).
Gilles 'SO- kötülükten

Sen gerekebilir -d " "seçeneğini cutki grepkomuta.
Craig McQueen


26

Linux'ta şu findmntkomutu artık kullanabilirsiniz util-linux(2.18 sürümünden beri):

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

Veya lsblk( util-linux2.19'dan beri):

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

Bu, belirli bir cihazın (disk veya bölüm ...) altına monte edilmiş tüm dosya sistemlerini bulmakta da yararlıdır:

$ 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  /

Yalnızca mountpoint'i elde etmek için:

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

findmntCihaz monte edilmediyse yukarıdaki hata başarısızlık durumu ile döner lsblk.

Yani:

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

Yeni bir şeyler öğrenmek her zaman iyidir
roaima 21:15

6

mountHiçbir argüman komut olan tüm bağlanan dosya listeler; İstediğiniz grepdisk için (veya grep /etc/mtabdosyadaki mountbilgileri okuduğu) yapabilirsiniz:

$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0

Yine de çok fazla yabancı metin var. Bağlantı noktasını diğer komutlara geçirebilmem gerekiyor. (Üzgünüm, Q o açıklık ettik)
detly

Ah, grep ${NODE} /etc/mtab | cut -d ' ' -f 2yapmalısın.
saat

Her ne kadar grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2"daha az kırılgandır ...
detly

2

Evet. Görebilirsiniz Sadece İlginç bağlama noktaları / Filtreleme Olmayan İlginç Türleri gösteriliyor veya altında İlanı Dizinler /Aynı mountpoint Altında Değil olan bazı örnek kullanımı için, ancak kısa bir yıkık altında da var. İstediğiniz komut şudur: findmnt (yine lsblkde hizmet edebilir) :

lsblk -f /dev/sda[12]

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

Şimdi, gördüğünüz gibi /dev/sda1, üzerine monte edilmiştir /esp. Acaba başka bir yere de monte edilmiş mi?

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. Anlıyorum. --bindÖnyükleme üzerine bir alt klasör de monte edilir. Tamam...

sudo umount /boot /esp
findmnt /dev/sda1

Hiçbir şey değil. Ne oluyor be?

echo "$?"

1

Ohhh ... Güzel, bu güzel. Hmmm ...

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.

Evet, gerçekten çok hoş.

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

/dev/sda2[/arch_root] /

Şimdi sda1'i ait olduğu yere geri koyalım ve tekrar deneyelim ...

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] /

Ama bu büyülü emri nerede buldum?

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

Daha sağlam ve özelleştirilebilir çıktı kullanımı findmnt(8) , özellikle komut dosyalarınızda. Bağlanma noktası adındaki kontrol karakterlerinin değiştirildiğine dikkat edin ?.


1

Bir aygıt düğümünün /devtakılı olup olmadığını tespit etmenin temiz ve basit bir yolunu bilmiyorum . Yine de önerebileceğim şey bu. Doğrudan monte edilmiş cihazları ( /dev/sda1) ve UUID ( /dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f) tarafından monte edilmiş cihazları yönetir . Cihaz adlarınız boşluk içeriyorsa kırılır.

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

Fonksiyon gelen girdiyi yazar /proc/mountsiçin stdout da 0. Aksi gelmişse 1'dir için çıkış durumu ayarlayarak, bulursa.


-1

Sadece aşağıdaki komutu çalıştırın:

df -h
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.