Как я могу смонтировать и размонтировать файловые системы Linux, используя ctypes, mount и umount

У меня есть сценарий Python (запускается как root), который должен иметь возможность монтировать и размонтировать файловую систему USB-накопителя. Я провел небольшое исследование и нашел ответ /questions/7872671/kak-mne-smontirovat-fajlovuyu-sistemu-ispolzuya-python/7872699#7872699 котором используется ctypes. Тем не мение. в ответе указывается только способ монтирования, поэтому я попытался создать аналогичную функцию для размонтирования устройства. В общем, у меня есть это:

import os
import ctypes
def mount(source, target, fs, options=''):
    ret = ctypes.CDLL('libc.so.6', use_errno=True).mount(source, target, fs, 0, options)
    if ret < 0:
        errno = ctypes.get_errno()
        raise RuntimeError("Error mounting {} ({}) on {} with options '{}': {}".
                           format(source, fs, target, options, os.strerror(errno)))

def unmount(device, options=0):
    ret = ctypes.CDLL('libc.so.6', use_errno=True).umount2(device, options)
    if ret < 0:
        errno = ctypes.get_errno()
        raise RuntimeError("Error umounting {} with options '{}': {}".format(device, options, os.strerror(errno)))

Тем не менее, попробуйте команду unmount с опцией "0" или "1", например:

unmount('/dev/sdb', 0)

или же

unmount('/dev/sdb', 1)

выдает следующую ошибку:

Traceback (most recent call last):
  File "./BuildAndInstallXSystem.py", line 265, in <module>
    prepare_root_device()
  File "./BuildAndInstallXSystem.py", line 159, in prepare_root_device
    unmount('/dev/sdb', 0)
  File "./BuildAndInstallXSystem.py", line 137, in unmount
    raise RuntimeError("Error umounting {} with options '{}': {}".format(device, options, os.strerror(errno)))
RuntimeError: Error umounting /dev/sdb with options '0': Device or resource busy

при запуске с 2 в качестве опции:

unmount('/dev/sdb', 2)

размонтирует ВСЕ мои файловые системы, включая '/', что приведет к сбою системы.

Все это по-прежнему применимо, даже если я заменю номер устройства конкретным разделом:

/dev/sdb -> /dev/sdb1

Что я делаю неправильно?

0 ответов

Другие вопросы по тегам