안쓰는 구형 안드로이드폰에 외장 하드 붙여서 tailscale 내부망 nas(samba) 서버로 사용하기
안쓰는폰, pd 충전 입력 받는 usb c hub, 외장 하드
외장 하드가 ext4(혹은 fat, exfat 아닌 포맷)일 경우 안드로이드 버전에 따라 안될 수 있어서 root 권한으로 mount 해줘야 함.
samba 서버도 어플도 몇개 있는데 termux가 편함.
-
부트 로더 언락하고 루팅
https://developer.android.com/studio/run/oem-usb?hl=ko#InstallingDriver
fastboot 연결 하려면 드라이버 수동 설치 -
fdroid에서 termux, termux boot, tailscale 설치, termux boot 어플은 한번 수동 실행해줘야 작동함. 그 후 배터리 최적화 전부 제외.
-
tailscale 적절히 설정하고, 안드로이드 vpn 설정에서 항상 사용 체크, 그래야 재부팅 해도 자동 연결함
-
termux에 ssh(컴으로 접속해서 하는게 편함)와 필요한 것들과 있으면 편한것들 설치.
pkg update pkg upgrade pkg install openssh rsync git util-linux e2fsprogs procps blk-utils nano samba whoami passwd ssh-keygen -A sshd -t sshd
이제 접속
ssh -p 8022 <whoami>@<폰 tailscale magicdns 이름> -
외장 하드 폰에 연결하고 장치 uuid 찾기
su /data/data/com.termux/files/usr/bin/lsblk -b --output NAME,SIZE,TYPE,FSTYPE,UUID,MOUNTPOINTS /data/data/com.termux/files/usr/bin/blkid cat /proc/partitions
결과 중에서 크기가 딱 봐도 큰것의 uuid 기억하기. 보통은 sda 일 것이니 바로 grep 때리는게 간단할 것임.
-
마운트 테스트 이 가이드에서 samba 접속은 termux user 사용할 것이고, smb가 사용하는 유저는 system으로 고정할 것임. 보통 리눅스 유저 id가 1000 시작인데 안드로이드에선 그게
system임. 그래서 이미 사용하던 ext4 외장하드를 termux에서ls -al찍었을 때 외장 하드 내용물이system것으로 나올 수 있음.
이하 내용에서 파일 owner가 유저 id 1000(system) 쓴다고 가정하고 가이드 작성함. 이는 외장 하드 여기저기 꽂을 수 있는 상황에서 user id 1000을 가급적 유지하고 싶어서 그렇게 한 것임. 간단하게유저 이름과system구분 안하고 통일해도 무방함.id -u # 10206 나왔다고 가정, 아래 chown 할거임 id -g # 10206 나왔다고 가정, 아래 chown 할거임 su mkdir -p /data/local/mnt/마운트할디렉토리이름 chown 10206:10206 /data/local/mnt/마운트할디렉토리이름 chmod 770 /data/local/mnt/마운트할디렉토리이름
스크립트로 테스트(상남자면 스킵)
PREFIX=/data/data/com.termux/files/usr UUID="여기에 아까 찾은 uuid 입력" MNT="/data/local/mnt/마운트할디렉토리이름" mkdir -p "$MNT" DEV="$($PREFIX/bin/findfs UUID=$UUID)" mount -t ext4 -o rw,noatime "$DEV" "$MNT" $PREFIX/bin/findmnt "$MNT" ls -lah "$MNT"
-
smb 설정 및 실행 아래 내용으로
/data/data/com.termux/files/usr/etc/samba/smb.conf만들기mkdir -p /data/data/com.termux/files/usr/etc/samba nano /data/data/com.termux/files/usr/etc/samba/smb.conf
[global] workgroup = WORKGROUP server role = standalone server security = user map to guest = Never server min protocol = SMB2_02 disable netbios = yes smb ports = 4445 log file = /data/data/com.termux/files/usr/var/log/samba/log.%m max log size = 20 load printers = no printing = bsd printcap name = /dev/null disable spoolss = yes [마운트이름] path = /data/local/mnt/마운트이름 browseable = yes read only = no guest ok = no valid users = 유저이름 force user = system inherit owner = unix only inherit permissions = yes create mask = 0664 directory mask = 0775valid user는 termux user, 실제 force use는 system에 유의. 저기서 inherit owner 해줘야 외장 하드 쓰는데 파일 주인이 전부 root가 되는 것을 막을 수 있음.
testparm으로 체크su -c "/data/data/com.termux/files/usr/bin/testparm -s /data/data/com.termux/files/usr/etc/samba/smb.conf"그리고 smb 유저 등록하고 실행
su -c "/data/data/com.termux/files/usr/bin/smbpasswd -c /data/data/com.termux/files/usr/etc/samba/smb.conf -a 유저이름" # 사용할 smb 비번 입력 su -c "/data/data/com.termux/files/usr/bin/smbd -F --debug-stdout --configfile=/data/data/com.termux/files/usr/etc/samba/smb.conf"
-
클라이언트 접속, 윈도우 11 24h2 이상이라 가정(그래야 smb 포트 지정 가능함. 그 이하면 루팅 했으니 smb 기본 포트로 바꿀 것). Z 드라이브 생성으로 가정함.
New-SmbMapping -LocalPath "Z:" -RemotePath "\\tailscale주소\마운트주소" -TcpPort 4445 -UserName "유저이름" -Password "아까설정한비번" -Persistent $true
해보고 잘 되는지 테스트. 파일 수정이나 다운, 새 파일 만들고 서버에서 ls -al 쳐보고 root 아닌거 확인 등.
-
부팅 시 자동 설정 처리
start_smb.shhome에 하나 만들기#!/data/data/com.termux/files/usr/bin/sh PREFIX=/data/data/com.termux/files/usr HOME=/data/data/com.termux/files/home PATH=$PREFIX/bin:/system/bin:/system/xbin:/vendor/bin export PREFIX HOME PATH UUID="하드 uuid 여기" MNT="/data/local/mnt/마운트이름" CONF="$PREFIX/etc/samba/smb.conf" SMBD="$PREFIX/bin/smbd" LOG="$HOME/smb.log" LOCKDIR="$HOME/.start_smb.lock" # 만약 디스크 전체 노출하는게 아니라 특정 디렉토리만 노출하게 설정했을 경우 이거 수정 READTEST="$MNT" log() { printf '[%s] %s\n' "$(date '+%F %T')" "$*" >> "$LOG" } # 중복 실행 방지 if ! mkdir "$LOCKDIR" 2>/dev/null; then log "another start_smb.sh is already running; exit" exit 0 fi trap 'rmdir "$LOCKDIR" 2>/dev/null' EXIT HUP INT TERM termux-wake-lock >/dev/null 2>&1 log "==== start ====" # 부팅 완료 대기 i=0 while [ "$i" -lt 90 ]; do SYS_BOOT="$(getprop sys.boot_completed 2>/dev/null)" DEV_BOOT="$(getprop dev.bootcomplete 2>/dev/null)" if [ "$SYS_BOOT" = "1" ] || [ "$DEV_BOOT" = "1" ]; then break fi sleep 2 i=$((i + 1)) done log "boot props: sys.boot_completed=${SYS_BOOT:-?} dev.bootcomplete=${DEV_BOOT:-?}" # 부팅 완료 직후도 너무 이른 경우가 있어서 추가 대기 POST_BOOT_DELAY=30 log "post-boot delay ${POST_BOOT_DELAY}s" sleep "$POST_BOOT_DELAY" # UUID로 디바이스 찾기 DEV="" i=0 while [ "$i" -lt 60 ]; do DEV="$(su -c "$PREFIX/bin/blkid -U $UUID" 2>/dev/null | tr -d '\r\n')" if [ -n "$DEV" ] && su -c "[ -b '$DEV' ]"; then break fi if [ $((i % 5)) -eq 0 ]; then log "waiting for device uuid=$UUID" fi sleep 3 i=$((i + 1)) done if [ -z "$DEV" ]; then log "device not found for uuid=$UUID" exit 1 fi log "device=$DEV" # 파일시스템 타입 자동 감지, 실패 시 ext4 fallback FSTYPE="$(su -c "$PREFIX/bin/blkid -o value -s TYPE '$DEV'" 2>/dev/null | tr -d '\r\n')" [ -n "$FSTYPE" ] || FSTYPE="ext4" log "fstype=$FSTYPE" su -c "mkdir -p '$MNT'" >>"$LOG" 2>&1 # 이미 마운트됐으면 재마운트 안 함 if su -c "grep -qs ' $MNT ' /proc/mounts"; then log "already mounted" else i=0 MOUNT_OK=0 while [ "$i" -lt 15 ]; do if su -c "mount -t '$FSTYPE' -o rw,noatime '$DEV' '$MNT'" >>"$LOG" 2>&1; then MOUNT_OK=1 break fi log "mount failed; retry=$((i + 1))" sleep 4 i=$((i + 1)) done if [ "$MOUNT_OK" -ne 1 ]; then log "mount failed permanently" su -c "grep '$MNT' /proc/mounts" >>"$LOG" 2>&1 exit 1 fi fi su -c "grep ' $MNT ' /proc/mounts" >>"$LOG" 2>&1 # 실제 접근 가능 여부 확인 if ! su -c "ls '$READTEST' >/dev/null 2>&1"; then log "mounted but not readable: $READTEST" exit 1 fi # 기존 samba 데몬 정리 su -c "pkill -x smbd 2>/dev/null; pkill -x nmbd 2>/dev/null" >>"$LOG" 2>&1 sleep 1 # smbd 시작 if su -c "'$SMBD' -D --configfile='$CONF'" >>"$LOG" 2>&1; then sleep 2 if su -c "ps -A | grep -q '[s]mbd'"; then log "smbd started" else log "smbd start command returned, but process not found" exit 1 fi else log "failed to start smbd" exit 1 fi log "==== done ===="
그리고
~/.termux/boot/여기에 스크립트 추가해주면 폰 켜질 때 termux가 non-iteractive shell로 실행해줌#!/data/data/com.termux/files/usr/bin/sh termux-wake-lock # ssh pkill sshd 2>/dev/null /data/data/com.termux/files/usr/bin/sshd >> /data/data/com.termux/files/home/boot-services.log 2>&1 # smb PREFIX=/data/data/com.termux/files/usr HOME=/data/data/com.termux/files/home PATH=$PREFIX/bin:/system/bin:/system/xbin:/vendor/bin export PREFIX HOME PATH LOG="$HOME/boot-startup.log" { echo "==== $(date) startup.sh begin ====" sleep 20 nohup "$HOME/start_smb.sh" >/dev/null 2>&1 & echo "==== $(date) startup.sh launched start_smb.sh ====" } >>"$LOG" 2>&1
- 외장 하드 sleep 모드 같은거 있으면 끄는게 좋음