启动时挂载 fstab 卷

启动时挂载 fstab 卷

在 Ubuntu 18.04 中,我失去了在启动时从 fstab 自动挂载网络共享的功能。每次启动计算机时,我都必须手动挂载所有共享sudo mount -a...我已经尝试在 crontab 中包含 @reboot mount -a,但它不起作用...我在使用 Ubuntu MATE 18.04 和 Kubuntu 18.04 时也遇到过这种情况,所以这似乎是核心 Ubuntu 问题,而不是桌面问题...

干杯,布鲁诺

答案1

我尝试了这些选项来解决 Ubuntu 18.04LTS 上的相同问题:

  • 将“comment=systemd.automount”插入到 /etc/fstab 中的相关挂载语句中。问题:当我尝试将此选项用于两个不同的网络共享时,它会产生对同一网络共享的多次挂载。
  • 将“mount -a”插入到 /etc/rc.local。问题:这似乎没有效果!以超级用户身份,在目录 /etc/network/if-up.d/ 中创建一个包含以下文本的脚本,并赋予其执行权限:
  • 以超级用户身份,在目录 /etc/network/if-up.d/ 中创建包含以下文本的脚本并授予其执行权限:

#!/bin/sh mount -a

问题解决了!最后一种解决方案效果很好。位于 /etc/network/if-up.d/ 中的脚本在网络连接建立后运行。然后,此脚本会挂载已在 /etc/fstab 中规定的网络共享(以及任何其他待挂载)。

答案2

我遇到了同样的问题,并尝试使用自动文件系统和启动命令等,结果并不令人满意。我最终通过编写自己的脚本解决了这个问题,并将其作为自动启动脚本。此脚本需要 python,并且用户至少对该mount命令具有 sudo 权限(无需密码)。

以下是 Python 脚本(main.py):

"""
Code to do a user level mounts/unmounts

Usage:
    python3 main.py mount|unmount

The mounts list contains the information needed to perform the mount and unmount.
These mounts should not appear in the /etc/fstab file.
each element of the mounts list is itself a list in the format:
    [device, mount_dir, mount_options, ...]
where `device` is the device to be mounted such as '//192.168.1.3/Public'
      'mount_dir' is the mount point
      'mount_options' is the options to be used by the mount command.
            Each option must be an element itself.
            for example: '-t', 'cifs', '-o', 'rw,users,noperm,guest,soft,cache=none,sec=none'
Edit the `mounts` list to your needs.

The mount command issued will be 'sudo mount <mount_options> <device> <mount_dir>`.
The unmount command will be `sudo umount <mount_dir>`.
This requires that the user be in the `sudoers` group with the
"NOPASSWD" argument, for example:
    jra ALL=(ALL) NOPASSWD: ALL
gives user `jra` the ability to use the `sudo` command without ever
providing a password. (This can be modified to limit
the commands allowed without a password).

Upon start of this script, attempts will be made to mount each element
in the mounts list.
Failed mounts are added to the `waiting_mounts` list, and mounts for
those failures are retried after delays specified in 'SLEEP_SECONDS' list.

Unmounting is performed by the OS, normally not by this script.

A log directory `.simpleAutomount` is created in the users home directory.

"""

import subprocess
import time
import sys
from datetime import datetime
import os.path
import shutil

# this is the list of mounts to be performed (list of lists)
mounts=[
        ['//192.168.1.3/Public', '/mnt/mybook', '-t', 'cifs', '-o', 'rw,_netdev,users,noperm,guest,soft,cache=none,sec=none,vers=1.0' ],
#        ['/dev/sda4', '/windows', '-t', 'ntfs']
    ]

SLEEP_SECONDS = [5, 5, 5, 10, 20, 100, 100]  # number of seconds to sleep between successive mount attempts
MAX_TRIES = len(SLEEP_SECONDS)
waiting_mounts = []


def ping(host):
    """
    ping the specified host and return the exit value of the ping

    success == 0 means success
    success == 1 means no reply received
    success == 2 means no network available
    """
    cmd = ['ping', host, '-c 1']
    success = subprocess.call(cmd, stdout=subprocess.PIPE)
    return success


