반응형

시놀로지 NAS는 기본적으로 임베디드 환경에 맞춘 경량 셸 BusyBox ash를 사용한다. BusyBox는 리눅스에서 자주 쓰는 기본 명령어들을 한데 묶어 제공하는 도구 모음으로, NAS 같은 임베디드 기기에서 최소한의 기능으로 동작하도록 설계되어 있다.

BusyBox ash는 기본적인 명령을 실행하기에는 충분하지만, 자동완성이나 히스토리 검색 같은 편의 기능은 zsh보다 제한적이다. NAS 셸을 자주 사용한다면 zsh만 설치해도 셸 작업이 훨씬 편해진다. zsh는 Tab 자동완성, 향상된 히스토리 탐색, 유연한 프롬프트 설정을 제공하고, oh-my-zsh까지 얹으면 플러그인을 통해 문법 강조나 Git 상태 표시 같은 기능도 쉽게 추가할 수 있다.

한편 Entware는 공유기나 NAS 같은 임베디드 기기에서 opkg를 이용해 다양한 Linux 소프트웨어를 설치/관리할 수 있는 경량 패키지 저장소다. macOS의 Homebrew, Ubuntu의 APT와 비슷하다고 보면 된다. 시놀로지 패키지 센터에 없는 다양한 도구를 설치하고 업데이트할 수 있기 때문에 zsh 환경을 구성할 때 같이 세팅해 두면 유용하다.

아래에서 zsh, oh-my-zsh, Entware 설치/구성 방법과 추천 플러그인까지 살펴보자.

 

 

zsh shell 설치


① DSM 패키지 센터 > 커뮤니티 탭에서 Z shell (with modules) 검색 후 설치

 

참고로 패키지 소스에 https://packages.synocommunity.com가 등록되어 있어야 커뮤니티 탭에서 검색할 수 있다.

 

② zsh 경로 등록. 먼저 zsh 경로를 확인한다.

 which zsh
 # /usr/local/bin/zsh

 

/etc/shells에 zsh 경로가 등록되어 있는지 확인한다. /etc/shells는 로그인 셸로 사용할 수 있는 목록을 적어둔 파일.

cat /etc/shells
# /bin/sh
# /bin/bash
# /sbin/nologin
# /bin/bash2
# /bin/ash
# /bin/bsh
# /bin/tcsh
# /bin/csh
# /bin/ksh

 

목록에 zsh 경로가 없으면 아래 명령어로 추가한다.

ZSH_PATH="$(which zsh)"
grep -qxF "$ZSH_PATH" /etc/shells || echo "$ZSH_PATH" | sudo tee -a /etc/shells

 

다시 /etc/shells 목록 확인. which zsh이 출력한 경로가 포함되어 있으면 성공.

cat /etc/shells
# ...
# /bin/ksh
# /usr/local/bin/zsh

 

zsh 기본 셸로 설정


.profile 파일 생성. .profile은 로그인 셸을 시작할 때 실행되는 사용자 초기화 파일이다.

cat > ~/.profile <<'EOF'
# Start zsh for interactive SSH sessions
if [ -t 0 ] && [ -x /usr/local/bin/zsh ] && [ -z "$ZSH_VERSION" ]; then
  exec /usr/local/bin/zsh -l
fi
EOF

 

.profile 파일 생성 확인.

cat ~/.profile

# ...
# if [ -t 0 ] && [ -x /usr/local/bin/zsh ] && [ -z "$ZSH_VERSION" ]; then
# ...

 

.profile 파일 권한 변경.

chmod 600 ~/.profile

 

나스 SSH에 다시 접속한 후 zsh 셸로 바뀌는지 확인.

ps -p $$ -o comm=
# zsh

 

 

Warp에서 zsh 적용 안되는 문제 해결


Synology DSM은 기본적으로 셸을 바꾸는 chsh(change shell)이 없다. 로그인 시 원하는 셸로 전환하려면 ~/.profile 파일에서 exec zsh를 직접 실행해야 한다.

 

Warp는 SSH 세션에 자체 Wrapper인 Warpify를 주입해 블록·자동완성 같은 기능을 활성화한다. 이 과정에서 원격 셸 초기화는 /etc/profile 만 읽어서 적용하고(source) ~/.profile 파일은 건너뛴다. 결과적으로 셸 전환이 일어나지 않아 /bin/sh(ash 계열의 기본 셸)에 머무는 문제가 발생한다.

 

해결 방법은 아래 3가지가 있다. ②번 방법이 가장 간단하다.

 

① Warp의 Warpify 기능 끄기

 

command 명령어 붙여서 접속. command는 셸의 alias, function을 우회하고 실제 명령어를 실행한다.

command ssh -p 포트번호 사용자명@나스IP
# 예: command ssh -p 22022 user@192.168.0.100

 

③ SSH 접속 시 zsh 직접 실행

# -t: 대화형 터미널(TTY) 강제 할당
# -l: 로그인 셸로 실행
ssh -t -p 포트번호 사용자명@나스IP '/usr/local/bin/zsh -l'
# 예: ssh -t -p 22022 user@192.168.0.100 '/usr/local/bin/zsh -l'

 

 

oh-my-zsh 설치


패키지 센터 > 커뮤니티 탭에서 Git 검색 후 설치.

 

나스 SSH에서 oh-my-zsh 설치.

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

 

설치 후엔 oh-my-zsh 디렉터리 권한이 너무 열려 있다는 경고 메시지가 나온다. 아래 명령어로 권한을 변경한다.

chmod -R go-w ~/.oh-my-zsh

 

zsh 다시 시작.

# -l: zsh를 로그인 셸처럼 실행하여 로그인용 초기화 파일까지 읽도록 함
exec /usr/local/bin/zsh -l

 

.zshrc 파일 상단 export PATH 라인 앞에 있는 # 제거(주석 해제).

# If you come from bash you might have to change your $PATH.
export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:$PATH

 

 

Entware(opkg) 설치


Entware는 NAS, 공유기 같은 임베디드 리눅스 환경에서 사용할 수 있는 패키지 관리자다. Entware를 설치하면  opkg  명령어로 패키지를 설치/삭제/업데이트할 수 있다. macOS의 Homebrew, Ubuntu의 APT와 비슷한 역할이라고 보면 된다.

 

먼저 NAS에 SSH로 접속해 CPU 아키텍처를 확인한다. 예를 들어 DS218+는 Intel 기반의  x86_64  모델이므로  x64  설치 스크립트를 사용하면 된다.

uname -m
# x86_64

 

DSM 업데이트/재부팅 시 루트 경로에 있는 폴더들이 초기화될 수 있기 때문에 Entware는 NAS 볼륨 아래에 설치하는 것이 좋다.

# 관리자(root) 로그인 셸로 전환
sudo -i

# Entware 설치 경로 생성
mkdir -p /volume1/@Entware/opt

 

Entware는 기본적으로 /opt 경로를 사용한다. 기존 /opt가 비어 있는지 확인한 뒤, Entware 설치 경로를 /opt에 마운트한다.

# /opt 내용 확인. 출력 항목이 없다면 OK
ls -la /opt 2>/dev/null

# /opt 폴더 생성
mkdir /opt

# Entware 실제 설치 경로를 Entware 표준 경로인 /opt에 연결
# mount -o bind <원본 디렉터리> <연결할 경로>
mount -o bind "/volume1/@Entware/opt" /opt

 

CPU 아키텍처에 맞는 설치 스크립트를 실행한다.

# for x64
wget -O - https://bin.entware.net/x64-k3.2/installer/generic.sh | /bin/sh

# 일반 사용자 셸로 복귀
exit

 

.zshrc 파일 상단의 PATH를 아래처럼 수정해서 Entware PATH를 등록한다.

export PATH="$HOME/.local/bin:/usr/local/bin:/opt/bin:/opt/sbin:$PATH"

 

source ~/.zshrc 셸을 다시 로드하면 opkg 명령어를 사용할 수 있다(sudo 권한 필요).

# 패키지 목록 업데이트
sudo opkg update

# 패키지 설치
sudo opkg install <package_name>

# 설치된 패키지 전체 업데이트
sudo opkg upgrade

# 설치된 패키지 조회
sudo opkg list-installed

# 패키지 삭제
sudo opkg remove <package_name>

 

NAS를 재부팅하면 /opt 마운트가 풀릴 수 있으므로 DSM 작업 스케줄러에 부팅 실행 작업을 추가한다. 제어판 > 작업 스케줄러 > 생성 > 트리거된 작업 > 사용자 정의 스크립트를 클릭하고 사용자는 root, 이벤트는 부트업을 선택한다.

 

[작업 설정] 탭에서 아래 스크립트를 붙여넣는다.

#!/bin/sh

# Mount/Start Entware
mkdir -p /opt
mount -o bind "/volume1/@Entware/opt" /opt
/opt/etc/init.d/rc.unslung start

# Load Entware Profile
if grep -qF '/opt/etc/profile' /etc/profile; then
  echo "Confirmed: Entware Profile in Global Profile"
else
  echo "Adding: Entware Profile in Global Profile"
  cat >> /etc/profile <<"EOF"

# Load Entware Profile
[ -r "/opt/etc/profile" ] && . /opt/etc/profile
EOF
fi

# Update Entware Package List
/opt/bin/opkg update

 

 

플러그인/패키지


기본 플러그인

oh-my-zsh에 기본 포함된 플러그인은 별도 설치 없이 .zshrc 파일의 plugins 배열에 추가해서 바로 사용할 수 있다.

plugins=(git sudo docker docker-compose history extract)

 

  • git: Git 명령어 alias, 자동완성 제공
  • sudo: ESC 두 번 누르면 명령어 앞에 sudo 추가
  • docker: Docker 명령어 alias, 자동완성 제공
  • docker-compose: Docker Compose 명령어 alias, 자동완성 제공
  • history: 히스토리 검색/조회 관련 alias 제공 (h, hs, hsi 등)
  • extract: 압축 파일 확장자에 맞는 해제 명령어를 자동으로 선택해 extract 파일명 형태로 압축 해제

 

zsh-autosuggestions / zsh-syntax-highlighting

zsh-autosuggestions: 이전 명령 기록을 바탕으로 자동 완성을 제안하는 플러그인
zsh-syntax-highlighting: 실행 가능한 명령어와 인식 불가한 명령어를 색상으로 구분하는 플러그인

 

oh-my-zsh 커스텀 플러그인 경로로 이동 후 설치.

# oh-my-zsh 커스텀 플러그인 경로로 이동
cd ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins

# zsh 자동완성 제안 플러그인 설치
git clone https://github.com/zsh-users/zsh-autosuggestions.git

# zsh 명령어 문법 하이라이팅 플러그인 설치
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git

 

.zshrc 플러그인 배열 수정. zsh-syntax-highlighting를 가장 마지막에 두는 걸 권장한다.

plugins=(...생략 zsh-autosuggestions zsh-syntax-highlighting)

 

zsh-autosuggestions의 히스토리 제안 텍스트는 다크 그레이에 가까운 fg=8 색상을 사용한다. 하지만 Synology NAS 터미널에선 이 색상이 흰색처럼 보인다. 기본 색상과 비슷하게 보이도록 .zshrc 파일에 아래 설정을 추가한다.

# 자동완성 인라인 제안 색상
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=#5f5f5f'

 

수정 전

 

수정 후

 

zsh 설정 다시 적용.

source ~/.zshrc

 

bat

구문 강조와 줄 번호를 지원하는 cat 대체 도구

 

bat는 Entware opkg 저장소에 없으므로 Linux용 바이너리를 직접 내려받아 설치해야 한다.

 

~/.local/bin 폴더 생성.

mkdir -p "$HOME/.local/bin"

 

bat 다운로드/압축해제.

cd /tmp
curl -LO https://github.com/sharkdp/bat/releases/download/v0.26.1/bat-v0.26.1-x86_64-unknown-linux-musl.tar.gz
tar -xzf bat-v0.26.1-x86_64-unknown-linux-musl.tar.gz

 

bat 실행 파일을 ~/.local/bin으로 복사.

cp bat-v0.26.1-x86_64-unknown-linux-musl/bat "$HOME/.local/bin/"
chmod +x "$HOME/.local/bin/bat"

 

~/.zshrc 파일의 PATH에 .local/bin 추가. (이미 있으면 스킵)

export PATH="$HOME/.local/bin:/usr/local/bin:/opt/bin:/opt/sbin:$PATH"

 

zoxide

자주 방문한 디렉터리를 학습해 z 명령어로 빠르게 이동하는 도구

 

Entware(opkg)로 zoxide 설치. fzf도 의존성으로 함께 설치된다.

opkg update
opkg install zoxide

 

.zshrc 파일의 PATH에 /opt/usr/bin 추가.

