elsa in mac

mac: Fedora-Asahi Remix (Linux), macOS와 linux에서 모두 읽기/쓰기 가능한 외장저장장치 설정하기 본문

Mac(OS X)/Asahi Linux

mac: Fedora-Asahi Remix (Linux), macOS와 linux에서 모두 읽기/쓰기 가능한 외장저장장치 설정하기

elsa in mac 2024. 1. 10. 01:07

이번 포스트에서는 macOS와 Feroda-Asahi Remix에서 모두 읽기/쓰기가 가능한 외장 저장장치나 내장 파티션을 구상하는 방법에 대해 알아 보도록 하겠습니다. 

앞서 포스트에서도 언급을 했듯이, mac에 Fedora-Asahi Remix를 설치 한 경우, Fedora에서는 mac의 APFS 디스크나 파티션이 감지는 되지만, mount 할 수 없습니다. 따라서, 자료를 공유하거나 옮기기 위해서는 APFS가 아닌 다른 파일 시스템을 사용해야 하는데, mac에서는 HFS+, exFAT, MS-DOS 등을 지원합니다. 

Fedora의 경우에는 HFS+, exFAT을 지원하지만 원칙적으로 exFAT을 제외한 HFS 계열은 read ony 즉, 읽가만 가능합니다. 따라서, 쓰기기 가능하려면 HFS+의 journaling을 off 시켜줘야 하는 단점이 있습니다. 

journaling이란, 저장 데이터의 안정성과 일관성 그리고 복구 기능을 위한 기술로 정보를 기록하는 과정에서 예상치 않던 정전이나 시스템 다운으로 인한 강제 전원 OFF 같은 일이 발생했을 때, 데이터 손실을 최소화 시키고 복구시키기 위한 정책을 말합니다. 

그럼, exFAT을 사용하면 되지 않느냐 할 수 있겠지만, exFAT의 경우에는 파일이나 디렉토리등에 대한 권한 설정기능등이 없고, 대/소문자를 구분하지 않는 등 단점이 많은 파일시스템으로 단순 대용량 자료를 공유하는 수준에서는 문제가 없지만, 데이터를 직접 외장하드에서 관리하는 경우에는 macOS에서든 Linux 에서든 제약이 많은 파일 시스템 입니다.  

journaling을 OFF 시킨다는 점에 있어서는 저장장치의 안정성이 저하되는 문제가 남아 있기는 하지만, 그 예외 케이스라는 것이 그리 흔히 발생할 수 있는 것이 아닌 바, 비 정상적으로 외장저장장치를 분리만 하지 않는다면.. 그리 우려할 것은 아니라고 볼 수 있습니다. 물론, 매우 중요한 데이터의 경우 각 OS의 내장 저장장치에 백업해야 합니다.

외장 저장장치나 내부 저장소를 파티션으로 나눈 경우, 해당 파티션을 포멧할 때 위와 같이 HFS+인 Mac OS 확장(대소문자 구분, 저널링)으로 선택을 해 줍니다.  파티션 포멧이 정상적으로 완료되면, 터미널 앱을 열고, 아래와 같이 설정을 해 줍니다. 

위와 같이 예를 들어, 해당 파티션의 이름을 "storage-usb" 라고 설정을 했다고 가정하면, 아래와 같이 명령을 내리면 됩니다.

diskutil disableJournal /Volumes/storage-usb

그럼 "Journaling has been disabled for volume ..." 이렇게 안내 메시지가 나타나게 됩니다. 

Fedora에서 해당 외장장치를 연결하고, mout하는 방법은 크게 2가지가 있습니다. 첫번째 방법은 GUI File Manager를 사용하는 것으로 이 경우에는 자동으로 mount를 해 줍니다. mount 포인트는 /run/media/(자신의 계정명) 디렉토리 밑으로 붙게 됩니다.  해당 디렉토리의 소유자와 그룹도 root가 아닌 자신의 계정으로 설정되게 됩니다.

두번째 방법 GUI File Manager를 사용하지 않고, 터미널에서 자신이 원하는 디렉토리로 mount 시키는 것 입니다.  이 방법을 사용하기 위해서는 GUI File Manager를 사전에 실행하면 안됩니다. 아래 글은 이 두번째 경우와 관련된 설명합니다.

우선 mount를 할 디렉토리를 만들어 줍니다.  예를 들어, root에 /Storage 를 만들고, 여기에 외장저장장치를  mount 한다고 가정합니다. 그리고, mount할 장치(디바이스)를  확인해야 합니다. 장치명은 lsblk -l -o NAME,FSTYPE,SIZE,LABEL 명령으로 확인할 수 있습니다.

