Bir dizinin hangi cihaza yerleştirileceğini belirleme


49

Eğer yaparsam

# cd /
# ln -s /home test
# cd test
# mount --bind $PWD /mnt

yazı /proc/mountsolduğunu

/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0

hangi cihazdan monte edildiği /homeve hangisinden kolayca $PWDçıkarılamadığı /test. Genel olarak hangi cihazın (yani, / dev / sda2) /proc/mountsbağlanma bağının, bağlantılar, diğer bağlanma bağları vb.

Yanıtlar:


49

Sorunuzu anlarsam, hangi montaj için hangi cihazın kullanıldığını bilmek istersiniz. Bunun için dfkomutu kullanabilirsiniz :

$ df -h 
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/fedora_greeneggs-root   50G   21G   27G  44% /
devtmpfs                           3.8G     0  3.8G   0% /dev
tmpfs                              3.8G   14M  3.8G   1% /dev/shm
tmpfs                              3.8G  984K  3.8G   1% /run
tmpfs                              3.8G     0  3.8G   0% /sys/fs/cgroup
tmpfs                              3.8G  3.4M  3.8G   1% /tmp
/dev/sda1                          477M   99M  349M  23% /boot
/dev/mapper/fedora_greeneggs-home  402G  184G  198G  49% /home

Belirli bir dosya / dizinin hangi aygıtta bulunduğunu bulmak için dosyayı bir argüman olarak verin df. Örneğinizi kullanarak:

$ df -h /mnt
Filesystem                         Size  Used Avail Use% Mounted on
/dev/sda1                          477M   99M  349M  23% /

mountKomutu da kullanabilirsiniz :

$ mount | grep '^/dev'
/dev/mapper/fedora_greeneggs-root on / type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,data=ordered)
/dev/mapper/fedora_greeneggs-home on /home type ext4 (rw,relatime,seclabel,data=ordered)

Her cihaz için monte edilen dizin yukarıdaki çıktıdaki 3. argümandır. Yani cihaz için /dev/sda1olurdu /boot. Diğer cihazlar LVM'den (Mantıksal Hacim Yönetimi) yararlanıyor ve hangi gerçek cihazın LVM tarafından kullanıldığını bilmek için daha fazla sorgulanması gerekecek.


Eğer $PWD(Ben montaj ediyorum ne olduğunu) sembolik, bağlama bağlar, vb bir dizi gömüldü sonra yinelemeli bağlama noktaları için yolunu incelemek gerekir.
StrongBad

/proc/mountsEn azından aklımda monte edilen "şey" de göründüğü halde bağlanma bağları , bu dizin / dosya olan cihaz değildir.
StrongBad

@StrongBad - ne readlink -f /mntgösterir?
slm

2
@ StrongBad, sembolik bağlantılar tarafından gizlendiğinde montaj noktasını / cihazı belirlemekle ilgileniyorsanız, bunu sorunuza sormalısınız. Doğru cevabı elde etmek çok daha kolay olacaktır.
Patrick

readlink -f /mntverir/mnt
StrongBad

29

Linux'ta biz var findmntdan util-linuxtam olarak bunun için yapılmış

findmnt -n -o SOURCE --target /path/to/FILE

Diğer çözümlerle ilgili avantaj, yollar bağlantı halkaları veya yinelenen bağlama bağlantıları tarafından gizlenmişse çalışmaya devam etmesidir.


Bu benim için çalışmıyor. Sistemdeki her bağlantının kaynağını gösterir. util-linux 2.23.2
bwduncan

@bwduncan benim için 2.23.2 ile çalışıyor. Belki bir böcek? En son 2.29.2 sürümünü deneyebilir misiniz?
rudimeier

Ubuntu'daki 2,29 numarayı yapıyor. Gibi bir hata değil, daha bir özellik :)
bwduncan

1
Teşekkürler! Sistem betiği için tam da ihtiyacım olan buydu.
vog

11

Farkında olduğum en doğru yöntem, lstat () sistem çağrısının çıktısını kullanmaktır. Spesifik olarak, st_dev alanı. Bu bilgiyi görmek için kullanılabilecek bir komut satırı yardımcı programı stat (1) vardır. Örneğin, dizüstü bilgisayarımda "stat / etc / issue" çıktısı:

