มีคำสั่งเพื่อดูว่าดิสก์ถูกเมาท์หรือไม่?


28

มีคำสั่งง่าย ๆ ที่ใช้โหนดอุปกรณ์ของดิสก์เป็นอินพุตและบอกฉันว่า (และไม่ว่า) ดิสก์นั้นถูกเมาท์หรือไม่? เป็นไปได้หรือไม่ที่จะได้รับจุดเชื่อมต่อด้วยตัวเองดังนั้นฉันสามารถส่งต่อไปยังคำสั่งอื่นได้หรือไม่

ฉันกำลังทำงานกับระบบ Debian Squeeze live ด้วยการติดตั้งเพียงเล็กน้อย (ฉันสามารถติดตั้งแพ็คเกจเพิ่มเติมได้ถ้าต้องการ)

คำตอบ:


13

ภายใต้ Linux, /proc/mountsคุณจะได้รับการติดตั้งจุดข้อมูลโดยตรงจากเมล็ดใน โปรแกรมบันทึกข้อมูลที่คล้ายกันในmount /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

หรือถ้าคุณไม่มี awk:

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

มีหลายกรณีขอบที่คุณอาจไม่ได้รับสิ่งที่คุณคาดหวัง หากอุปกรณ์ถูกเชื่อมต่อผ่านเส้นทางอื่นใน/devที่ระบุอุปกรณ์เดียวกันคุณจะไม่สังเกตเห็นด้วยวิธีนี้ ใน/proc/mountsbind 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 ที่กำหนดอุปกรณ์เดียวกันคุณจะไม่สังเกตเห็นด้วยวิธีนี้" - ในกรณีนี้จริง ๆ แล้วฉันมีudiskssymlink (ใน / dev / disk / by-label / ... ) readlink -fแต่ผมสามารถแก้ปัญหาไปยังโหนดอุปกรณ์ที่ใช้ ผมชอบความคิดผมคิดว่าอาจจะมีบิตน่าเชื่อถือกว่า/proc/mounts /etc/mtab
detly

@detly mountinfoหรือคุณสามารถใช้ โทรstatเพื่อรับหมายเลขอุปกรณ์ (ดูคำตอบที่อัปเดตของฉันฉันลืมที่จะรวมคำสั่งก่อนหน้านี้)
Gilles 'SO- หยุดความชั่วร้าย'

คุณอาจต้องการ-d " "ตัวเลือกสำหรับcutในgrepคำสั่งนั้น
Craig McQueen


26

บน Linux ตอนนี้คุณสามารถใช้findmntคำสั่งจากutil-linux(ตั้งแต่รุ่น 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

หรือ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  /

ในการรับ mountpoint เท่านั้น:

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

ดังกล่าวข้างต้นจะกลับมามีสถานะความล้มเหลวทางออกถ้าอุปกรณ์ไม่ได้ติดตั้งไม่ได้findmntlsblk

ดังนั้น:

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

เป็นเรื่องดีเสมอที่จะได้เรียนรู้สิ่งใหม่
roaima

6

mountคำสั่งที่มีการขัดแย้งจะไม่มีรายการ filesystems ติดตั้งในปัจจุบันทั้งหมด คุณสามารถทำได้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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.