LINUX.ORG.RU

Как узнать, с какой машины примонтирована директория?

 


0

1

Есть какой то абсолютный путь, скажем /home/user/a/b/c/d/.../

Возможно, что этот путь указывает на директорию, физически лежащую на другой машине, скажем мы сидим на хосте A, /home/ к нему примонтирован по NFS с хоста B, а в B:/home/user/a/b/c/ примонтировано C:/drop/user по sshfs. Путь может содержать символические ссылки.

Между всеми машинами настроен вход через ssh по открытому ключу. Как раскрутить всю цепочку, т.е. получить в итоге что то вроде B:C:/drop/user ? Хочется какого то изящного Ъ решения;-)

★★★★★

Монтировать раздел по NFS как у тебя описано выше - глупо. Но если ты решился на такое, то вызывай через subprocess mount и парсь вывод. Ну либо подгружай через ctypes libc.

xpahos ★★★★★
()

Пока только есть такая идея, чтобы последовательно проверять является какая-либо часть пути точкой монтирования

$ python 
Python 2.7.3 (default, Aug  9 2012, 17:23:57) 
[GCC 4.7.1 20120720 (Red Hat 4.7.1-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.ismount("/mnt")
False
>>> os.path.ismount("/mnt/Hitachi_2")
True
>>> os.path.ismount("/mnt/Hitachi_2/vbox")
False

justAmoment ★★★★★
()
Ответ на: комментарий от justAmoment

Потом найденный «/mnt/Hitachi_2» проверять в «fstab» и «mtab».

>>> a = [x.split() for x in open("/etc/fstab", "r").readlines() if x.find("/mnt/Hitachi_2") != -1]
>>> a
[['LABEL=Hitachi_2', '/mnt/Hitachi_2', 'ext4', 'defaults', '0', '0']]
>>> a[0][0]
'LABEL=Hitachi_2'

justAmoment ★★★★★
()
Последнее исправление: justAmoment (всего исправлений: 1)
Ответ на: комментарий от AIv

Вот, набросал прототип. Покажи, если не трудно, что он тебе выведет на твой путь.

$ cat ./lor2.py
#!/bin/python
import os, sys

if len(sys.argv) > 1:
    s = sys.argv[1]        
    l = 0
    fns = ["/etc/fstab","/etc/mtab"]
    while (l != len(s)) and len(s) > 0:
        l = len(s)
        if (s != os.sep) and (os.path.ismount(s)):
            for fn in fns:
                print fn
                b = [x.split() for x in open(fn, "r").readlines() if x.find(s) != -1]
                for i in range(len(b)):
                    if len(b[i]) > 1:
                        print b[i][0], b[i][1]
        s = os.path.dirname(s)

$ ./lor2.py /mnt/Hitachi_2/vbox
/etc/fstab
LABEL=Hitachi_2 /mnt/Hitachi_2
/etc/mtab
/dev/sdf6 /mnt/Hitachi_2

justAmoment ★★★★★
()
Ответ на: комментарий от justAmoment

На разные пути выдает разное, местами немного лишнего.

cluster1:~> tmp/get-chain.py crust/o48/
/etc/fstab
/etc/mtab
/etc/fstab
/etc/mtab
o48:crust /home/user/crust/o48

H1:~$ tmp/get-chain.py ~/tmp
/etc/fstab
# /home
UUID=.... /home
#H3:/home /mnt/H3/home
#H4:/home /mnt/H4/home
H2:/home /mnt/H2/home
D:/home /mnt/D/home
/home /mnt/home
/etc/mtab
/dev/md1 /home
/dev/md1 /mnt/home
H2:/home /mnt/H2/home

Важно, что такой подход опознает и NFS и sshfs директории, дальше дело техники.

Хотя df оказывается делает то же самое;-)

AIv ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Тока с afuse df делает не то. Таки придется в mtab смотреть... а так хотелось от этого увернуться!

AIv ★★★★★
() автор топика
Ответ на: комментарий от monk

Если вручную, то лучше /proc/mount парсить. А то в /etc/ не всегда всё есть.

Наверное, просто опечатка.

$ ls -al /proc/mount
ls: невозможно получить доступ к /proc/mount: Нет такого файла или каталога
$ ls -al /proc/mounts
lrwxrwxrwx 1 root root 11 февр. 19 13:59 /proc/mounts -> self/mounts
Тогда скрипт можно заменить на такой.
$ cat lor2.py 
#!/bin/python
import os, sys

if len(sys.argv) > 1:
    s = sys.argv[1]        
    l = 0
    fns = ["/proc/mounts", "/etc/fstab", "/etc/mtab"]
    while (l != len(s)) and len(s) > 0:
        l = len(s)
        if (s != os.sep) and (os.path.ismount(s)):
            for fn in fns:
                print "-"*20 + "\n" + str(fn) + "\n" + "^"*len(fn)
                b = [x.split() for x in open(fn, "r").readlines() if x.find(s) != -1]
                for i in range(len(b)):
                    if len(b[i]) > 1:
                        print b[i][0], b[i][1]
        s = os.path.dirname(s)
$ ./lor2.py /mnt/Hitachi_2/vbox
--------------------
/proc/mounts
^^^^^^^^^^^^
/dev/sdf6 /mnt/Hitachi_2
--------------------
/etc/fstab
^^^^^^^^^^
LABEL=Hitachi_2 /mnt/Hitachi_2
--------------------
/etc/mtab
^^^^^^^^^
/dev/sdf6 /mnt/Hitachi_2

justAmoment ★★★★★
()
Ответ на: комментарий от justAmoment

У меня в итоге вышло так:

expand_path = lambda path: reduce( lambda R, p: os.path.abspath(os.readlink(R+'/'+p)) if os.path.islink(R+'/'+p) else R+'/'+p, 
                                   os.path.abspath( os.path.expanduser( os.path.expandvars(path) ) ).split('/') )

def p2c(path):
    path, chain, df = expand_path(path), [], os.popen('df -T '+path).readlines()[-1].split()
    fs, mnt_dst = df[0], df[-1]
    while ':' in fs: 
        fs, mnt_src = fs.split(':'); chain.append(fs) 
        print path, fs, mnt_src, mnt_dst
        path = mnt_src+'/'+path[len(mnt_dst):]
        df, path = os.popen( "ssh %s 'df -T `readlink -f %s`; readlink -f %s'"%(' ssh '.join(chain), path, path ) ).readlines()[-2:]
        path, df = path[:-1], df.split()
        fs, mnt_dst = df[0], df[-1]
    chain.append(path); return chain

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.