Virtualbox启动挂载无法卸载

3

如果您在VirtualBox的guest系统中使用NetBeans,下面这个脚本可能会很有用。但是似乎存在一个问题:

如果您查看该脚本,它会写入一个引导脚本,从而将Host系统上的NetBeansProjects挂载到Guest中。这个很好用。但是额外创建了一个脚本并移动到用户的local bin中。实际上,会创建两个脚本:1)允许用户挂载和2)卸载已挂载的文件夹以提高灵活性。

我测试了这些脚本,在我的Ubuntu guest中一切正常,除了'netbeans-unmount.sh'脚本。

它无法卸载在启动时挂载的目录,我尝试给脚本文件赋予'root'权限,但没有成功……

是否有关于如何使其正常工作的线索呢?

#!/bin/bash
#Author: Yucca Nel http://thejarbar.org
#Will restart system
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
export PATH

#Modify these variables as needed...
tempWork=/tmp/work
startupScript=/etc/init.d/rc.local
defaultNetBeansVersion=7.0.1

echo "Provide NetBeans version (7.0.1 is default) then hit [Enter] :"
  read NetBeansVersion

  if [ -z "$NetBeansVersion" ]
    then
    $NetBeansVersion=$defaultNetBeansVersion
  fi

mkdir -p /$tempWork;
cd /$tempWork;

wget http://dlc.sun.com.edgesuite.net/netbeans/7.0.1/final/bundles/netbeans-$NetBeansVersion-ml-javase-linux.sh;
sh $tempWork/*sh;


#Add Netbeans launcher to your PATH. Doing so allows you to run 'netbeans' command from the terminal
#This line will need to be changed if you changed the default install location (IOW Netbeans is not in ~/)
sudo ln -f -s ~/netbeans-$NetBeansVersion/bin/netbeans /usr/bin/;

#If you use VirtualBox , you can share your projects between Host and guest. Name of shared
#folder must match 'NetBeansProjects'
mkdir -p $HOME/NetBeansProjects

if [ -f /sbin/mount.vboxsf ]
then
    sudo /sbin/umount /home/$HOME/NetBeansProjects
    sudo /sbin/mount.vboxsf NetBeansProjects $HOME/NetBeansProjects
fi

if mountpoint -q ~/NetBeansProjects
then
#Add it to the universal start script to automate process...
    sudo sed -ie '$d' $startupScript
    echo "sudo /sbin/mount.vboxsf NetBeansProjects $HOME/NetBeansProjects"| sudo tee -a $startupScript
    echo "exit 0"| sudo tee -a $startupScript
    sudo chmod +x $startupScript

#Create a mount and unmount script file and add it to users local bin
    rm -rf $tempWork/*
    echo '#!/bin/bash' > $tempWork/netbeans-mount.sh
    echo '#!/bin/bash' > $tempWork/netbeans-umount.sh
    echo '#!/bin/bash' > $tempWork/mount-from-host.sh
    echo '#!/bin/bash' > $tempWork/unmount-from-host.sh
    echo "sudo /sbin/mount.vboxsf NetBeansProjects $HOME/NetBeansProjects" >> $tempWork/netbeans-mount.sh
    echo "sudo /sbin/mount.vboxsf NetBeansProjects $HOME/NetBeansProjects" >> $tempWork/mount-from-host.sh
    echo "sudo umount $HOME/NetBeansProjects" >> $tempWork/netbeans-umount.sh
    echo "sudo umount $HOME/NetBeansProjects" >> $tempWork/unmount-from-host.sh
    echo "exit 0" >> $tempWork/unmount-from-host.sh
    echo "exit 0" >> $tempWork/mount-from-host.sh
    echo "exit 0" >> $tempWork/netbeans-mount.sh
    echo "exit 0" >> $tempWork/netbeans-umount.sh

    sudo chmod +x $tempWork/*
    sudo mv -f $tempWork/*.sh /usr/local/bin
    rm -rf $tempWork
fi

#This function is used to cleanly exit with an error code.
function error_exit {
    sleep 7
    exit 1
}
#restart
sudo reboot
exit 0

更新:在终端中手动编码卸载也无法卸载NetBeans项目文件夹。所以我想问一下,如果系统初始化挂载了该文件夹,是否可能卸载该文件夹?
更新2:仍然卡住了,但是在查看etc/mtab后我有了一些新信息。这是我看到的内容:
...
NetBeansProjects /home/yucca/NetBeansProjects vboxsf rw 0 0
NetBeansProjects /home/yucca/NetBeansProjects vboxsf rw 0 0
NetBeansProjects /home/yucca/NetBeansProjects vboxsf rw 0 0
NetBeansProjects /home/yucca/NetBeansProjects vboxsf rw 0 0
NetBeansProjects /home/yucca/NetBeansProjects vboxsf rw 0 0
NetBeansProjects /home/yucca/NetBeansProjects vboxsf rw 0 0
NetBeansProjects /home/yucca/NetBeansProjects vboxsf rw 0 0
NetBeansProjects /home/yucca/NetBeansProjects vboxsf rw 0 0
NetBeansProjects /home/yucca/NetBeansProjects vboxsf rw 0 0
NetBeansProjects /home/yucca/NetBeansProjects vboxsf rw 0 0
...

很明显,我必须多次运行sudo unmount ~/NetBeansProjects!!

额外的挂载选项如“f-l-a-t”也不起作用,因为它会卸载所有内容,而我只想要卸载目标目录。


无法卸载通常是由于某些进程仍然在挂载点内的某个位置保持文件打开状态或将其用作工作目录。只有当强制要求时,文件系统才允许在使用中卸载。 - Marc B
@MarcB,我刚刚添加了一些新信息,你能帮忙吗? - thejartender
我不知道为什么会多次挂载,但是你可以通过使用“fuser”命令找出哪些进程/用户正在占用该挂载点上的文件句柄。 - Marc B
2个回答

8

您可以使用以下命令卸载所有共享:

sudo umount -a -t vboxsf 

或者使用fusermount -u命令

sudo fusermount -u /mnt

1

我重新检查了所有的初始化文件,发现在/etc/init.d/rc.local中添加了一些额外的挂载。现在我会像这样测试存在的字符串再进行写入(以此为例):

if ! grep "JAVA_HOME=${javaUsrLib}/jdk1.7.0_01" /etc/environment

然后 echo "JAVA_HOME=${javaUsrLib}/jdk1.7.0_01" | sudo tee -a /etc/environment fi


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接