def process_mount(mnt):
    """
    attempt to perform one mount as indicated in the mnt list

    :param mnt: one element from the mounts list (which is a list in itself)
    :return: True if the mount was successful (or the mount should not be attempted again). False if the mount should be tried again later
    """
    host = None
    if mnt[0].startswith('//'):          # format is //host/directory
        index = mnt[0].index('/', 2)
        host = mnt[0][2:index]
    elif ':' in mnt[0]:                  # format is host:directory
        index = mnt[0].index(':')
        host = mnt[0][:index]
    mnt_cmd = ['sudo', 'mount']
    mnt_cmd.extend(mnt[2:])
    mnt_cmd.extend(mnt[0:2])
    if host is None:        # this is not a network mount, do not need to ping
        logFile.write('running ' + str(mnt_cmd) + '\n')
        logFile.flush()
        returnCode = subprocess.call(mnt_cmd)
        logFile.write('\t' + str(mnt_cmd) + ' finished with return code: ' + str(returnCode) + '\n')
        logFile.flush()
        return True
    elif ping(host) == 0:
        logFile.write('running ' + str(mnt_cmd) + '\n')
        logFile.flush()
        returnCode = subprocess.call(mnt_cmd)
        logFile.write('\t' + str(mnt_cmd) + ' finished with return code: ' + str(returnCode) + '\n')
        logFile.flush()
        return True
    else:
        return False


def usage(unrecognized_opt=None):
    if unrecognized_opt is not None:
        print('Unrecognized option: ' + str(unrecognized_opt) + '\n')
        logFile.write('Unrecognized option: ' + str(unrecognized_opt) + '\n')
    print('usage:\n\tpython3 ' + sys.argv[0] + ' mount|unmount\n')
    logFile.write('usage:\n\tpython3 ' + sys.argv[0] + ' mount|unmount\n')
    logFile.flush()


if __name__ == '__main__':
    """
    The starting point for the SimpleAutomount script

    Legal arguments are 'mount' or 'unmount'
    'mount' will inspect each element of the mounts list and attempt the mounts
    'unmount' will attempt to unmount each element of the mount list
    """
    if len(sys.argv) != 2:
        usage()
        sys.exit(1)

    theDate = datetime.now()

    # create a log file in the users ~/.simpleAutomount directory
    home = os.path.expanduser("~")
    sam = os.path.join(home, '.simpleAutomount')
    if not os.path.exists(sam):
        os.mkdir(sam, 0o755)
    logFileName = os.path.join(sam, "simpleAutomount.log")
    logFile = open(logFileName, 'a')

    # start logging
    logFile.write('\n\nSimpleAutomount started at ' + str(theDate) + ' with arg: ' + sys.argv[1] + '\n')
    logFile.flush()

    if sys.argv[1].lower() == 'mount':    # do mount
        os.spawnlp(os.P_NOWAIT, sys.executable, sys.executable, sys.argv[0], 'forked_mount') # fork so that systemd does not wait and delay login
        sys.exit(0) # indicate success
    elif sys.argv[1].lower() == 'forked_mount':  # we are forked, so we can take our time here
        for mnt in mounts:
            if not process_mount(mnt):  # the mount was not successful and should be tried again later
                logFile.write('appending ' + mnt[0] + ' to waiting mounts\n')
                logFile.flush()
                waiting_mounts.append((mnt))    # add this mount to the waiting_mounts list to be tried again later

        # if any mounts were unsuccessful and should be tried again, loop to try mounting again
        try_count = 0
        while len(waiting_mounts) > 0 and try_count < MAX_TRIES:
            logFile.write('sleeping for ' + str(SLEEP_SECONDS[try_count]) + ' seconds\n')
            logFile.flush()
            time.sleep(SLEEP_SECONDS[try_count])

            # process waiting_mounts, starting at the end for ease of deletion
            indx = len(waiting_mounts) - 1
            for i in range(indx, -1, -1):
                mnt = waiting_mounts[i]
                logFile.write('Attempting to mount ' + mnt[0] + ' for try number ' + str(try_count) + '\n')
                logFile.flush()
                # try this mount again
                if process_mount(mnt):
                    del waiting_mounts[i]    # mount was successful, so remove this entry from waiting mounts
            try_count += 1
        logFile.write('SimpleAutomount exiting with ' + str(len(waiting_mounts)) + ' remaining unmounted\n')
    elif sys.argv[1].lower() == 'unmount':    # do unmount
        for mnt in mounts:
            cmd = ['sudo', 'umount', mnt[1]]
            #journal.send('running ' + str(cmd), SYSLOG_IDENTIFIER='simple_automount', SYSLOG_PID=str(os.getpid()))
            logFile.write('running ' + str(cmd) + '\n')
            logFile.flush()
            returnCode = subprocess.call(cmd)
            logFile.write('\t' + str(cmd) + ' finished with return code: ' + str(returnCode) + '\n')
            logFile.flush()
        sys.exit(0)
    else:
        usage(unrecognized_opt=sys.argv[1])
        sys.exit(1)

答案3

在 Ubuntu 18.04 中,硬盘分配已发生更改。我在 Ubuntu 16.04 中使用的 /dev/sda3 设备已移至 Ubuntu 18.04 中的 /dev/sde3。

在我更改 fstab 条目之前,启动因严重错误而停止。

在我找到正确的设备分配后,系统继续启动并挂载我在 fstab 中分配的所有分区。

要获取可能的分配,请尝试以下命令:

sudo fdisk -l

此致

相关内容