page-icon
개발
ubuntu로 nas 구축
sooros5132-avatarsooros51323/23/2023설정 Ubuntu
ubuntu 20버전을 3년정도 쓰다가 오랜만에 버전업을 시켜주려고 하는데 또 검색하기 귀찮아서 이번엔 nas를 구축할때 얻은 정보들을 적어놓았다.
첫번째로 하는게 우분투를 설치하면 vim을 재설치를 한다. 처음에 vim-tiny가 설치되어 있어서 vim으로 재설치를 한다 vim으로 변경하면 syntax highlighting, 편집할 때 키보드의 방향키들도 잘 먹힌다. vi로 편집하려는 대상이 디렉토리면 파일 목록도 띄워줌. 여러모로 편리한 기능이 추가된다.
bash
sudo apt remove vim-tiny
sudo apt install vim
hostnamectl명령어로 변경할 수 있다. 변경하면 바로 적용되니 터미널을 다시 키거나 재부팅 하면 바뀐 hostname으로 보인다.
bash
sudo hostnamectl set-hostname [설정할 이름]
superuser 비밀번호 설정 방법이다.
bash
sudo passwd
우분투엔 ssh client는 기본적으로 설치가 되어있는데 server는 없다. openssh-server 설치하고 상태를 확인. 아래처럼 초록불이 들어오면 정상 작동하는 상태이다
bash
sudo apt install openssh-server
# 상태 확인
systemctl status ssh
sshd_config이란 파일이 설정 파일인데 port 변경이나 sftp를 설정할 수 있다.
bash
sudo vi /etc/ssh/sshd_config
Port 22부분을 주석 풀고 수정하자. 22번 포트가 ssh의 기본 포트인데 보안상 수정하고 싶다면 변경 가능하다.
ssh의 기능중 ftp보다 보안이 강화된 보안프로토콜을 사용하는 SFTP(Secure File Transfer Protocal)가 있는데 맨 아래쯤에 Subsystem sftp /usr/lib/openssh/sftp-server 부분을 주석처리하고 맨 아래에 코드를 추가하면 된다.
bash
# 해당 사용자 허용, 더 추가하고 싶다면 스페이스바로 구분한다.
AllowUsers [사용자] [사용자2]

Subsystem sftp internal-sftp -f AUTH -l VERBOSE
변경 다 했다면 재실행해서 적용
bash
sudo systemctl restart ssh
smb 프로토콜을 사용해 같은 로컬 네트워크 환경에서 파일공유를 할 수 있게 해준다. 속도가 매우 빠른것이 장점. disk 속도만 받쳐주면 공유기의 최대 속도로 파일 복사가 가능하다. 요즘 표준인 1Gbps속도가 나온다. VPN 서버를 만들고 연결하면 smb에 동일하게 접근할 수 있다.
bash
sudo apt install samba
우분투의 사용자와는 별도로 smbpasswd 명령어를 이용해 samba에 사용자를 등록해 줘야 한다.
bash
smbpasswd -a [사용자명] # 사용자 추가
smbpasswd -x [사용자명] # 사용자 제거

smbpasswd [사용자명] # 사용자 비밀번호 변경

smbpasswd -d [사용자명] # 사용자 일시적 비활성화
smbpasswd -e [사용자명] # 사용자 활성화

