두 개의 하위 구성요소로 나눌 수 있습니다.
이 자동 설치 프로그램이 자체 마운트 지점을 생성(및 삭제)하는 이유는 무엇입니까?
이 작업을 직접 수행할 때 자체 마운트 지점을 수동으로 생성해야 하는 이유는 무엇입니까(또는 이 작업을 자동으로 수행하는 방법으로 어떻게 이동합니까?)
USB 플래시 드라이브를 시스템에 삽입할 때 발생하는 정확한 프로세스를 모르겠습니다. 많은 일이 일어나는 걸 보니...
예를 들어 기존 USB2 1GB 메모리 스틱을 삽입하는 경우:
[76187.152010] usb 3-6: new high-speed USB device number 18 using ehci-pci
[76187.285314] usb 3-6: New USB device found, idVendor=1221, idProduct=3234
[76187.285317] usb 3-6: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[76187.285319] usb 3-6: Product: Flash Disk
[76187.285321] usb 3-6: Manufacturer: USB2.0
[76187.285323] usb 3-6: SerialNumber: 100000000000099E
[76187.285627] usb-storage 3-6:1.0: USB Mass Storage device detected
[76187.285704] scsi host27: usb-storage 3-6:1.0
[76188.285460] scsi 27:0:0:0: Direct-Access USB2.0 Flash Disk 2.60 PQ: 0 ANSI: 2
[76188.285731] sd 27:0:0:0: Attached scsi generic sg11 type 0
[76188.286201] sd 27:0:0:0: [sdk] 2048000 512-byte logical blocks: (1.04 GB/1000 MiB)
[76188.291250] sd 27:0:0:0: [sdk] Write Protect is off
[76188.291255] sd 27:0:0:0: [sdk] Mode Sense: 0b 00 00 08
[76188.292333] sd 27:0:0:0: [sdk] No Caching mode page found
[76188.292337] sd 27:0:0:0: [sdk] Assuming drive cache: write through
[76188.296951] sdk: sdk1
[76188.300321] sd 27:0:0:0: [sdk] Attached SCSI removable disk
그리고 다음과 같이 설치됩니다.
/dev/sdk1 on /media/madivad/5859-77E7 type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2)
마운트 프로세스에 대한 디렉토리를 생성(그런 다음 삭제)하는 자동 마운트 프로세스에 뭔가가 있습니까?
mount
프로세스의 일부로 직접 생성하고 삭제하기 위해 명령줄에서 무언가를 식별 할 수 있습니까 umount
?
이것은 일반적으로 스크립트를 자동 생성하여 mount
처음 생성된 내용을 기억한 다음 umount
디렉터리의 내용을 삭제하는 것입니까?
제 생각에 저를 짜증나게 하는 이 프로세스의 일부는 특히 제가 테스트할 때 삭제하는 것을 잊어버린 디렉토리가 생긴다는 것입니다.
내가 원하는 것을 설치할 때 (예를 들어):
sudo mount /dev/sdk1 /mnt/usbkey1g
마운트 지점이 생성되거나 사용 중이면 경고가 표시되지만, 더 중요한 것은 마운트 지점이 존재하지 않는 경우 즉시 생성한다는 것입니다. 이번에도 umount
열쇠를 받았을 때 떼어냈습니다.
Ubuntu 14.04 LTS의 데스크톱 및 서버 버전을 모두 설치했습니다.
나는 AU가 아닌 여기서 이 질문을 하는 것입니다. 주로 이 질문을 실제 운영 체제와 관련이 없고 일반적으로 Linux와 관련하여 묻는 것이기 때문입니다. 그러나 그것은 나에게 효과적입니다. AU가 더 적합하다면 자유롭게 AU로 마이그레이션하세요.
건배.
답변1
간단히 말해서 Ubuntu에서 일어나는 일은 udisksctl
udev 규칙이 호출되고 장치가 사용자로 media 폴더에 마운트된다는 것입니다 /media/$USER/diskname
.
모든 실제적인 목적을 위해서는 udisksctl mount -b /dev/sdb1을 수동으로 실행하는 것으로 충분합니다.
장치를 실제 이름으로 바꾸십시오.
귀하의 질문에서 교차 배포판 솔루션도 요구하고 있으므로 가장 좋은 솔루션은 command 이지만 mount
아래는 udisksctl
기본적으로 명령을 에뮬레이트하는 스크립트입니다. 동적으로 설치된 디렉토리를 생성하고 , 및 명령을 사용할 수 있는 한 모든 배포판 blkid
에서 mount
작동 합니다 awk
.
소스 코드를 저장 mountStuff.sh
하고 실행 가능하게 만듭니다 chmod +x /path/to/mountStuff.sh
. 전체 경로에서 스크립트를 지속적으로 실행하지 않으려면 $PATH
변수 디렉터리 에 저장하는 것이 좋습니다.
다음과 같이 실행합니다:
skolodya@ubuntu:$ sudo ./mountStuff.sh /dev/sdb5
[sudo] password for xieerqi:
Mounted /dev/sdb5 at /media/xieerqi/0ca7543a-5463-4a07-8bbe-233a7b0bd625
#!/usr/bin/env bash
# Author: Serg Kolo
# Date: January 23, 2016
# Script Description: Helper script that
# emulates behavior of udisksctl; reads blkid
# and creates a directory where to mount, based
# on disk label or uuid
#
#
# Copyright Sergiy Kolodyazhnyy 2016
#
# Permission to use, copy, modify, and distribute this software is hereby granted
# without fee, provided that the copyright notice above and this permission statement
# appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
if [ "$(id -u)" -ne 0 ];then
printf ">>> ERR:Must be root"
exit 1
fi
if [ -z "$1" ]; then
printf ">>> ERR: Must have a parameter, e.g. /dev/sdb1"
exit 1
fi
if [ "${1%/*}" != "/dev" ];then
printf ">>> ERR: Wrong parameter; Must be a device file"
exit 1
fi
# split output of blkid into array;
# Element 0 is device, element 1 is LABEL or UUID, element 2 is filesystem
ARRAY=($( blkid | awk -v DEV="$1" '$0~DEV{ gsub(/\"/,"");gsub(/\=/," "); print $1,$3,$NF }' ))
# the username who ran script as sudo given in $SUDO_USER
if [ ! -d "/media/$SUDO_USER/${ARRAY[1]}" ];
then
mkdir "/media/$SUDO_USER/${ARRAY[1]}"
fi
mount -t "${ARRAY[2]}" -o rw,user "$1" "/media/$SUDO_USER/${ARRAY[1]}"
if [ "$?" -eq "0" ]; then
printf "Mounted %s at %s" "$1" "/media/$SUDO_USER/${ARRAY[1]}"
fi
skolodya@ubuntu:$ sudo ./mountStuff.sh /dev/sdb5
[sudo] password for xieerqi:
Mounted /dev/sdb5 at /media/xieerqi/0ca7543a-5463-4a07-8bbe-233a7b0bd625