Skip to content

Instantly share code, notes, and snippets.

@80ROkWOC4j
Last active March 21, 2026 16:38
Show Gist options
  • Select an option

  • Save 80ROkWOC4j/315fbc1106acacc302bd8932c8d93be0 to your computer and use it in GitHub Desktop.

Select an option

Save 80ROkWOC4j/315fbc1106acacc302bd8932c8d93be0 to your computer and use it in GitHub Desktop.
install samba server on android termux

개요

안쓰는 구형 안드로이드폰에 외장 하드 붙여서 tailscale 내부망 nas(samba) 서버로 사용하기

준비물

안쓰는폰, pd 충전 입력 받는 usb c hub, 외장 하드

루팅 여부

외장 하드가 ext4(혹은 fat, exfat 아닌 포맷)일 경우 안드로이드 버전에 따라 안될 수 있어서 root 권한으로 mount 해줘야 함.
samba 서버도 어플도 몇개 있는데 termux가 편함.

Step

  1. 부트 로더 언락하고 루팅

    https://github.com/topjohnwu/Magisk
    국룰

    https://developer.android.com/studio/run/oem-usb?hl=ko#InstallingDriver
    fastboot 연결 하려면 드라이버 수동 설치

  2. fdroid에서 termux, termux boot, tailscale 설치, termux boot 어플은 한번 수동 실행해줘야 작동함. 그 후 배터리 최적화 전부 제외.

  3. tailscale 적절히 설정하고, 안드로이드 vpn 설정에서 항상 사용 체크, 그래야 재부팅 해도 자동 연결함

  4. 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 이름>
    
  5. 외장 하드 폰에 연결하고 장치 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 때리는게 간단할 것임.

  6. 마운트 테스트 이 가이드에서 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"
  7. 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 = 0775
    

    valid 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"
  8. 클라이언트 접속, 윈도우 11 24h2 이상이라 가정(그래야 smb 포트 지정 가능함. 그 이하면 루팅 했으니 smb 기본 포트로 바꿀 것). Z 드라이브 생성으로 가정함.

    New-SmbMapping -LocalPath "Z:" -RemotePath "\\tailscale주소\마운트주소" -TcpPort 4445 -UserName "유저이름" -Password "아까설정한비번" -Persistent $true

    해보고 잘 되는지 테스트. 파일 수정이나 다운, 새 파일 만들고 서버에서 ls -al 쳐보고 root 아닌거 확인 등.

  9. 부팅 시 자동 설정 처리 start_smb.sh home에 하나 만들기

    #!/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 모드 같은거 있으면 끄는게 좋음
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment