क्या यह देखने के लिए कोई कमांड है कि डिस्क कहाँ पर है?


28

क्या एक साधारण कमांड है जो इनपुट के रूप में एक डिस्क की डिवाइस नोड लेता है, और मुझे बताता है कि कहां (और क्या) उस डिस्क को माउंट किया गया है? क्या माउंट पॉइंट को खुद से प्राप्त करना संभव है, इसलिए मैं इसे किसी अन्य कमांड को पास कर सकता हूं?

मैं एक डेबियन निचोड़ लाइव सिस्टम पर एक न्यूनतम स्थापित के साथ काम कर रहा हूं (यदि आवश्यक हो तो मैं अतिरिक्त पैकेज स्थापित कर सकता हूं)।

जवाबों:


13

लिनक्स के तहत, आप सीधे कर्नेल से माउंट पॉइंट की जानकारी प्राप्त कर सकते हैं /proc/mountsmountकार्यक्रम में इसी तरह की जानकारी रिकॉर्ड /etc/mtab। पथ और विकल्प भिन्न हो सकते हैं, जैसा कि कर्नेल को /etc/mtabक्या mountदिया गया है, यह /proc/mountsदर्शाता है जबकि डेटा को कर्नेल के अंदर देखा गया है। /proc/mountsहमेशा अप-टू-डेट है जबकि /etc/mtabहो सकता है कि अगर /etcकेवल कुछ बिंदुओं पर पढ़ा गया था जो कि बूट स्क्रिप्ट द्वारा अपेक्षित नहीं था। प्रारूप के समान है /etc/fstab

दोनों फ़ाइलों में, पहले व्हाट्सएप-अलग-अलग फ़ील्ड में डिवाइस पथ होता है और दूसरे फ़ील्ड में माउंट बिंदु होता है।

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

या यदि आपके पास जाग नहीं है:

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

ऐसे कई किनारे मामले हैं जहाँ आपको वह नहीं मिल सकता है जिसकी आप अपेक्षा करते हैं। यदि डिवाइस /devउसी डिवाइस में एक अलग पथ के माध्यम से आरोहित किया गया था , तो आप इसे इस तरह से नोटिस नहीं करेंगे। में /proc/mounts, बाँध माउंट मूल से अप्रभेद्य हैं। एक से अधिक मैच हो सकते हैं यदि एक माउंट बिंदु दूसरे पर छाया करता है (यह असामान्य है)।

में /proc/selfया /proc/$pid, वहाँ एक प्रति प्रक्रिया है mountsफ़ाइल है कि नकल करता है वैश्विक फ़ाइल। माउंट की जानकारी प्रक्रियाओं के बीच भिन्न हो सकती है, उदाहरण के लिए chroot। एक अतिरिक्त फ़ाइल है जिसे mountinfoएक अलग प्रारूप है और इसमें अधिक जानकारी शामिल है, विशेष रूप से डिवाइस प्रमुख और मामूली संख्या में। से प्रलेखन :

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

इसलिए यदि आप किसी डिवाइस को नंबर के लिए देख रहे हैं, तो आप इसे इस तरह से कर सकते हैं:

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

"यदि डिवाइस एक ही डिवाइस को डिजाइन करने वाले / dev में एक अलग पथ के माध्यम से माउंट किया गया था, तो आप इसे इस तरह से नोटिस नहीं करेंगे।" - यह वास्तव में मामला है: मेरे पास udisksसिमिलिंक (/ / देव / डिस्क / बाय-लेबल / ...) है। लेकिन मैं एक डिवाइस नोड का उपयोग करके हल कर सकता हूं readlink -f। मुझे यह /proc/mountsविचार पसंद है, मुझे लगता है कि इससे थोड़ा अधिक विश्वसनीय हो सकता है /etc/mtab
detly

@ या आप उपयोग कर सकते हैं mountinfostatडिवाइस नंबर प्राप्त करने के लिए कॉल करें (मेरे अपडेट किए गए उत्तर देखें, मैं पहले कमांड शामिल करना भूल गया था)।
गिल्स एसओ- बुराई को रोकें '

आपको उस कमांड के -d " "लिए विकल्प की आवश्यकता हो सकती है । cutgrep
क्रेग मैकक्वीन


26

लिनक्स पर, अब आप (संस्करण २.१: से) findmntसे कमांड का उपयोग कर सकते हैं util-linux:

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

या lsblk(भी util-linux, 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

यह भी एक विशिष्ट डिवाइस (डिस्क या विभाजन ...) के तहत घुड़सवार सभी फाइल सिस्टम को खोजने के लिए उपयोगी है:

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

केवल माउंटपॉइंट प्राप्त करने के लिए:

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

findmntयदि डिवाइस माउंट नहीं है, तो ऊपर विफलता विफलता की स्थिति के साथ वापस आती है lsblk

इसलिए:

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

कुछ नया सीखना हमेशा अच्छा होता है
रोआमा

6

mountकोई तर्क के साथ आदेश सभी वर्तमान घुड़सवार फ़ाइल सिस्टम सूची जाएगा; आप चाहते हैं grepकि डिस्क के लिए आप (या grep /etc/mtab, जो फ़ाइल mountसे जानकारी पढ़ता है):

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

हालांकि इसमें बहुत अधिक सारगर्भित पाठ है। मुझे माउंट कमांड को अन्य कमांड में पास करने में सक्षम होने की आवश्यकता है। (क्षमा करें, मैं स्पष्ट किया है कि प्र में)
detly

आह, grep ${NODE} /etc/mtab | cut -d ' ' -f 2करना चाहिए।
detly

हालांकि grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2"बहुत कम नाजुक है ...
detly

2

हाँ। आप केवल दिलचस्प माउंट पॉइंट / फ़िल्टरिंग गैर-दिलचस्प प्रकार या सूचीकरण निर्देशिका /दिखा सकते हैं, जिसके तहत कुछ उदाहरण उपयोग के लिए समान माउंटपॉइंट के नीचे नहीं हैं , लेकिन नीचे एक संक्षिप्त रूप भी है। आप जिस आदेश के बारे में पूछ रहे हैं, वह है findmnt (हालांकि lsblkसेवा भी हो सकती है) :

lsblk -f /dev/sda[12]

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

अब, जैसा कि आप देख सकते हैं, /dev/sda1पर मुहिम शुरू की है /esp। मुझे आश्चर्य है कि क्या यह कहीं और घुड़सवार है?

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

अहा। समझा। --bindबूट पर एक सबफ़ोल्डर भी लगाया गया है। ठीक है...

sudo umount /boot /esp
findmnt /dev/sda1

कुछ भी तो नहीं। क्या बकवास है?

echo "$?"

1

ओह्ह ... अच्छा, यह अच्छा है। हममम ...

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.

ओह, हाँ, यह वास्तव में अच्छा है।

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

/dev/sda2[/arch_root] /

अब sda1 को वापस रखते हैं जहां यह है और फिर से कोशिश करें ...

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

लेकिन मुझे यह जादुई कमान कहां से मिली?

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

अधिक मजबूत और अनुकूलन योग्य उत्पादन उपयोग findmnt(8) के लिए , विशेष रूप से आपकी लिपियों में। ध्यान दें कि माउंटपॉइंट नाम के अक्षरों को नियंत्रित किया जाता है ?


1

मुझे यह पता लगाने के लिए एक साफ और सरल तरीके का पता नहीं है कि डिवाइस नोड /devमाउंट किया गया है या नहीं । यह वही है जो मैं पेश कर सकता हूं, हालांकि। यह सीधे माउंट किए गए डिवाइस ( /dev/sda1) और UUID द्वारा माउंट किए गए डिवाइस ( ) को हैंडल करता है /dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f। यह टूट जाता है अगर आपके डिवाइस के नाम में व्हॉट्सएप हो।

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

समारोह से प्रवेश लिखते हैं /proc/mountsकरने के लिए stdout , अगर पाया भी करने के लिए 0. अन्यथा बाहर निकलें स्थिति है 1 से बाहर निकलें स्थिति सेट।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.