❯ lsblk -l -o NAME,FSTYPE,SIZE,LABEL  <-- 소문자 L, 소문자 O
NAME      FSTYPE    SIZE LABEL
sda               465.8G 
sda1      vfat      200M EFI
sda2              465.4G 
sda3      hfsplus   128M Boot OS X
sdb               465.8G 
sdb1      vfat      200M EFI
sdb2      apfs    465.4G 
sdb3      hfsplus   128M Boot OS X
sdc               238.5G 
sdc1      vfat      200M EFI
sdc2      apfs      172G 
sdc3      hfsplus  55.7G Kali-fedora  <--- 이 녀석이죠
sdc4      exfat    10.4G Kali-exfat
zram0               7.3G 
nvme0n1           233.8G 
nvme0n1p1 apfs      500M 
nvme0n1p2 apfs    181.6G 
nvme0n1p3 apfs      2.3G 
nvme0n1p4 vfat      500M EFI - ASAHI
nvme0n1p5 ext4        1G BOOT
nvme0n1p6 btrfs    42.8G fedora
nvme0n1p7 apfs        5G 
nvme0n2               3M 
nvme0n3             128M

위의 예시를 보자면 /dev/sdc3가 되겠습니다. 이 장치를 마운트를 시키는 방법은 아래와 같습니다.

sudo mount -t hfsplus -o rw,sync /dev/sdc3 /Storage

원칙적으로 mount는 root 권한으로 설정해야 하기 때문에 mount된 /Storage는 소유주가 root가 됩니다. 따라서, 경우에 따라 소유권을 변경해야 한다면, mount 후에 chown 을 이용하여 변경해 주어야 합니다. /Storage 디렉토리를 만들고 소유권을 사전에 변경해 봐야, mount 시점에 root로 다시 바뀌게 됩니다.

아래는 55.7G 용량의 Apple HFS/HFS+ 외장 디스크를 mount하고, chown으로 소유권을 변경하는 스크립트 입니다.

#!/bin/bash

# 마운트 지점 및 디바이스 설정
MOUNT_POINT="/Storage"

device_info=$(lsblk -l -o NAME,FSTYPE,SIZE | awk '$2 ~ /hfsplus/ && $3 == "55.7G" {print $1}')

# 55.7G 용량의 hfsplus 디바이스가 발견 되었다면,
if [ -n "$device_info" ]; then
    echo "Found Apple HFS/HFS+ device: $DEVICE"

    DEVICE="/dev/$device_info"

    # 마운트
    /bin/mount -t hfsplus -o rw $DEVICE $MOUNT_POINT

    # 마운트가 정상적으로 되었는지 확인
    if mountpoint -q $MOUNT_POINT; then
        echo "Mount successful. Changing ownership..."

        # 마운트가 정상적으로 되었다면 소유자 및 그룹 변경
        chown -R elsa:elsa $MOUNT_POINT

        echo "Ownership changed successfully."
    else
        echo "Mount failed. Check the error messages for more details."
    fi
# 발견되지 않았다면..
else
    echo "No Apple HFS/HFS+ device with size 55.7G found."
fi

위의 코드는 제가 사용하는 예 이므로, 참고만 하시기 바랍니다.

예를 들어, 위의 스크립트를 mount_storage.sh 이름으로 /usr/local/bin/ 에 저장합니다. shell 에서 chmod +x mount_storage.sh를 해주면, 이 후 부터는 ./mount_storage.sh 만 실행해 주면 됩니다.  해당 장치를 unmount 하려면 sudo unmount /Storage  명령을 내리면 됩니다.  

 

* fstab의 변경은 주의!
매번 로그인을 하고, shell에서 위의 스크립트를 실행하여 mount 시키는 것은 굉장히 구시대적이고 번거로운 일일 수 있습니다.  부팅 시, 자동으로 해당 디스크를 mount 시켜 주기 위해서는 /etc/fstab에 관련 내용을 추가해 주어야 하는데, 이미 linux에 익숙하신 분들이라면 문제 없이 잘 작성하고 잘 사용하겠지만, linux 초보인 분들의 경우에는 일단 추천하지 않습니다.

이유는 fstab의 내용이 잘못되었거나 혹은 외장하드의 연결에 변경이 생겨 booting 시 해당 디스크를 mount 시키지 못할 경우 부팅오류가 발생하여 영원히 부팅에 실패하게 됩니다. 이렇게 되면 파티션 다 지우고, mac에서 다시 처음부터 설치해야 합니다. 일반적인 linux라면 별도의 USB stick 에 live linux 이미지를 넣고 USB로 부팅하여 수정하면 되지만, mac에 설치한 asahi linux의 경우 외장 USB로 부팅시키는 명확한 방법과 절차가 아직 나온 것이 없습니다. recorvery USB stick 을 만들고, U-boot, Grub 부트로더에서 usb stick을 부팅 시켜야 하는 매우 복잡하고 전문적인 과정을 거처야 합니다.

