Apakah ada perintah untuk melihat di mana disk dipasang?

29

Apakah ada perintah sederhana yang mengambil simpul perangkat disk sebagai input, dan memberi tahu saya di mana (dan apakah) disk itu dipasang? Apakah mungkin untuk mendapatkan mount point dengan sendirinya, sehingga saya bisa meneruskannya ke perintah lain?

Saya sedang mengerjakan sistem live Debian Squeeze dengan instalasi minimal (saya bisa menginstal paket tambahan jika perlu).

detly
sumber

Jawaban:

14

Di Linux, Anda bisa mendapatkan informasi mount point langsung dari kernel di /proc/mounts. The mountProgram mencatat informasi yang sama di /etc/mtab. Path dan opsi mungkin berbeda, seperti yang /etc/mtabmewakili apa yang mountditeruskan ke kernel sedangkan /proc/mountsmenunjukkan data seperti yang terlihat di dalam kernel. /proc/mountsselalu terkini sedangkan /etc/mtabmungkin tidak jika /etchanya baca di beberapa titik yang tidak diharapkan oleh skrip boot. Formatnya mirip dengan /etc/fstab.

Di kedua file, bidang yang dipisahkan spasi-putih pertama berisi jalur perangkat dan bidang kedua berisi titik pemasangan.

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

atau jika Anda tidak memiliki awk:

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

Ada beberapa kasus tepi di mana Anda mungkin tidak mendapatkan apa yang Anda harapkan. Jika perangkat dipasang melalui jalur berbeda /devyang menunjuk perangkat yang sama, Anda tidak akan melihatnya dengan cara ini. Dalam /proc/mounts, bind mount tidak dapat dibedakan dari aslinya. Mungkin ada lebih dari satu pertandingan jika titik pemasangan membayangi yang lain (ini tidak biasa).

Di /proc/selfatau /proc/$pid, ada file per proses mountsyang meniru file global. Informasi pemasangan dapat bervariasi di antara proses, misalnya karena chroot. Ada file tambahan yang disebut mountinfoyang memiliki format yang berbeda dan mencakup lebih banyak informasi, khususnya perangkat nomor utama dan kecil. Dari dokumentasi :

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

Jadi jika Anda mencari perangkat dengan nomor, Anda dapat melakukannya seperti ini:

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 'SANGAT berhenti menjadi jahat'
sumber
"Jika perangkat dipasang melalui jalur berbeda di / dev yang menunjuk perangkat yang sama, Anda tidak akan melihatnya dengan cara ini." - Itulah yang sebenarnya terjadi: Saya memiliki udiskssymlink (di / dev / disk / by-label / ...). Tapi saya bisa memutuskan menggunakan node perangkat readlink -f. Saya suka /proc/mountsidenya, saya pikir itu mungkin sedikit lebih dapat diandalkan daripada /etc/mtab.
detly
@detly Atau bisa Anda gunakan mountinfo. Panggil statuntuk mendapatkan nomor perangkat (lihat jawaban saya yang diperbarui, saya lupa untuk memasukkan perintah sebelumnya).
Gilles 'SO- berhenti bersikap jahat'
Anda mungkin perlu -d " "opsi untuk cutdi grepperintah itu.
Craig McQueen
26

Di Linux, Anda sekarang dapat menggunakan findmntperintah dari util-linux(sejak versi 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

Atau lsblk(juga dari util-linux, sejak 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

Yang itu juga berguna untuk menemukan semua sistem file yang dipasang di bawah perangkat tertentu (disk atau partisi ...):

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

Untuk mendapatkan mountpoint saja:

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

Di atas findmnttidak kembali dengan status keluar gagal jika perangkat tidak dipasang, tidak lsblk.

Begitu:

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
sumber
Itu selalu baik untuk mempelajari sesuatu yang baru
roaima
6

The mountperintah tanpa argumen akan menampilkan semua filesystem saat ini dipasang; Anda dapat melakukannya grepuntuk cakram yang Anda inginkan (atau grep /etc/mtabfile yang mountdibaca informasinya):

$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0
Michael Mrozek
sumber
Itu memiliki banyak teks asing. Saya harus bisa melewati titik mount ke perintah lain. (Maaf, saya sudah mengklarifikasi di Q.)
detly
Ah, grep ${NODE} /etc/mtab | cut -d ' ' -f 2seharusnya melakukannya.
detly
Meskipun grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2"jauh lebih rapuh ...
detly
2

Iya nih. Anda dapat melihat Hanya Menampilkan Mount Poin Menarik / Memfilter Jenis Tidak Menarik atau Daftar Direktori di bawah /yang Tidak Di Bawah Mountpoint yang Sama untuk beberapa contoh penggunaan, tetapi ada juga ikhtisar singkat di bawah ini. Perintah yang Anda tanyakan adalah findmnt (meskipun lsblkmungkin juga melayani) :

lsblk -f /dev/sda[12]

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

Sekarang, seperti yang Anda lihat, /dev/sda1sudah terpasang /esp. Saya bertanya-tanya apakah itu dipasang di tempat lain juga?

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. Saya melihat. Subfolder juga --binddipasang pada saat boot. Baik...

sudo umount /boot /esp
findmnt /dev/sda1

Tidak ada. Apa apaan?

echo "$?"

1

Ohhh ... Yah, itu bagus. 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.

Oh, ya, itu sangat bagus.

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

/dev/sda2[/arch_root] /

Sekarang mari kita masukkan sda1 kembali ke tempatnya dan coba lagi ...

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

Tetapi di mana saya menemukan perintah ajaib ini?

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

Untuk penggunaan output yang lebih kuat dan dapat disesuaikan findmnt(8) , terutama di skrip Anda. Perhatikan bahwa karakter kontrol dalam nama mountpoint diganti dengan ?.

mikeserv
sumber
1

Saya tidak tahu cara bersih dan sederhana untuk mendeteksi apakah node perangkat /devterpasang atau tidak . Ini yang bisa saya tawarkan. Ini menangani perangkat yang dipasang langsung ( /dev/sda1) dan perangkat yang dipasang oleh UUID ( /dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f). Itu rusak jika nama perangkat Anda mengandung spasi.

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

Fungsi menulis entri dari /proc/mountske stdout jika ditemukan, juga mengatur status keluar ke 0. Jika tidak, status keluar adalah 1.

roaima
sumber
-1

Cukup jalankan perintah di bawah ini:

df -h
Steve
sumber