export PATH="$HOME/.local/bin:/usr/local/bin:/opt/usr/bin:/opt/bin:/opt/sbin:$PATH"

 

.zshrc 파일의 plugins 배열에 zoxide fzf 추가.

plugins=(...생략 zoxide fzf zsh-autosuggestions zsh-syntax-highlighting)

 

zsh 설정 다시 적용.

source ~/.zshrc

 

설치 확인.

which zoxide
# /opt/usr/bin/zoxide

zoxide --version
# zoxide 0.9.9

 

eza

아이콘과 Git 정보를 지원하는 ls 대체 도구. eza 아이콘을 올바르게 표시하려면 터미널에 Nerd Font 계열 글꼴(폰트)이 설치되어 있어야 한다.

 

설치 방법

 

Entware(opkg)로 eza 설치.

sudo opkg update
sudo opkg install eza

 

설치 확인.

which eza
# 보통 /opt/usr/bin/eza
eza --version
# v0.23.4 [+git]

 

alias 수정. (.zshrc 파일)

# ==================================================
# eza alias (oh-my-zsh alias 대체)
# ==================================================

# 공통 옵션: 디렉터리 우선 정렬 + 아이콘 + 날짜 포맷
alias ez='eza --group-directories-first --icons=auto --time-style="+%Y-%m-%d %H:%M"'
# 기본 목록
alias ls='ez'
# 숨김 포함 상세 목록. 현재/상위 디렉터리 항목 포함 + Git 정보 + 권한 숫자 + 링크 수 + 그룹
alias l='ez -lah --git --octal-permissions --links --group'
# 일반 상세 목록 + Git 정보 + 권한 숫자 + 링크 수 + 그룹
alias ll='ez -lh --git --octal-permissions --links --group'
# 숨김 포함 상세 목록. 현재/상위 디렉터리 항목 제외 + Git 정보 + 권한 숫자 + 링크 수 + 그룹
alias la='ez -lAh --git --octal-permissions --links --group'
# 숨김 포함 상세 목록. l과 동일
alias lsa='l'

# Tree 2단계 + Git 정보
alias lt='ez --tree --level=2 --git'
# 숨김 포함 Tree 2단계 + Git 정보
alias lta='ez --tree --level=2 -a --git'

 

테마 수정

# eza 설정 파일이 위치할 폴더 생성
mkdir -p ~/.config/eza

# eza 공식 테마 저장소를 ~/.config/eza/eza-themes 경로에 다운로드
git clone https://github.com/eza-community/eza-themes.git ~/.config/eza/eza-themes

# catppuccin 테마 파일을 eza가 읽는 기본 테마 파일인 ~/.config/eza/theme.yml로 연결
# ln: link 생성 명령어. 파일을 다른 이름/경로로 연결
# -s: symbolic link 생성. 원본 파일을 복사하지 않고 “바로가기”처럼 연결
# -f: force. 같은 이름의 대상 파일/링크가 이미 있으면 제거하고 새로 만듦
ln -sf ~/.config/eza/eza-themes/themes/catppuccin-mocha.yml ~/.config/eza/theme.yml

 

테마 변경 시 themes 폴더 내 원하는 테마 파일명으로 바꿔서 ln -sf 명령어를 다시 실행한다.

# one-dark 테마로 변경
ln -sf ~/.config/eza/eza-themes/themes/one_dark.yml ~/.config/eza/theme.yml
# gruvbox-dark 테마로 변경
ln -sf ~/.config/eza/eza-themes/themes/gruvbox-dark.yml ~/.config/eza/theme.yml

 

더 많은 테마는 링크에서 확인할 수 있다.

 

eza zsh completion

eza 명령어와 옵션의 자동 완성을 지원하는 zsh 스크립트

 

eza-community 저장소 클론.

mkdir -p ~/.local/share
git clone https://github.com/eza-community/eza.git ~/.local/share/eza

 

~/.zshrc에 completion 경로 추가. source $ZSH/oh-my-zsh.sh 보다 위에 위치해야 한다.

# eza completion
fpath=("$HOME/.local/share/eza/completions/zsh" $fpath)

source $ZSH/oh-my-zsh.sh

 

자동 완성 테스트 eza --g 만 입력하고 Tab 눌렀을 때 자동완성 목록 뜨면 성공.

반응형