File: ‘/etc/issue’
  Size: 65          Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 1610916043  Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Üçüncü satıra, ilk alana, "Aygıt" a dikkat edin. İşte 801h listeler. Bu değer iki bayt, 8 ve 1 olarak ayrılabilir. İlk bayt, ana sayı olarak bilinir, ikinci bayt, küçük sayıdır. Bu nedenle, bir sonraki adım, ana cihaz 8, minör 1'in ne olduğunu bulmak.

Danışmanlık / proc / bölümleri en hızlı buluyorum. Benim durumumda, / proc / partitions içeriği:

major minor  #blocks  name

   8       16  234431064 sdb
   8       17   33554432 sdb1
   8       18  200875608 sdb2
   8        0  500107608 sda
   8        1  500106584 sda1

Binbaşı 8, minör 1'in sda1 olduğu bu çıktıdan açıkça anlaşılıyor. Bunu bir ls -l / dev / sda1 ile onaylayabiliriz.

brw-rw---- 1 root disk 8, 1 May  8 05:33 /dev/sda1

Tarih damgasından önce 8, 1 dikkat edin.

/ Dev / sda1 gibi bir aygıt dosyasının adının yalnızca bir etiket olduğunu anlamak / hatırlamak önemlidir. Büyük ve küçük sayılar, cihaz dosyasının önemli, önemli değerleridir. Merak ederseniz, aygıt dosyaları oluşturmak için kullanılan mknod (1) yardımcı programını inceleyin. Aşağıdaki sözdizimi ile majör 8, minör 18 ile aardvark adlı yeni / dev bir giriş oluşturabilirim:

mknod /dev/aardvark b 8 18

Sonra kolayca monte edebilirim:

mount /dev/aardvark /mnt

ve eğer mount komutunun çıktısına veya / proc / mounts içeriğine bakarsak ve şunu görürüz:

/dev/aardvark on /mnt type xfs (rw,relatime,attr2,inode64,noquota)

df -h şunları gösterir:

/dev/aardvark   192G  154G   38G  81% /mnt

... Her neyse, tüm bunların amacı, bir blok cihazı tanımlamak için önemli ayrıntıların, cihaz dosyası etiketi değil, büyük ve küçük sayılar olduğunu ve lstat () sistem çağrısını kullanmanın en iyi yol olduğunu göstermek. bu değerleri sorgula.

Son bir yorum olarak, yanıtladığımdan emin olmak için sorunuzu yeniden okudum ve bir bağlama montajı için / proc / mounts'ta hangi kaynak aygıt etiketinin gösterileceğini sorduğunuzu fark ettim. Bu, bağlama bağlama için dosya sistemi bağlama noktası kaynağını (2) orijinal bağda kullanılanla aynı kaynak aygıt etiketi olacaktır. Belki bir örnek yardımcı olacaktır:

/ Dev / sdb2 ve / dev / aardvark'ım (yukarıdakiyle aynı). Her ikisi de büyük 8, küçük 18'dir. Not, aynı dosya sistemini iki kez monte edeceğim. Aşağıdakileri yapıyorum:

mkdir /mnt1 /mnt2 /foo

mount /dev/aardvark /mnt1
mount /dev/sdb2 /mnt2

Dizini / mnt1 içinde bazı dizinler oluşturduğuma dikkat edin. Fakat / mnt1 ve / mnt2 aynı dosya sistemine monte edildiğinden, bazılarına / mnt2 üzerinden de erişilebilir olacaktır.

mkdir /mnt1/somedir

mkdir /foo/left /foo/right

mount -o bind /mnt1/somedir /foo/left
mount -o bind /mnt2/somedir /foo/right

Şimdi, eğer / proc / mounts'u kontrol edersek, şunu görürüz:

/dev/aardvark /mnt1 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /mnt2 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/aardvark /foo/left xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /foo/right xfs rw,relatime,attr2,inode64,noquota 0 0

/ Foo / ... bind mounts üzerindeki kaynak cihaz etiketi, ilk olarak dosya sistemi mount (2) çağrısında verilen değerle aynıdır. Unutmayın, / dev / aardvark ve / dev / sdb2 örneğimde aynı cihaz.