# 설정파일에서 `null passwords = yes` 설정을 해야 비밀번호 없이 로그인 가능
smbpasswd -n [사용자명] # 비밀번호 없이 로그인 가능하게 설정
root사용자는 다른 사용자도 설정이 가능하다.
bash
sudo smbpasswd [옵션] [사용자] [패스워드]
bash
sudo pdbedit -L
sudo pdbedit -L -v # 자세히
설정 파일에서 workgroup, 예외 파일, 공유, 휴지통 설정등을 할 수 있다.
bash
sudo vi /etc/samba/smb.conf
맥에서 samba를 이용하면 탐색기의 임시 파일들이 생기는데 없애고 싶은 마음이 든다.
맥: .DS_Store, ._*, 윈도우: Thumbs.db
[global]바로 아래에 추가하면 된다.
bash
delete veto files = Yes
veto files = /.DS_Store/._*/Thumbs.db/
맨 위에 적는[공유 경로] 대괄호 안에 들어가는 게 smb://원격주소/공유 경로가 된다. path는 공유하고 싶은 경로
bash
[공유 경로]
comment = share data
path = /[공유하고 싶은 경로]
browseable = no
guest ok = no
writeable = no
valid users = [사용자명]
read list = [사용자명]
write list = [사용자명]
create mask = 0644
directory mask = 0755
자세한 설정은 https://info-lab.tistory.com/2
vfs module기능을 이용해 휴지통 기능을 쓸 수 있다. samba이용시 파일을 삭제하면 설정해둔 경로로 파일이 이동한다. 아래는 공유 최상단의 .recycle 폴더로 이동하게 했음.
⚠️
휴지통 기능은 안될수도 있으니 꼭 테스트 해보고 사용하길 바람
bash
[이름] # 네트워크에 보이는 이름
comment = share data # 설명
path = /[공유하고 싶은 경로] # 공유할 디렉토리
browseable = no # 네트워크에서 보일지 여부
guest ok = no # 게스트 접근가능 여부
writeable = no # 다른 사용자 쓰기 권한 여부
valid users = [사용자명] # 해당 사용자 접근
read list = [사용자명] # 해당 사용자 읽기 허용
write list = [사용자명] # 해당 사용자 쓰기 허용
create mask = 0644 # SMB를 통해 생성된 파일 권한 644
directory mask = 0755 # SMB를 통해 생성된 디렉토리 권한 755
# 아래부턴 휴지통 기능
vfs objects = recycle
recycle:repository = .recycle
recycle:directory_mode = 0744
recycle:subdir_mode = 0744
recycle:keeptree = yes
recycle:versions = yes
recycle:touch = no
recycle:touch_mtime = no
recycle:maxsize = 0
recycle:touch_mtime = no
#recycle:exclude = *.bak
recycle:exclude_dir = .recycle
옵션은 cp명령어랑 비슷하게 작동한다. -r 폴더 복사 -a 아카이브 모드 -p 권한 유지 -c 압축 복사 -P 포트번호
bash
# 로컬에서 원격으로 보낼 때
scp [옵션] [파일 위치] [유저 이름]@[원격주소]:[보낼 위치]

# 원격에서 로컬로 받을 때
scp [옵션] [유저 이름]@[원격주소]:[파일 위치] [받을 위치]
해당 유저 패스워드를 입력하면 잘 복사가 되는 모습.
설정을 다 했다면 재실행
bash
sudo systemctl restart smbd
리눅스에선 runlevel모드를 변경할 수 있다. 저사양으로 돌리고 싶을 때 graphical 모드 말고 multi-user 모드가 있는데 이 모드로 하면 gnome, 다른 gui들이 실행 안되다 보니 성능상 많이 아낄 수 있다. ubuntu desktop을 설치하고 multi-user적용한 것과 ubuntu server와 성능차이가 얼마나 날진 모르겠는데 multi-user로 하고 top명령어로 보면 idle시 cpu가 0~1% 사용된다.
bash
# multi-user 모드로 설정(CLI 모드)
sudo systemctl set-default multi-user.target

# graphical 모드로 설정(GUI 모드)
sudo systemctl set-default graphical.target
multi-user level 적용 모습
이럴꺼면 server모드로 설치하면 어떨까 했는데 아직 리눅스를 잘 다루지 못하다 보니 gui가 어쩌다 한번씩 필요하다..
우분투엔 top이란 명령어가 내장되어 있다. 하지만 이 top은 ui가 너무 구려서 좀 더 이쁜 버전으로 보자.
bash
sudo apt install bpytop
top만 쓰다가 bpytop을 알게 됐는데 신세계다 htop도 있는게 bpytop이 더 이쁜 듯
neofetch 명령어 입력시 간단한 시스템 정보를 보여준다.
bash
sudo apt install neofetch
neofetch 명령어를 입력하면 아래와 같이 나온다.
bash
vi ~/.bashrc
홈 디렉토리에 .bashrc 란 파일이 있는데 이 파일의 마지막줄에 neofetch를 추가하면 된다.
zsh사용시엔 .zshrc파일을 수정하면 된다.
cloudflare를 이용하면 와일드카드 발급, 발급시에 도메인 인증 등을 간편하게 할 수 있다. 이때 cloudflare 계정의 Global Api Key를 요구한다.
bash
# /root에 .secrets 폴더를 생성
sudo mkdir /root/.secrets

