![이미지 파일을 UnionFS 오버레이로 자동 마운트](https://linux55.com/image/87992/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20UnionFS%20%EC%98%A4%EB%B2%84%EB%A0%88%EC%9D%B4%EB%A1%9C%20%EC%9E%90%EB%8F%99%20%EB%A7%88%EC%9A%B4%ED%8A%B8.png)
UnionFS를 사용하여 시스템 시작 시 이미지 파일을 자동으로 마운트하고 사용자 정의가 가능하도록 기본 /etc 디렉토리 파일 위에 설정 파일(예: /etc/network/interfaces)을 재정의하고 싶습니다.
저는 임베디드 Linux 배포판(궁금하신 경우 커널 3.14.28)을 사용하고 있으며 시스템이 로그인 프롬프트에 도달한 후 수동으로 원하는 결과를 얻을 수 있었습니다.
이제 시스템 시작 중에 이 프로세스를 자동화하고 싶습니다.
내 생각은 /etc/fstab이 이를 달성하는 데 필요한 모든 기능을 제공한다는 것입니다. 그러나 시스템 시작 중에 FAT 파티션을 자동으로 마운트하고 이후에 UnionFS를 마운트하는 데 문제가 있습니다.
내 /etc/fstab은 다음과 같습니다:
# start: /etc/fstab file
/dev/root / auto defaults 1 1
proc /proc proc defaults 0 0
devpts /dev/pts devpts mode=0620,gid=5 0 0
usbdevfs /proc/bus/usb usbdevfs noauto 0 0
tmpfs /run tmpfs mode=0755,nodev,nosuid,strictatime 0 0
tmpfs /var/volatile tmpfs defaults 0 0
# mount the user data image and then mount the unionfs user setting overlays
/dev/mmcblk2p1/userdata.img /userdata vfat loop,auto,rw,exec 0 0
/userdata/etc /etc unionfs dirs=/userdata/etc=rw:/etc=ro,auto 0 0
# end: /etc/fstab file
시작하는 동안 다음이 표시됩니다.
...
EXT3-fs (mmcblk2p3): mounted filesystem with ordered data mode
VFS: Mounted root (ext3 filesystem) readonly on device 179:11.
devtmpfs: mounted
Freeing unused kernel memory: 352K (80e3b000 - 80e93000)
INIT: version 2.88 booting
unionfs: error accessing lower directory '/userdata/etc' (error -2)
unionfs: read_super: error while parsing options (err = -2)
Starting udev
udevd[187]: starting version 182
EXT3-fs (mmcblk2p5): using internal journal
EXT3-fs (mmcblk2p5): mounted filesystem with ordered data mode
FAT-fs (mmcblk1p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
EXT3-fs (mmcblk1p2): warning: mounting fs with errors, running e2fsck is recommended
EXT3-fs (mmcblk1p2): using internal journal
EXT3-fs (mmcblk1p2): mounted filesystem with ordered data mode
FAT-fs (mmcblk2p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
EXT3-fs (mmcblk2p2): using internal journal
EXT3-fs (mmcblk2p2): mounted filesystem with ordered data mode
EXT3-fs (mmcblk2p3): using internal journal
...
마운트 지점(/userdata)이 준비되기 전에 시스템이 UnionFS 마운트를 수행하려고 시도하는 것 같습니다. 내 이해는 /etc/fstab에 나열된 파티션이 순차적으로 마운트된다는 것입니다. 그렇지 않은 경우 알려주세요 ;)
그래서 내 질문은 다음과 같습니다.원하는 자동 마운트 효과를 얻으려면 /etc/fstab(및 기타 파일)을 어떻게 변경합니까?
미리 감사드립니다
답변1
코드 예제는 이 문서의 끝부분에 있습니다.. 이제 systemd는 fstab을 읽은 다음 fs를 병렬로 마운트하려고 시도합니다. systemd 기본 마운트 스크립트는 시작 시 생성되며, 다음에서 찾을 수 있습니다.
'run/systemd/generator'
fs에 액세스할 때만 마운트되는 fstab의 noauto 매개변수를 사용해 볼 수 있습니다. 이로 인해 어떤 경우에는 마운트 지점을 활성화하기 전에 마운트 지점에 두 번 액세스해야 하는 부작용이 있을 수 있습니다.
아마도 이 상황은 마운트 지점에 액세스하는 프로그램을 지연시켜 해결될 수 있습니다. 정말- 사실인지는 모르겠습니다. 그러나 또 다른 해결책은 fstab 읽기를 재정의하는 시스템 시작 스크립트를 만드는 것입니다. 이는 두 가지 방법으로 수행할 수 있습니다. systemd에게 마운트 옵션을 지정하는 rc.local 파일을 읽도록 지시하거나 (제 생각에는) 더 올바른 방법인 systemd 전용 스크립트를 작성하는 것입니다.
제가 제공하는 예제는 모두 다른 예제에서 찾은 설치 스크립트에서 가져온 것입니다.
나중에 이 게시물을 편집하여 이러한 스크립트를 만드는 데 도움이 된 즐겨찾는 리소스에 대한 링크를 추가하겠습니다. 두 예제 모두 두 개의 파일이 필요합니다. 면책 조항 나는 장착 지점이 표준을 충족한다고 주장하지 않습니다. 예를 들어 루트 디렉터리에 폴더를 마운트합니다. 이것은 제가 Linux에 대한 경험이 없고 제 테스트베드 시스템에서 제 방식대로 제 일을 하고 있는 동안 제가 시도한 것일 뿐입니다. 이 작업은 진행 중인 작업이며 현재 다소 성급하게 수행되고 있습니다. 이 예는 참고용일 뿐이며 내 것보다 더 엄격하게 작성하려고 노력했습니다. 또한 이러한 파일을 개선할 수 있는 방법은 여러 가지가 있다고 생각합니다. 귀하의 의견과 제안에 진심으로 감사드립니다.
1. rc-local을 사용하세요
#This file should be named /etc/systemd/system/rc-local.service
[Unit]
Description=/etc/rc.local Compatibility
ConditionFileIsExecutable=/usr/local/sbin/rc.local
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/rc.local
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
.
#Local multi-user startup script.
#this file should be named as /usr/local/sbin/rc.local and have the executable attribute set.
#!/bin/sh
mount -L BIGDATA /BIGDATA
#2do, If LABEL not found, Add failback to search for UUID
LBL=$(blkid -s LABEL $(mount | grep " / ") | cut -d "=" -f 2-2 | tr -d '"')
mount -t aufs -o dirs=/BIGDATA/mountslinks/dist-global_rw/newfiles_rw/home=rw:/BIGDATA/mountslinks/dist-global_rw/global_rw/home=rw:/BIGDATA/mountslinks/dist-local_rw/"$LBL"/home=rw none /home
mount -t aufs -o dirs=/BIGDATA/mountslinks/dist-global_rw/newfiles_rw/root=rw:/BIGDATA/mountslinks/dist-global_rw/global_rw/root=rw:/BIGDATA/mountslinks/dist-local_rw/"$LBL"/root=rw none /root
2.그냥 systemd를 사용하세요(몇 번 재부팅한 후 이 방법으로 전환했습니다. 첫 번째 방법이 작동하지 않았기 때문이 아닙니다. 사실 (내 시스템에서는) 잘 작동했습니다. 더 많은 것은 처음부터 이 방법도 배우고 싶었기 때문입니다. 이것이 더 미래 지향적이라고 생각합니다.
#this one is an edited version of the one Automatically generated by systemd-fstab-generator
[Unit]
Before=local-fs.target
[Mount]
What=/dev/disk/by-label/BIGDATA
Where=/BIGDATA
Type=ext4
Options=defaults,nofail
[Install]
WantedBy=multi-user.target
.
[Unit]
Before=local-fs.target
Requires = BIGDATA.mount
After = BIGDATA.mount
[Mount]
What=noauto,x-systemd.requires=/BIGDATA,x-systemd.automount
Where=/home/peter
Type=aufs
Options=br=/BIGDATA/mountslinks/lubuntu/new_rw/home/peter=rw:/BIGDATA/mountslinks/lubuntu/local_rw/home/peter=rw:/BIGDATA/mountslinks/lubuntu/shared_rw/home/peter=rw
[Install]
WantedBy = multi-user.target
또한 fstab 중 하나가 fstab에 매개변수를 추가하여 시스템에 마운트 순서를 알릴 수 있다고 생각합니다.