따라서, 조금 불편하더라도 그냥 shell에서 mount/umount 해서 사용하실 것을 권해 드립니다.

 

* 그럼에도 불구하고 booting 시 자동으로 마운트 하기
위에서 언급했듯이, fstab을 건드리는 것은 초보자 분들에게는 위험할 수 있습니다. 인터넷를 검색하거나 chat-GPT 에 물어 보고, fstab을 수정했다 하더라도, 실제 실행해 보기 전에는 문제가 있는지 없는지 정확히 알 수 없습니다. 위험한 도전이죠.  그 보다는 다른 대안을 사용하는 것이 좋습니다. 위의 shell script는 HFS+ 파일시스템이면서 저장용량이 XX인 장치를 마운트 하는 것이며, 조건에 맞지 않는 경우 mount를 하지 않습니다. 따라서, mount 못했다고 부팅이 불가하거나 하지 않습니다.  이제 남은 것은 저 shell script를 부팅시에 자동으로 실행 시키기만 하면 되는 것입니다.

이 목적을 달성하기 위해 systemd service를 사용합니다.

우선, mount_storage.service 라는 파일 이름으로 아래의 내용을 작성합니다.

[Unit]
Description=ㅡount Storage Service
After=sddm.service

[Service]
ExecStart=/usr/local/bin/mount_storage.sh

[Install]
WantedBy=multi-user.target

description은 이 service에 대한 설명이고, after에서 sddm.service가 실생된 이후 실행되도록 합니다. 실행할 서비스는 mount_storage.sh를 실행하는 것이지요.

다음으로, umount_storage.service도 아래와 같이 정이를 해 줍니다.

[Unit]
Description=Umount Storage Service
Before=shutdown.target reboot.target halt.target

[Service]
type=oneshot
ExecStart=/usr/local/bin/umount_storage.sh

[Install]
WantedBy=shutdown.target reboot.target halt.target

실횅 조건은 before로 shutdown, reboot, halt 등의 이벤트가 발생할 경우, 그 전에 실행 합니다. 서비스는 oneshot으로 해당 서비스를 실행하고 나면 서비스가 종료 되게 합니다. 실행할 것은 umount_storage.sh 입니다.

mount_storage.service와 umount_storage.service 파일은 /etc/systemd/system/ 밑으로 이동 시킵니다. 이제 reboot을 한 후, 해당 서비스들이 정상적으로 동작하는지를 확인합니다. 

 

* mount를 시켰는데 쓰기가 안돼 ?!
절차대로 mount헤서 잘 사용을 하고 있었는데,  어느 시점에 갑자기 쓰기가 되지 않는다면.. mount가 rw가 아닌 ro로 된 것일 수 있습니다. 이 경우 터미널에서 mount 상태를 확인해 봐야 합니다.

위의 스샷을 보면, /dev/sdc3가 rw로 설정되어 있는 것을 볼 수 있습니다. 이는 read/write가 가능한 상태임을 의미 합니다. 만약, rw가 아니고 ro로 되어 있다면, read only 상태로 마운트 된 것을 의미합니다.

이 경우에는 macOS로 부팅을 한 후, disk utility app을 열고 해당 파티션을 선택한 후, 마우스 오른쪽 버튼을 눌러, "검사/복구"를 실행 해 줘야 합니다. 또는 fedora에서 아래의 명령을 수행하여 hfsplus filesystem에 대한 검사/복구를 수행합니다.

이를 위해서는 우선, fedora에서 hfsplus-tools 패키지를 설치 해 줍니다.

sudo dnf install hfsplus-tools

그리고, 아래와 같이 fsck.hfsplus 명령을 사용하여 검사/복구를 수행해 준 후, umount > mount 순으로 해 주면 됩니다.

sudo fsck.hfsplus -f /dev/sdc3
sudo umount /dev/sdc3
sudo mount -t hfsplus -o rw,sync /dev/sdc3 /Storage

 


GUI File Manager를 열어 자동으로 마운트를 하던, 로그인 후 터미널에서 마운트를 하던, fstab을 커스텀 하던, 아니면 systemd service를 이용하여 자동으로 부팅 시 마운트를 하던 어떤 방법을 사용할지는 본인의 선택입니다. 각기 장단점이 있으니 본인에게 맞는 방법을 사용하면 됩니다. fstab을 이용하는 방법만 조심하면 됩니다.

 

공유하기 링크
Comments