# certbot-cloudflare.ini 파일 만듦 + 파일 수정
sudo vi /root/.secrets/certbot-cloudflare.ini
https://dash.cloudflare.com/profile/api-tokens 에서 Global Api Key를 볼 수 있다. certbot-cloudflare.ini파일 안에 정보에 맞게 수정하고 저장
bash
dns_cloudflare_email = example@gmail.com
dns_cloudflare_api_key = abcdefg12345678
root만 접근 가능하게 권한 수정
bash
sudo chmod 0700 /root/.secrets
sudo chmod 0400 /root/.secrets/certbot-cloudflare.ini
certbot, certbot cloudflare 플러그인 설치
bash
sudo apt install certbot python3-certbot-dns-cloudflare
sudo apt install python3-certbot-dns-cloudflare
sudo certbot certonly --dns-cloudflare --preferred-challenges dns-01 --dns-cloudflare-propagation-seconds 20 --dns-cloudflare-credentials /root/.secrets/certbot-cloudflare.ini -d example.com -d *.example.com
20은 대기 시간인데 보통 20초면 됐었다. 도메인 이름도 변경하고 발급받자
이메일 설정, 약관 동의, 정보 수신 동의 등을 하면 머라머라 많이 나오는데 Congratulations!가 나오면 성공.
인증서는 90일 동안 유효하기 때문에 제때 재발급을 해줘야 하는데 우분투 17.10 버전 이상은 자동으로 재발급 봇이 작동하고 있어서 신경을 쓰지 않아도 된다.
bash
# 재발급 봇 작동하는지 확인
sudo systemctl status certbot.timer
그래도 재발급 테스트를 해보려면 --dry-run 을 붙여서 해주면 된다.
bash
sudo certbot renew --dry-run
인증서가 갱신되면 새로 발급 받은 인증서를 nginx에도 재발급된 인증서를 제때 적용을 시켜줘야 갱신이 제대로 된다. bot의 hook기능이 있어서 이걸 이용하면 된다.
certbot-deploy-hook.sh 파일 생성, 수정
bash
sudo vi /etc/letsencrypt/renewal-hooks/deploy/certbot-deploy-hook.sh
certbot-deploy-hook.sh 안에 아래 내용 추가하고 저장하자
bash
#!/bin/bash

/bin/systemctl reload nginx
certbot-deploy-hook.sh에 실행권한 추가
bash
sudo chmod u+x /etc/letsencrypt/renewal-hooks/deploy/certbot-deploy-hook.sh
apt에 기본적으로 fpm 패키지가 없다. ppa:ondrej/php저장소를 추가해서 리스트를 받아온다.
bash
sudo add-apt-repository ppa:ondrej/php
bash
sudo apt install php8.2-fpm
기타 많이 쓰는 플러그인들인데 선택사항이다. 설치 하는것을 추천함
bash
apt install php8.2-fpm php8.2-gd php-json php8.2-mysql php8.2-curl php8.2-mbstring php8.2-intl php-imagick php8.2-xml php8.2-zip
nginx를 사용할 떄fastcgi_params 파일도 권장사항대로 수정해야 한다. fastcgi_params파일 내용을 아래 내용으로 교체
bash
sudo vi /etc/nginx/fastcgi_params
bash
fastcgi_param   QUERY_STRING            $query_string;
fastcgi_param   REQUEST_METHOD          $request_method;
fastcgi_param   CONTENT_TYPE            $content_type;
fastcgi_param   CONTENT_LENGTH          $content_length;

fastcgi_param   SCRIPT_FILENAME         $document_root$fastcgi_script_name;
fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
fastcgi_param   PATH_INFO               $fastcgi_path_info;
fastcgi_param   PATH_TRANSLATED         $document_root$fastcgi_path_info;
fastcgi_param   REQUEST_URI             $request_uri;
fastcgi_param   DOCUMENT_URI            $document_uri;
fastcgi_param   DOCUMENT_ROOT           $document_root;
fastcgi_param   SERVER_PROTOCOL         $server_protocol;

fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;

fastcgi_param   REMOTE_ADDR             $remote_addr;
fastcgi_param   REMOTE_PORT             $remote_port;
fastcgi_param   REMOTE_USER             $remote_user;
fastcgi_param   SERVER_ADDR             $server_addr;
fastcgi_param   SERVER_PORT             $server_port;
fastcgi_param   SERVER_NAME             $server_name;

fastcgi_param   HTTPS                   $https;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS         200;
nginx에 적용
bash
sudo service php8.2-fpm restart
sudo service nginx restart
nginx에서 사용할 때 location 적용 예시
bash
location / {
    index index.php index.html;
    # 워드프레스, 드루팔, 코드이그나이터, 라라벨 등 일 때 아래 구문 추가
    # try_files $uri $uri/ /index.php?$args;
}

# Add PHP handler
location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }

    fastcgi_pass unix:/run/php/php-fpm.sock;
    fastcgi_index index.php;

    include fastcgi_params;
}
fastcgi_pass 부분이 중요한데 보통 php-fpm.sock이란 이름으로 심볼릭 링크가 되어 있지만 없을 경우 에러를 내니 버전이 있는 이름으로 설정하자.
docker를 설치할 때 curl을 필요로 한다 없다면 설치.
bash
sudo apt install curl
bash
# get-docker.sh 다운로드
curl -fsSL https://get.docker.com -o get-docker.sh
# get-docker.sh 실행
sudo sh get-docker.sh
# get-docker.sh는 이제 필요 없으니 제거
sudo rm get-docker.sh
잘 설치 됐는지 확인
bash
docker -v
docker는 기본적으로 root 권한에서만 사용할 수 있기 때문에 그룹에 사용자를 추가해 주자.(안해도 상관없음 sudo 키워드를 통해 쓰면 되긴 하다)
bash
sudo usermod -aG docker $USER
2023.03.24 기준으론 2.17.0이 최신인데 더 최신버전을 설치하고 싶다면v2.17.0 부분을 아래 링크를 참조해 최신으로 변경하면 된다.
2023년 6월 기준으로 v1버전이 지원 종료된다고 하니 v2 버전을 추천함. 하지만 v2에서 jenkins를 docker 거쳐서 사용할 때 에러가 났었는데 패치 했는지는 확인 못했다.
bash
sudo curl -L "https://github.com/docker/compose/releases/download/v2.17.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
설치 확인
bash
sudo docker compose version
우분투에 기본 내장 명령어인데 파일 복사 기능이다. 원격으로 파일이나 디렉토리를 전달할 수도 있다.
  • -v verbosity를 높이는 옵션으로 복사하는 과정을 더 자세하게 보여줍니다.
  • -z compress를 주는 옵션으로 파일을 복사할 때 압축해서 복사
  • -h 사람이 읽기 쉬운 형태로 복사 결과들을 출력
  • -a (same as -rlptgoD) archive 모드로 -rlptgoD 옵션을 적용한 것과 같다
  • -r 디렉토리 복사
  • -l symlink는 symlink 형태로 복사
  • -p 파일과 디렉토리들의 권한을 유지
  • -t 수정시간을 유지
  • -g 그룹 속성을 유지
  • -o 소유자 속성을 유지
  • --delete 복사할 경로에 관련 없는 파일 삭제
  • -D (same as --devices --specials) -devices --specials의 옵션과 같다
  • -devices root 권한이 필요하며 Device 관련된 파일들을 복사해서 생성
  • -specials named socket이나 fifo와 같은 특수한 파일들도 복사하는 옵션
  • -P (same as --partial --progress) -partial --progress의 옵션과 같다
  • -partial rsync는 전송중에 인터럽트가 발생하면 전송하던 파일을 삭제하는게 기본값. 이 옵션을 사용하면 전송된 부분파일을 남기고 다음 부분부터 재전송 할 수 있게하여 속도를 빠르게 할 수 있다
  • -progress 진행상황 표시
  • -stats 전송 통계 표시
  • -e 원격에서 사용할 쉘을 명시하는 옵션 -e 'ssh -p 22' 이렇게 해서 포트 변경 가능
bash
rsync [옵션] [source] [target]

# 보통 복사할 때 사용하는 옵션
rsync -avzhP /data/. /dataBackup/.