Yeni bir roman yazdığımı ve ilk yarının sorunuzu gerçekten cevaplamadığını fark ettim, ancak silmek için çok fazla bir israf gibi görünüyordu. Belki başka birine yardım eder.

İyi şanslar.

PS Bazı dosya sistemlerinin ağ tabanlı - NFS veya CIFS gibi - veya sanal benzeri procfs veya sysfs olduğunu ve bir kaynak blok cihazının olmadığını unutmayın. Stat çıkışında cihaz olarak neyin iade edileceğini bilmiyorum.


1
İlk bölüm kesinlikle son bölümü anlamama yardımcı oluyor.
StrongBad

Bu cevap tmpfs yollarında çalışmaz. St_dev minor, major / / proc / partitions öğesini bulamazsınız.
mbello

@mbello Cevabımın sonunda belirttiğim gibi, bu yöntem destek aygıtı olmayan dosya sistemlerinde işe yaramaz ve işe yaramaz.
eter

2

Aşağıdaki tipik bağlama noktaları verilmiştir:

$ df --output=target
Mounted on
/
/dev
/run
/sys/fs/cgroup
/run/lock
/run/shm
/run/user

stat --format %m <path> yalnızca mountpoint'i yuvarlak bir şekilde tutulacak şekilde yazdıracaktır (izin belgesini açıkça belirlemek için çıkış kodunu kontrol etmeniz gerekse de, mount-table yaklaşımları burada kazanır):

$ stat --format %m /
/
$ stat --format %m /tmp
/
$ stat --format %m /proc
/proc
$ stat --format %m /run
/run
$ stat --format %m /run/mount
/run
$ stat --format %m /run/user
/run/user
$ stat --format %m /run/user/1000/dconf
/run/user
$ stat --format %m /run/user/1000/gvfs
/run/user/1000/gvfs

Sembolik bağlantılar her zamanki gibi biraz özen gösterir:

$ ls -lh ~/.gvfs
/home/cwillu/.gvfs -> /run/user/1000/gvfs
$ stat --format %m ~/.gvfs
/run/user/1000/gvfs
$ stat --format %m ~/.gvfs
/

Ve tabii ki komut dosyası yazarken tırnak kullanmayı unutmayın. Boşluk içeren bir mountpoint yolu düşünün:

$ mkdir /tmp/Something\ Like\ This\!
$ sudo mount none /tmp/Something\ Like\ This\! -t tmpfs
$ stat --format %m /tmp/Something\ Like\ This\!
/tmp/Something Like This!
$ touch /tmp/Something\ Like\ This\!/pretend-I\'m-big
$ ls /tmp/Something\ Like\ This\!
pretend-I'm-big

Ne kadar büyük olan sen?

$ du $(stat --format %m /tmp/Something\ Like\ This\!/)
du: cannot access /tmp/Something: No such file or directory
du: cannot access Like: No such file or directory
du: cannot access This!: No such file or directory

$ du "$(stat --format %m /tmp/Something\ Like\ This\!/)"
0   /tmp/Something Like This!

Distro'mun sekmesi tamamlanmadı bile, doğru değil, bu yüzden sadece bu örnek mountpoint'i satırbaşları ve satır beslemeleri ve boşluk alanları ile joker olarak göstereceğiz:

$ stat --format %m /tmp/Something*
/tmp/Something   
Like   This!

$ a="$(stat --format %m /tmp/Something*)"
    # the above assignment is actually the one place you don't need quotes, 
    # but `export a=...` or similar _would_ need them, so we'll just put them in;
    # they don't change the behaviour in this form of assignment.

$ stat "$a"
  File: ‘/tmp/Something   \r\n\rLike   This!’
  Size: 40          Blocks: 0          IO Block: 4096   directory
Device: 7bh/123d    Inode: 1279171     Links: 2
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-09-30 11:43:17.933467344 -0600
Modify: 2016-09-30 11:43:17.933467344 -0600
Change: 2016-09-30 11:43:17.933467344 -0600
 Birth: -

1
<kbd> işaretlemesi, bütün komuttan ziyade tek bir tuş için kullanılır. Benim düşünceme göre, bu şekilde daha iyi görünmüyor.
Tomasz
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.