# 복사한 파일 리스트를 파일로 저장
rsync -av /data/. /dataBackup/. >> ~/rsync.log
bash
# 원격으로 복사
rsync [옵션] [로컬경로] [사용자]@[주소]:[원격경로]

rsync -avzhP ~/Desktop/file.txt user@192.168.0.XXX:~/Desktop/file.txt


# 로컬로 복사
rsync [옵션] [사용자]@[주소]:[원격경로] [로컬경로]

rsync -avzhP user@192.168.0.XXX:~/Desktop/file.txt ~/Desktop/file.txt
--delete 옵션을 적용해서 관련 없는 파일들은 삭제하게 시켰다.
bash
# 필요한 폴더 생성
sudo mkdir -p /data/.scripts
sudo mkdir -p /data/logs/rsync

# 파일 작성
sudo vi /data/.scripts/rsync.sh
bash
#! /bin/bash

LOG="/data/logs/rsync/.rsync.log"
LOG_DIR="/data/logs/rsync/"
TIME=$(date +%Y-%m-%d_%H.%M.%S)

rsync -av --delete --stats /[원본경로]/. /[백업경로]/. >> $LOG

mv $LOG $LOG_DIR$TIME\_SUCCESS.log
bash
# 실행권한 추가
sudo chmod u+x /data/.scripts/rsync.sh
crontab에 등록
bash
# root 사용자 crontab 수정
sudo crontab -u root -e
아래 내용 추가
bash
# 매일 0, 12시에 백업(동기화)를 한다.
0 0,12 * * * /data/.scripts/rsync.sh
내가 사용하는 스크립트
사용하고 싶다면 경로나 체크 부분들을 적절히 수정해서 사용하면 된다. 바로 시작되니 꼭 파일 날리지 않게 한번 더 확인하고 실행하길 바람
bash
#! /bin/bash

TIME=$(date +%Y-%m-%d_%H.%M.%S)
LOG="/data/logs/rsync/.rsync.log"
LOG_DIR="/data/logs/rsync/"
BR_TEXT="——————————————————————————————————————————"
ORIGINAL_DISK_ABLE_CHECK=`/sbin/blkid | grep '/dev/sda1: UUID="ac451dd6"'`
BACKUP_DISK_ABLE_CHECK=`/sbin/blkid | grep '/dev/sdb1: UUID="b7a067de"'`
ORIGINAL_MOUNT_CHECK=`mount | grep '/dev/sda1 on /data type ext4 (rw'`
BACKUP_MOUNT_CHECK=`mount | grep '/dev/sdb1 on /dataBackup type ext4 (rw'`

if [ "$ORIGINAL_DISK_ABLE_CHECK" ] && [ "$BACKUP_DISK_ABLE_CHECK" ]; then
    if [ "$ORIGINAL_MOUNT_CHECK" ] && [ "$BACKUP_MOUNT_CHECK" ]; then
        echo "$TIME|BACKUP START" > $LOG
        echo $BR_TEXT >> $LOG

        beginTime=$(date +%s%N)

        rsync -av --delete --stats /data/. /dataBackup/. >> $LOG

        # elapsed time
        endTime=$(date +%s%N)
        elapsed=`echo "($endTime - $beginTime) / 1000000" | bc`
        elapsedSec=`echo "scale=6;$elapsed / 1000" | bc | awk '{printf "%.6f", $1}'`
        echo $BR_TEXT >> $LOG
        echo `date "+%Y-%m-%d_%H.%M.%S|BACKUP SUCCESS|$elapsedSec sec"` >> $LOG
        mv $LOG $LOG_DIR$TIME\_SUCCESS.log
    else
        echo "$TIME|MOUNT ERROR" > $LOG
        mv $LOG $LOG_DIR$TIME\_MOUNT\_ERROR.log
    fi
else
    echo "$TIME|DISK ERROR" > $LOG
    mv $LOG $LOG_DIR$TIME\_DISK\_ERROR.log
fi
아래와 같이 저장됨 (파일 리스트들 생략)
libvirt을 이용해 가상머신을 관리한다.
bash
sudo apt install qemu-kvm libvirt-daemon-system virtinst
작동 확인
bash
kvm-ok