본문 바로가기 대메뉴 바로가기

테크니컬 스토리

아이티마야의 새로운 기술 뉴스를 만나보세요.
기술자료
Linux의 주요 명령어인 fsck/e2fsck 를 알아보자. Linux명령어로, 파일을 복구, 점검해주는 명령어는 어떤 게 있을까? Linux의 주요 명령어인 fsck/e2fsck 를 알아보자. fsck(File System Check)란 Linux의 파일 시스템을 점검하고 복구하는 강력한 도구입니다. 이 도구는 시스템의 건강과 무결성을 유지하는 데 중요한 역할을 합니다. fsck는 파일 시스템 검사를 수행하여 부적절한 종료, 하드웨어 장애 또는 소프트웨어 문제로 인해 발생할 수 있는 오류나 불일치를 식별하고 수정하는 데 도움을 줍니다. fsck는 Linux 시스템의 건강과 안정성을 유지하는 데 필수적인 유틸리티입니다. 정기적으로 파일 시스템 검사를 실행하고 발생하는 문제를 처리함으로써 시스템의 최적한 성능과 신뢰성을 보장할 수 있습니다. e2fsck란 fsck의 확장버전으로 현재 Linux에서 fsck를 실행한다면, e2fsck로 실행 된다. (1) fsck의 동작 단계 1. 초기화 2. 블록들과 파일 크기 검사 3. 중복된 이름 검사 4. 경로 검사 5. 연결성 검사 6. Shadows/ACL 확인 7. 참조 수 확인 8. 사이클 그룹 확인 (1-1) 각 단계에서 감지될 수 있는 오류 메시지는 아래와 같다. BLK= 블록 번호 DUP= 중복된 블록 번호 MTIME= 파일이 마지막으로 수정된 시간 CG= 실린더 그룹 DIR= 디렉터리 이름 UNREF= 참조되지 않음 (2) fsck명령어 옵션 A= /etc/fstab의 내용을 참고 후,사용하는 모든 파일시스템을 검사 N= 실행을 하지 않고 작업 내용 출력 P= -A옵션을 사용할 때, 루트 파일시스템을 같이 검사 : 루트 파티션 손상이 의심 됐을 땐 안전하지 않음 R= -A옵션을 사용할 때, 루트 파일시스템은 제외 T= 검사를 시작할 때 제목을 보여주지 않음 t= 점검할 파일시스템의 유형을 지정. : -A옵션이 설정돼 있는 경우, /etc/fstab에서 파일시스템 유형이 일치하는 것만 검사한다. : 파일시스템 앞에 no를 붙이면, 지정한 파일시스템을 제외한 나머지를 검사 P= 자동 복구 s= fsck동작을 시리얼화 : 대화형 모드로 실행하면, 여러 파일시스템을 점검할 때 유용함 f= 강제로 파일 시스템을 점검 n= 문제가 있을 때 수정하지 않고, 문제점 출력 r= 파일 시스템 문제를 하나씩 수정할 경우 확인 절차를 거침 y= 파일 시스템 문제를 발견하였을 때 자동으로 수정 V= 자세한 정보 출력 v= 버전 정보 fsck는 손상된 파일, 디렉터리를 수정할 때 임시로 /lost+found 디렉터리에서 작업을 수행 후, 복구가 완료되면 사라집니다. (3) 명령어 사용법 예시 우선 점검 및 복구가 필요한 디바이스를 찾은 후, 꼭 해당 디바이스를 언마운트 후, fsck명령어 사용 종료코드 보기 # man fsck 0 No errors 1 Filesystem errors corrected 2 System should be rebooted 4 Filesystem errors left uncorrected 8O perational error 16 Usage or syntax error 32 Checking canceled by user request 128 Shared-library error 복구가 필요한 디바이스 자동복구 방법 # sudo fsck -p /dev/디바이스명 -p = 자동복구 fsck명령어 옵션 중 많이 사용하는 옵션이다. 안전하게 해결가능한 문제를 자동으로 점검해 준다. OR # sudo fsck /dev/디바이스명 -y = 파일 시스템 문제를 발견하였을 때 자동으로 수정 fsck 명령어로 기본 설정을 수정하는 것은 데이터 손실이나 기타 예기치 않은 결과를 초래할 수 있으므로 주의해야 합니다. 2023.12.05
Linux dd 명령어를 사용해 보자. Linux의 중요한 명령어 dd를 알아보자. Linux dd 명령어를 사용해 보자. Ubuntu dd 명령어란 리눅스 시스템에서 중요한 명령어 중 하나이며, 이 명령어를 사용하여 디스크나 파티션의 복사, 이미지 파일 생성, 디스크의 작업 등 다양한 작업을 수행할 수 있다. dd 명령어 옵션 bs [Bytes] = 한 번에 읽고 쓸 최대 바이트 크기 지정 cbs [Bytes] = 한 번에 변환 작업이 가능한 바이트 크기 지정 count [Number Blocks] = 지정한 블록 수 만큼 복사 ibs [Bytes] = 한번에 읽어오는 입력단위 바이트 지정 obs [Bytes] = 한번에 작성되는 출력단위 바이트 지정 if [File] = 지정한 파일을 입력대상으로 설정 iflag [FLAGS] = 표준 출력 파일에 사용되는 flag 옵션 flag가 direct 시, Output 파일에 Buffer Cache를 사용하지 않고 다이렉트로 I/O를 한다 of [File] = 지정한 파일을 출력대상으로 설정 oflag [FLAGS] = 표준 출력 파일에 사용되는 flag 옵션 flag가 direct 시, Output 파일에 Buffer Cache를 사용하지 않고 다이렉트로 I/O를 한다 seek [Number] = 지정한 단위만큼 obs 크기를 건너뛰고 출력을 시작 skip [Number] = 지정한 단위만큼 ibs크기를 건너뛰고 입력을 시작 conv = 기호목록에 따라 파일을 변환 ascii : EBCDIC코드를 ASCII코드로 변환 ebcdic : ASCII코드를 EBCDIC코드를 변환 ibm : ASCII코드를 EBCDIC코드로 EBCDIC코드를 ASCII코드로 변환 block : cbs 단위로 변환할 때 줄 바꿈 문자를 공백으로 변환 unblock : cbs단위로 변환할 때 공백문자를 줄 바꿈 문자로 변환 lcase : 영어 대문자를 소문자로 변환 ucase : 영어 소문자를 대문자로 변환 swab : 입력되는 두 바이트의 순서를 변경 sync : ibs크기와 obs크기가 차이가 있을 경우 NULL 문자로 대체 excl : 출력파일이 이미 존재하면 수행하지 않음 nocreat : 출력파일이 존재해야 수행함 notrunc : 출력파일을 자르지 않고 출력함 noerror : 입력데이터를 읽을 때 에러가 발생하여도 계속 진행함 dd의 입출력 시에 사용되는 단위 c = Character [1bytes] w = Word [2bytes] k = Kilo Bytes [1024bytes] b = Block [512bytes] dd 명령어 사용방법 예시 [Ubuntu기준] Disk부하 확인 명령어 # sudo apt install sysstat # sudo iostat -d 1 10 [1초에 10번씩 Disk사용량 확인] 읽고 쓰기 # dd if=/var/log/syslog of=test bs=1024 count=5 if= 입력대상 of= 출력대상 bs= 읽고 쓸 최대 크기 count= 지정 수 많큼 복사 [/var/log/syslog내용을 읽고, test파일에 쓰는것을 1024크기로 5번 반복] 디스크 복제 [꼭 목적지 디스크는 언마운트 후, 진행해 주세요] # sudo umount sdc1 # dd if=/dev/sdb1 of=/dev/sdc1 bs=1024 if= 입력대상 of= 출력대상 bs= 읽고 쓸 최대 크기 디스크 파티션 삭제 # dd if=/dev/zero of=/dev/sda count=1 bs=512 if= 입력대상 of= 출력대상 읽고 쓸 최대 크기 count= 지정 수 많큼 복사 디스크 초기화 # dd if=/dev/zero of=/dev/sdb1 if= 입력대상[/dev/zero는 고정] of= 출력대상 dd 명령어는 매우 유용하지만, 조심해서 사용해야 합니다. 잘못 사용하면 데이터의 손실이 발생할 수 있으므로, 사용하기 전에 명령어의 옵션과 동작을 충분히 이해해야 합니다. 2023.11.02
Software Raid을 구성해보자. Software Raid란 무엇일까? Software Raid을 구성해보자 Raid란 [Redundant Array of Independent Disk] 2개 이상의 디스크를 병렬로 처리하여 성능 및 안정성을 향상시키는 방식입니다. Software Raid 장단점 장점 = 별도의 하드웨어 없이 소프트웨어로만 구현되었기 때문에 하드웨어 구현 방식에 비해 비용이 들지 않는다. 단점 = 소프트웨어 RAID는 운영 체제의 일부이기 때문에. 따라서 성능은 CPU 성능과 서버의 워크로드에 따라 달라집니다. 따라서 고급 전용 하드웨어 RAID보다 성능이 느릴 수 있습니다. Raid 종류 Raid0(Stripe set) = 2개 이상의 디스크에 동시 저장. 동시 저장하기 때문에 속도는 빠르지만 디스크 하나라도 장애가 발생한다면 모든 데이터를 사용 못하게 된다. Raid1(Mirror) = Mirroring 방식으로 저장. 2개의 디스크에 동일한 내용이 동시에 저장. 디스크 하나만 장애가 발생한다면 복구가 가능합니다. Raid5(Parity) = 3개 이상의 하드 디스크가 필요. 패리티 정보를 사용하여 1개의 디스크가 장애 발생해도 데이터 복구가 가능. 하지만 2개의 디스크가 장애 발생하면 데이터를 복구할 수 없음. Raid6(double parity) = 4개 이상의 하드 디스크가 필요합니다. RAID5를 개선한 것으로 2개까지의 디스크 장애를 복구할 수 있습니다. Raid10(Mirror + stripe) = 4개의 하드디스크를 사용해 Raid1 방식으로 데이터를 미러링 하고, 이를 다시 Raid0 방식으로 스트라이핑 하는 방식. 읽기 및 쓰기 성능은 향상되지만 전체 공간의 절반만 사용할 수 있습니다. 디스크 하나만 장애가 발생한다면 복구가 가능합니다. 설치 방법 # sudo apt-get update # sudo apt-get -y install mdadm Ubuntu Raid구성방법 [구성 전, 디스크 파티션작업을 해주셔야 합니다] RAID 디바이스 명 --level --raid-device(갯수) RAID 0 /dev/md0 0 2 RAID 1 /dev/md1 1 2 RAID 5 /dev/md5 5 3 RAID 6 /dev/md6 6 4 RAID 10 /dev/md10 10 4 Raid0 구성 예시 [/dev/sdb1, /dev/sdc1] *2개 이상 디스크 필요* # sudo mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1 Raid5 구성 예시 [/dev/sdb1, /dev/sdc1, /dev/sdd1] *3개 이상 디스크 필요* # sudo mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1 Raid10 구성 예시 [/dev/sdb1, /dev/sdc1, /dev/sdd1, /dev/sde1] *4개 디스크 필요* # sudo mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sdb1 아래 이미지처럼 생성이 완료됩니다. 아래 명령어로 Disk정보를 확인해보면 md0으로 Raid가 잡힌것을 확인할수 있습니다. # sudo fdisk -1 Disk /dev/md0: 63.96 GiB, 68679630848 bytes, 134139904 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes OR 아래 명령어로 Raid 구성정보를 볼수있습니다. # mdadm --detail --scan # mdadm --detail /dev/md0 /dev/md0: Version : 1.2 Creation Time : Wed Oct 18 08:17:51 2023 Raid Level : linear Array Size : 67069952 (63.96 GiB 68.68 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Update Time : Wed Oct 18 08:17:51 2023 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Rounding : 0K Consistency Policy : none Name : gpuadmin:0 (local to host gpuadmin) UUID : bc10345a:2ae76717:1653a452:9874010b Events : 0 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 1 8 33 1 ctive sync /dev/sdc1 2023.11.02
UI로 쉽게 관리가 가능한 오픈소스 데이터베이스 시스템을 알아보자. 오픈소스 데이터베이스 시스템인 PostgreSQL을 구성해보자. UI로 쉽게 관리가 가능한 오픈소스 데이터베이스 시스템을 알아보자. PostgreSQL이란 오픈 소스 객체 관계형 데이터베이스 시스템[ORDBMS]입니다. 이 데이터베이스 시스템 오픈소스는 다양한 데이터베이스 객체를 사용자가 임의로 만들 수 있는 기능을 제공하여, 많은 기능을 손쉽게 구현할 수 있습니다. PostgreSQL을 사용하는 이유 우선 비용이 전혀 들지 않는 오픈소스이며, 고가용성과 백업 서버도 있으며, 다양한 플랫폼에서 사용할 수 있고, 모든 공통 프로그래밍 언어를 활용할 수 있습니다. PostgreSQL과 MySQL 차이점 - MySQL= OLAP 및 OLTP 애플리케이션과 같이 읽기 성능이 유일한 요소일 때 잘 작동합니다. - PostgreSQL=정교한 처리가 필요한 애플리케이션에서 최적합니다. 저의 구성 환경입니다. - OS : [VM]Ubuntu20.04CLI - CPU : 8core - DISK : 50GB - MEMORY : 16GB (1)PostgreSQL 먼저 설치하겠습니다. (1-1)APT업데이트 후, 설치해 줍니다. #sudo apt update #sudo apt install postgresql (1-2)설치가 잘 됐는지 확인해줍니다. #sudo systemctl status postgresql (2)PostgreSQL database를 구성해 줍니다. PostgreSQL은 설치한 후, 기본적으로 postgre라는 데이터 베이스와, 사용자 생성 됩니다. [새로 만드시려면 아래 명령어를 따라가주세요.] (2-1)postgrsSQL 쉘로 진입해 줍니다. *postgres계정은 기본계정으로 만들어져 있습니다. #sudo su - postgres #psql 아래 이미지처럼 데이터베이스 쉘에 진입이 됩니다. (2-2)데이터베이스 쉘에서 새로운 데이터베이스와, 사용자를 만들어 줍니다. #create user [계정명] with password [′패스워드′;] 예시)#create user itmaya with password ‘ 1234’; #create database [데이터베이스명] 예시)#create database itmayadb *사용자와 데이터베이스를 연결해 줍니다. #grant all privileges on database itmaya to itmayadb 예시)#grant all privileges on database [사용자명] to [데이터베이스명] #q *쉘 빠져나오기 #exit 저는 아래 이미지처럼 사용자와, 데이터 베이스를 만들었습니다. (3)PostgreSQL을 UI로 관리할 수 있는 Pgadmin4를 설치해 줍니다. #curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key add #sudo sh -c ′echo \"deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main\" > /etc/apt/sources.list.d/pgadmin4.list && apt update′ #sudo apt update #sudo apt install pgadmin4 (3-1)Pgadmin4를 실행하고, 웹 계정을 설정해 줍니다. #sudo /usr/pgadmin4/bin/setup-web.sh 아래 그림과 같이 웹 계정을 설정해 주세요. 그 후 y를 누르시면 됩니다.. (3-2)Apache2를 재시작해줍니다. #sudo systemctl restart postgresql #sudo systemctl restart Apache2 (4)웹에서 접속해 줍니다. http://[localhostIP]/pgadmin4 아래처럼 접속되시면 (3-1) 에서 만든 계정으로 로그인해주세요. (4-1)웹에서 서버 추가 방법입니다. 1.웹에서 보이는 ADD New server로 진입해 주세요. 2.아래 이미지처럼 설정해 주세요. ● Name : 서버이름으로 임의로 설정가능합니다. ● ServerGroup : 서버 그룹 설정이며, 기본값으로 Servers로 되어있습니다. ● BackGround, ForeGround : 색상 설정입니다. ● Connect Now : 저장 후, PostgreSQL에 바로 접속할지 설정입니다. ● Comments : 서버 설정에 대한 설명을 적는 칸입니다. 3.아래 이미지처럼 설정해 주세요. ● Host Name/Address : 접속할 PostgreSQL서버의 주소를 설정 합니다. ● Port : 5432는 PostgreSQL의 기본 포트이며, 변경방법은 맨 아래 참고 해주세요. ● MaintenanceDataBase : 접속할 데이터베이스를 입력해주세요. ● UserName : 데이터베이스에 접속할 사용자명을 입력해 주세요. ● Password : 데이터베이스에 접속할 사용자명의 패스워드를 입력해 주세요. *입력이 다 끝나셧다면 왼쪽 아래 save를 눌러 주세요. 4.아래 이미지처럼 서버 추가가 완료됩니다. 그 외, PostgreSQL의 포트 변경 방법입니다. #sudo vi /etc/postgresql/12/main/postgresql.conf #wq! #sudo systemctl restart apache2 #sudo systemctl restart postgresql 아래 이미지처럼 사용하실 port를 넣어주세요. 2023.11.02
오픈소스로 비용 없이 쉽게 클라우드 환경을 구현할 수 있는 Openstack을 알아보자. 가상머신 기반인 클라우드 환경을 구현하는 MultiNode Openstack을 구현해 보자. 오픈소스로 비용 없이 쉽게 클라우드 환경을 구현할 수 있는 Openstack을 알아보자. *전에, SingleNode로 구성했던 Openstack을 이번에는 MultiNode로 구성해 보았습니다. Openstack란 가상머신 기반으로 클라우드 환경을 구현하는 기술입니다. 이 오픈소스는 lass를 쉽게 구축할 수 있도록 플랫폼 지원과, 대시보드를 통해 스토리지, 프로세싱, 네트워킹 등 대시보드를 통해 자원들을 제어할 수 있게 해줍니다. Openstack 사용 이유 Openstack을 사용하는 가장 큰 이유는 시스템 사용에 대한 비용이 전혀 들지 않는다는 것입니다. Openstack의 특징 Openstack의 장점으로는 우선 확장성과, 모듈성, 오픈소스이므로 비용이 들지 않는다는 점과 많은 사람들이 사용하며, 개발하기 때문에 안정화와, 버전 릴리즈가 빠릅니다. 하지만 단점으로는 버전 릴리즈가 빠를수록 잦은 업데이트가 이루어진다는 것이 단점이 될 수도 있습니다. 아래는 저의 구성 환경입니다. [멀티노드] 노드 3대 같은 사양으로 진행했습니다. | OS : (VM)Ubuntu20.04 CLI | CPU : 4core | RAM : 16GB | Disk : 50GB [호스트 네임은 꼭 별도로 다르게 설정해 주셔야 합니다.] gpuadmin1 192.168.0.32 *hostname=gpusystem  Controller Node gpuadmin2 192.168.0.34 *hostname=node1    Computing Node 1 gpuadmin3 192.168.0.37 *hostname=node2    Computing Node 2 (1) 멀티노드 오픈스택을 구성해 보겠습니다. (1-1) stack 계정을 만들어줍니다. stack 계정 생성하기. #sudo useradd -s /bin/bash -d /opt/stack -m stack stack 계정에 sudo 권한 주기. #sudo echo \"stack ALL=(ALL) NOPASSWD: ALL\" |sudo tee /etc/sudoers.d/stack #sudo chown -R stack:stack /opt/stack stack 계정에 로그인. #sudo su - stack (1-2) devstack 설치와, local.conf 값 주기. devstack 다운로드 #git clone https://opendev.org/openstack/devstack local.conf 설정. #cp devstack/samples/local.conf devstack/local.conf #vi devstack/local.conf (1-3) 아래는 local.conf 값입니다. [local.conf] Controller Node *gpuadmin1 HOST_IP=192.168.0.32 FIXED_RANGE=10.4.128.0/20 #임의의 IP를 넣어줍니다. FLOATING_RANGE=192.168.0.240/25 #어디까지 IP를 사용할지 지정해 줍니다. LOGFILE=/opt/stack/logs/stack.sh.log ADMIN_PASSWORD=Itmaya #원하시는 패스워드를 넣으시면 됩니다. DATABASE_PASSWORD=supersecret RABBIT_PASSWORD=supersecret SERVICE_PASSWORD=supersecret [local.conf] Compute Node *gpuadmin2,gpuadmin3 (두 대다 해당 아이피 넣어주기.) HOST_IP=192.168.0.34,37 #Compute Node의 IP를 넣어줍니다. FIXED_RANGE=10.4.128.0/20 FLOATING_RANGE=192.168.0.240/25 LOGFILE=/opt/stack/logs/stack.sh.log ADMIN_PASSWORD=Itmaya DATABASE_PASSWORD=supersecret RABBIT_PASSWORD=supersecret SERVICE_PASSWORD=supersecret DATABASE_TYPE=mysql SERVICE_HOST=192.168.0.32 MYSQL_HOST=$SERVICE_HOST RABBIT_HOST=$SERVICE_HOST GLANCE_HOSTPORT=$SERVICE_HOST:9292 ENABLED_SERVICES=n-cpu,c-vol,placement-client,ovn-controller,ovs-vswitchd,ovsdb-server,q-ovn-metadata-agent NOVA_VNC_ENABLED=True NOVNCPROXY_URL=\"http://$SERVICE_HOST:6080/vnc_lite.html\" VNCSERVER_LISTEN=$HOST_IP VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN (1-4) openstack 설치하기. #./stack.sh (1-5) 아래 이미지는 설치가 완료된 이미지입니다. controller Node compute Node1 compute Node2 (1-6) 아래는 웹으로 오픈스택을 들어간 사진입니다. (TIP) 그 외, 에러가 나왔을 때 대처 방법입니다. *compute code error #sudo /usr/share/openvswitch/scripts/ovs-ctl start #sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-client bridge-utils virt-manager 안될 시.. #sudo ovs-vsctl --no-wait init #sudo ovs-vswitchd --pidfile --detach local.conf에서 q-agt를 삭제 후, ./unstack 한번해 주시고 ./stack.sh 해주세요. 2023.10.19
MiniKube란 무엇일까? k8s를 쉽게 구성할 수 있는 Minikube를 설치해 보자. MiniKube란 무엇일까? MiniKube란 무엇일까? ? Minikube는 Kubernetes 클러스터를 관리하는 데 도움이 되는 오픈소스입니다. Minikube는 Kubernetes 클러스터를 배포하고 관리하는 데 사용되는 오픈소스 도구입니다. Minikube를 사용하면 로컬 컴퓨터에서 단일 노드 Kubernetes 클러스터를 실행하여 애플리케이션 개발, 테스트 및 배포를 쉽게 할 수 있으며, 단일 머신에서 다중 노드 Kubernetes 환경을 시뮬레이션하여 다양한 Kubernetes 기능 및 구성을 실험할 수 있습니다. MiniKube와 Kubernetes 차이점은 뭘까? Kubernetes 특징 ●접근성이 좋다. ●다중 클라우드 환경, 공용, 사설 또는 하이브리드 용으로 구축되어 있다. ●모듈화 되어 있으며, 모든 구성 요소를 쉽게 교체할 수 있도록 설계되어 있다. minikube 특징 ●로컬 시스템에서 쉽게 설치가 가능하다. ●리눅스, 맥 OS, 윈도우를 지원하며, 설치 파일 이외에도 각 OS가 지원하는 패키지 매니저를 활용하여 편리하게 설치할 수 있다. ●LoadBalancer ●Multi-cluster 저의 구성환경입니다 - OS: Ubuntu20.04 GUI [VM] - CPU: 4Core - Memory: 10GB -Disk: 50GB (1) 우선 MiniKube를 설치하기 위해선, Docker, snap, go를 설치해 줍니다. docker install # sudo apt update # sudo apt install -y apt-transport-https ca-certificates curl software-properties-common # curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # sudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable\" # sudo apt update # apt-cache policy docker-ce # sudo apt install docker-ce 시스템이 종료된 후에도 Docker가 동작하게 해 줍니다. # sudo systemctl status docker # sudo systemctl enable docker.service # sudo systemctl start docker.service snap install # sudo apt install snap go install # sudo snap install go --classic (1-2) Docker Cri를 구성해줍니다. # git clone https://github.com/Mirantis/cri-dockerd.git # wget https://storage.googleapis.com/golang/getgo/installer_linux # chmod +x ./installer_linux # ./installer_linux # source ~/.bash_profile # cd cri-dockerd # mkdir bin # go build -o bin/cri-dockerd # mkdir -p /usr/local/bin # sudo install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd # sudo cp -a packaging/systemd/* /etc/systemd/system # sudo sed -i -e \\\'s,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,\\\' /etc/systemd/system/cri-docker.service # sudo systemctl daemon-reload Cri-Docker를 실행해 줍니다. # sudo systemctl start cri-docker.service # sudo systemctl start cri-docker.socket # sudo systemctl enable cri-docker.service # sudo systemctl enable cri-docker.socket (2) Docker 설치를 완료했다면, MiniKube를 설치해 줍니다. # curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64\ && chmod +x minikube # sudo mkdir -p /usr/local/bin/ # sudo install minikube /usr/local/bin/ (2-1) Conntrack 설치해줍니다. ? Conntrack은 무엇일까? Conntrack는 Linux 운영 체제에서 사용되는 네트워크 관련 도구로, 시스템 내에서 네트워크 연결을 추적하는 기능을 제공합니다. 또한 conntrack은 네트워크 문제를 해결하고 네트워크 트래픽에서 병목 현상을 식별하여 네트워크 성능을 최적화하는 데도 사용될 수 있습니다. # sudo apt-get install conntrack (2-2) CriCtl 설치 해줍니다. ? CriCtl은 무엇일까? 쿠버네티스 노드에서 컨테이너 런타임과 애플리케이션을 검사하고 디버그 하는 데 사용할 수 있다. # VERSION=\"v1.21.0\" wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz # sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin (3) 필수 패키지 설치가 완료되었다면, MiniKube를 실행시켜 줍니다. [아래 이미지처럼 실행이 됩니다.] # sudo minikube start --vm-driver=none 원하는 Kubernetes버전이 있을시, # minikube start --kubernetes-version=v1.21.0 (3-1) 설치 중, 아래와 같은 메시지가 나온다면 아래 명령어를 따라 설치해 주세요. # CNI_PLUGIN_VERSION=\"v1.3.0\" CNI_PLUGIN_TAR=\"cni-plugins-linux-amd64-$CNI_PLUGIN_VERSION.tgz\" CNI_PLUGIN_INSTALL_DIR=\"/opt/cni/bin\" #curl -LO \"https://github.com/containernetworking/plugins/releases/download/$CNI_PLUGIN_VERSION/$CNI_PLUGIN_TAR\" # sudo mkdir -p \"$CNI_PLUGIN_INSTALL_DIR\" # sudo tar -xf \"$CNI_PLUGIN_TAR\" -C \"$CNI_PLUGIN_INSTALL_DIR\" # sudo rm \"$CNI_PLUGIN_TAR\" (3-2) 설치 중, 아래와 같은 메시지가 나온다면 빨간색 체크 박스에 표시된 명령어를 실행해 주세요. # sudo systemctl fs.protected_regular=0 (4) 설치가 완료되셨다면, Kubernetes를 설치해 줍니다. # curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - && \ echo \"deb http://apt.kubernetes.io/ kubernetes-xenial main\" | sudo tee /etc/apt/sources.list.d/kubernetes.list && \ sudo apt-get update -q && \ sudo apt-get install -qy kubelet=1.21.0-00 kubectl=1.21.0-00 kubeadm=1.21.0-00 (4-1) Kubernetes 명령어를 사용하기 위해 아래 명령어를 입력해 줍니다. # sudo mkdir -p ${HOME}/.kube # sudo cp -i /etc/kubernetes/admin.conf ${HOME}/.kube/config # sudo chown ${USER}:${USER} ${HOME}/.kube/config (4-2) Kube설치가 완료되셨다면, Calico Network Plugin 설치해 줍니다. ? Calico Network Plugin이란 오픈소스 네트워킹이며, kube에서 각 Pod 간 네트워크 통신이 가능하도록 도와주는 플러그인입니다. # kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml (6) MiniKube 상태 확인 방법입니다. [아래 이미지처럼 상태를 확인할 수 있습니다.] # sudo minikube status (7) MiniKube DashBoard를 설치합니다. # sudo minikube addons enable dashboard # sudo minikube dashboard (7-1) 아래 명령어로 DashBoard가 실행됐는지 확인합니다. [아래 이미지처럼 enabled가 표시됩니다.] # sudo minikube addons list (7-2) Proxy설정 후, DashBoard를 실행해 줍니다. [아래 이미지처럼 DashBoard에 접속됩니다.] # kubectl proxy --address=\\\'0.0.0.0\\\' --disable-filter=true # sudo minikube dashboard 접속 방법 입니다. [8001은 MiniKube DashBoard의 Port입니다.] http://[YourServerIP]:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ 아래 이미지는 접속 된 상태 입니다. 2023.10.06
Ubuntu를 사용하면서 쉽게 백업할 수 있는 오픈소스를 알아보자. Ubuntu를 사용하면서 쉽게 백업할 수 있는 오픈소스를 알아보자. TimeShift라는 이미지 Snapshot 도구를 사용해 보자. Snapshot이란 무엇일까. Snapshot은 마치 사진을 찍는 것처럼, 특정 시간에 데이터 저장 장치의 상태를 별도의 파일이나 이미지로 저장하는 기술이다. 이 기술을 UI로 간편하게 사용할 수 있는 오픈소스가 TimeShift이다. Snapshot을 사용하는 이유. 스냅샷 기능을 이용하여 데이터를 저장하면 유실된 데이터 복원과 일정 시점의 상태로 데이터를 복원할 수 있다. 저의 구성환경입니다. OS : Ubuntu20.04 GUI [VM] CPU : 4Core DISK1 : 50GB DISK2 : 50GB Memory : 10GB 1. 우선 아래 명령어로 TimeShift를 설치해 줍니다. # sudo apt update # sudo apt install timeshift 2. 설치가 완료되셨다면, 아래 이미지처럼 timeshift에 접속해 주세요. Ubuntu 기본값은 etx4이므로, RSYNC옵션만 사용할 수 있다. [만약, BTRFS를 사용하고 싶다면, Linux 파일 시스템을 BTRFS로 포맷해야 한다.] · RSYNC(Remote Synchronization) : 원격 동기화라는 뜻으로, 원격 시스템으로부터 파일을 효율적으로 복사하거나 동기화할 수 있다. · BTRFS(Butter file system) : Copy-on-Write 파일시스템으로, 스냅샷을 활용을 하여 볼륨의 복원이 가능하며, 실시간 오류 수정 기능을 가지고 있다. 3. RSYNC선택 후, Next를 눌러 넘어가 주세요. 4. 아래와 같은 UI가 나온다면 스냅샷이 저장될 위치를 골라주세요. [Linux file system만 가능합니다.] 저는 sdb로 설정하였습니다. 5. 다음으로 넘어오시면 스냅샷 일정 주기를 설정할 수 있습니다. [원하는 일정을 맞춰주세요.] 6. 아래 이미지는 백업 설정입니다. [저는 앱포함 백업을 선택하였습니다.] · Exclude All Files : 앱 제외 · Include Only Hidden Files : 숨김 항목 포함 · Include All files : 앱 포함 7. 다음으로 넘어오시면, 스냅샷 설정이 완료된 것을 확인할 수 있습니다. 8. 지금 바로 스냅샷을 만들고 싶으시다면 위쪽 Create을 누르시면 아래 이미지처럼 스냅샷이 생성됩니다. 9. 복원을 원하시면 저장된 스냅샷 중 하나를 고른 뒤 복원(Restore)을 눌러주시면 됩니다. 2023.09.12
오픈소스를 활용한 서버 / 클라이언트 백업 중앙 관리 / 구성 방안 이미지/파일/증분/중복제거 모두 가능한 오픈소스 백업 솔루션 UrBackup 오픈소스를 활용한 서버 / 클라이언트 백업 중앙 관리 / 구성 방안 백업 솔루션 선택 최근 고객사로부터 랜섬웨어, 채굴 악성코드 등의 피해 사례에 대한 문의가 많아지고 있습니다. 기존의 백업은 시스템의 장애 혹은 DR 개념의 백업이 주요 목적이었다면, 최근 들어 악성코드로 인한 데이터 손상도 백업의 주요 목적이 되었습니다. 백업 시스템의 도입은 점점 필수가 되어 가고 있지만, 예산으로 백업시스템 도입이 망설여진다면 오픈소스 백업 솔루션의 도입을 검토해 볼 수 있습니다. 백업 솔루션을 선택할 때 고려되어야 할 사항입니다.  ● GUI 관리 툴로 손쉬운 관리  ● 중앙 관리 (서버 - 클라이언트 방식)  ● 파일백업 기능 (파일 복원 기능)  ● OS 이미지 백업 기능 (OS 이미지 복원 기능)  ● 네트워크 백업 / 복구  ● 증분 백업  ● 중복 제거 UrBackup은 오픈소스 백업 솔루션에서도 매우 간편하게 사용할 수 있으며, 위 나열된 기능을 모두 제공합니다. 본 포스팅에서는 백업 솔루션의 설치 방법과 사용방법을 안내합니다. 테스트 환경 구성 ● 시스템을 한 개의 네트워크 환경에서 사용한다고 가정하고, 같은 네트워크에 백업 서버를 구성하였습니다. ● 백업 대상 서버의 OS는 리눅스 환경 2대와 윈도우 환경 2대로 구성하였습니다. UrBackup Server 설치 💡   UrBackup Server 사전 준비   ● OS : Ubuntu 22.04   ● SW : Docker UrBackup Server 는 여러 OS 환경에 설치할 수 있습니다.  ● Windows  ● Debian  ● Ubuntu  ● RedHat/CentOS/ScientificLinux/Fedora/SuSE/Debian/Ubuntu/Raspbian  ● Arch Linux  ● Gentoo Linux  ● GNU/Linux, FreeBSD  ● FreeNAS  ● QNAP NAS  ● Open Media Vault  ● ASUSTOR - ASUS NAS  ● Docker 본 포스팅에서는 가장 편리하게 구성할 수 있는 Docker 환경으로 구성합니다. $ docker run -d --name urbackup-server-1 -v /media/backups:/backups -v /media/database:/var/urbackup -p 55413-55415:55413-55415 -p 35623:35623/udp uroni/urbackup-server ● /media/backups 백업 파일 저장 폴더 ● /media/database UrBackup DB 저장 폴더 UrBackup Server 동작 확인 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS ca7e911ef417 uroni/urbackup-server "/usr/bin/entrypoint…" 3 seconds ago Up 1 second ● Docker에 컨테이너가 올라가면 바로 웹 55414포트로 관리 툴에 접근할 수 있습니다.   (BackupServerIP:55414) ● 기본 관리자 패스워드가 설정되어 있지 않습니다. 설정할 수 있습니다. (첫 생성 유저는 전체 관리자로 생성해야만 합니다.)    ○ Setting > Users > Create user ● 클라이언트에 배포될 자동 설치 파일 생성을 위해 아래 정보를 미리 입력해 둡니다. (서버 IP / 보안키)    ○ Setting > General > Internet/Active Clients UrBackup Client 설치 UrBakcup Client는 백업을 할 대상 서버에 설치합니다. 클라이언트를 설치하고 서버와 연결하면 서버에서 백업/복구/스케줄링 등과 관련된 모든 접근이 가능합니다. UrBackup Client는 주로 사용하는 대다수 OS의 버전에서 설치가 가능합니다.  ● Windows  ● Linux Binary  ● MacOS  ● Arch Linux  ● Gentoo Linux  ● Client Source for Linux 테스트 환경에서는 Ubuntu Linux와 Windows 10의 백업 대상 서버를 만들어 두었고, 총 4개의 서버에 백업 클라이언트 소프트웨어를 구성했습니다. 클라이언트에 설치될 설치 파일은 관리 서버에서 다운로드 가능합니다. Status > Add new Client Client 이름을 입력하여 클라이언트를 생성하면 클라이언트는 아직 연결되지 않은 걸 확인할 수 있고, 클라이언트에서 설치할 설치 파일을 다운로드할 수 있습니다. (Status > Download Client) 다운로드 받은 설치 파일은 윈도우는 .exe 실행파일이고, 리눅스는 .sh 실행파일입니다.  ● Windows OS에서의 백업 클라이언트 설치    다운받은 .exe 파일을 실행하고 설치합니다.   트레이에 생긴 UrBackup 을 확인하고, 우클릭하여 설정할 수 있습니다.   Client의 Computer Name은 서버에서 등록한 Computer Name 과 동일해야 합니다. 서버의 IP를 입력하고 완료합니다.   서버가 연결되면 서버에서 설정된 내용에 맞춰 백업을 시작합니다.  ● Linux OS에서의 백업 클라이언트 설치    다운 받은 파일을 sudo 권한으로 실행합니다. 볼륨 스냅샷 방법을 정할 수 있는데, 저는 4. Linux Device mapper 스냅샷으로 설정하였습니다.    스냅샷은 클라이언트를 한번 재부팅해야 정상 동작한다고 정보가 나오네요.    아래 명령어로 동작 여부를 확인 할 수 있습니다. 인터넷 서버와 연결이 되어 있지 않은 것을 확인할 수 있습니다.    제거 필요시 간단하게 제거할 수 있습니다.    제공되는 명령어는 아래와 같습니다. 커맨드 명령어도 조작이 간편합니다.  $ sudo urbackupclientbackend  $ sudo urbackupclientctl  $ sudo urbackupclient_dmsnaptool  $ sudo uninstall_urbackupclient 클라이언트 설정이 모두 완료되었다면, 서버에서 4개의 클라이언트가 확인됩니다. 백업 설정 파일 백업 설정 기본 구성은 아래와 같고, 변경할 수 있습니다. (Setting > File Backups)  ● 증분 백업 : 5시간에 1회 수행  ● 풀 백업 : 30일에 1회 수행 그 외 최대 백업 본의 보관 수나 클라이언트별 백업 폴더 등을 설정할 수 있습니다. 이미지 백업 설정 기본 구성은 아래와 같고, 변경할 수 있습니다. (Setting > Image Backups)  ● 증분 백업 : 7일에 1회 수행  ● 풀 백업 : 60일에 1회 수행 (비활성화) 그 외 최대 백업 본의 보관 수나 압축방법 등을 설정할 수 있습니다. 이미지 백업은 UrBackup에서 제공하는 부트 이미지를 이용하여 서버의 OS 영역을 완벽히 복원하거나, 새로운 장비에 복원이 가능합니다. 손상 파일 복구 사용 중 파일 및 폴더가 오염되었거나, 삭제되었다면 파일 복원이 가능합니다. 백업은 백업 설정에 따라 일자별/시간별로 보관되어 각 일자별/시간별 폴더 및 파일 내용을 확인할 수 있습니다. 예를 들어 5시간마다 파일 증분 백업으로 설정했고, 랜섬웨어를 가정한다면 랜섬웨어로 파일이 오염된 시점 이전으로의 복원이 가능합니다. 파일을 복구하는 방법은 관리 툴의 Backups 메뉴에서 가능합니다. 백업 클라이언트를 선택하고 백업 일자를 선택하면 폴더 목록 파일 목록을 확인할 수 있고, 전체/선택 폴더/선택 파일 등으로 Restore 기능을 제공합니다. Restore 버튼을 누르면 클라이언트의 파일이 바로 복구됩니다. 혹은 ZIP 파일로의 압축하여 다운로드할 수도 있습니다. 리눅스에서는 바로 복원은 클라이언트에서 urbackupclientclt 명령어를 이용하여 가능합니다. 그 외 폴더 및 파일을 다운로드하거나 확인하는 방법은 동일합니다. 손상 OS 복구 OS 복구 테스트를 위해 Client #3의 이미지 풀 백업을 스케줄링이 아닌 미리 진행했습니다. Client #3의 OS와 물리적 하드웨어 장애가 있다는 가정으로, 새로운 시스템인 Client #6을 준비하였고 Client #3의 OS를 Client #6에 복원합니다. OS 복원을 위해 UrBackup에서 제공하는 복구용 ISO 이미지 부팅하여 진행합니다. (UrBackup 사이트에서 다운로드 가능합니다.) 그래픽인터페이스와 커맨드 인터페이스를 선택할 수 있습니다. 보기 좋게 GUI를 선택했습니다. 언어 설정과 타임라인 설정을 스킵하고 서버와의 연결 설정을 해야 합니다. (Configure Internet server) 서버가 구성된 IP와 초기 구성시 입력한 보안키를 입력합니다. 서버 초기 구성시 입력한 ID와 패스워드를 입력합니다. 복원할 클라이언트 이미지를 선택하고, 복원될 디스크를 선택합니다. 복원 후 재부팅하면 복원된 이미지로 부팅되는 것을 확인할 수 있습니다. 오픈소스로 백업 환경을 구성한다면… 상용 솔루션을 사용한다면 기술 지원 측면에서 보다 편하게 사용할 수 있습니다. 하지만 UrBackup은 상용에서도 찾아보기 힘들 정도로 다양한 핵심 기능을 제공하고 있고 조작이 매우 직관적이고 편리합니다. 서버 관리를 처음 하는 초보 관리자도 단 몇 시간만 학습하면 사용할 수 있습니다. 백업에 매년 라이선스 비용을 지불하며 사용하거나, 클라이언트 숫자가 늘어날 때마다 라이선스를 추가해야 하는 게 부담된다면 백업 서버를 오픈소스로 구성하시는 것은 좋은 선택지가 됩니다. 2023.09.04
Docker를 사용하면서, UI로 쉽게 관리할 수 있는 오픈소스를 알아보자. Docker의 Swarm, status, resource 등을 관리할 수 있는 Portainer라는 오픈소스를 구성해 보자. Docker를 사용하면서, UI로 쉽게 관리할 수 있는 오픈소스를 알아보자. Docker Portainer란 무엇일까. Docker Portainer는 Docker 환경에서 컨테이너, 이미지 및 네트워크를 쉽게 관리할 수 있는 Docker 용 웹 기반 관리 도구, 오픈 소스이다. Portainer의 장점을 알아보자. | Docker 웹 기반 그래픽 사용자 인터페이스(GUI)를 제공하여 사용자가 애플리케이션을 빠르고 쉽게 배포할 수 있도록 한다. | 상태, 리소스 사용량 및 로그 등, 실행 중인 모든 컨테이너의 세부 정보를 표시하는 대시보드를 제공한다. 따라서, 컨테이너를 쉽게 모니터링하고 제어할 수 있다. | Docker의 기본 클러스터링 시스템인 Docker Swarm에 대한 지원이다. Docker Portainer를 사용하면 사용자는 Docker Swarm 클러스터를 쉽게 배포하고 관리할 수 있으므로 애플리케이션과 서비스를 쉽게 확장할 수 있다. Portainer를 설치해 보자. 아래는 저의 구성 환경입니다. 💡   OS:Ubuntu22.04 GUI (VM)   CPU: 4Core   DISK: 50GB   MEMORY: 16GB 우선, Docker를 설치해 줍니다. # sudo apt update # sudo apt install -y apt-transport-https ca-certificates curl software-properties-common # curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" # sudo apt update # apt-cache policy docker-ce # sudo apt install docker-ce Docker가 잘 설치되었는지 확인해 줍니다. # sudo systemctl status docker (docker 상태 확인) # sudo systemctl enable docker (재부팅돼도 docker 실행) 위의 사진처럼 나온다면 Docker 설치가 잘 완료됐습니다. Docker 컨테이너 생성, portainer를 설치해 줍니다. # sudo docker run --name portainer -p 9000:9000 -d --restart always -v /data/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer Portainer 접속방법은 아래와 같습니다. # http://ServerIP:9000 아래는 접속 사진입니다. 1. User name, Password를 만들어 줍니다. Password는 12글자 이상 입력하셔야 합니다. 2. 계정을 생성하셨다면 아래 사진처럼 접속됩니다. 3. 이제 컨테이너와 이미지 관리, 애플리케이션 배포 등, UI로 쉽게 배포할 수 있습니다. 💡   아래 사진처럼 접속이 안될 시 해결 방안입니다. # docker ps -a (portainer컨테이너 ID를 확인해줍니다.) # docker restart containerID (Portainer 컨테이너 ID를 입력하여 재시작 해줍니다.) # http://ServerIP:9000 (다시 접속해 줍니다.) 2023.09.01
실수로 삭제한 데이터를 비용 없이, 오픈소스를 이용하여 복구할 수 있을까? TestDisk로 복구해 보자. 실수로 삭제한 데이터를 비용 없이, 오픈소스를 이용하여 복구할 수 있을까? TestDisk란 GPL라이선스를 가진 오픈소스 소프트웨어이며, 파티션 복구 프로그램입니다. 실수로 데이터를 삭제했거나 파티션이 날아간 상태에서 TestDisk라는 오픈소스 소프트웨어로 다시 복구할 수 있습니다. 아래는 저의 구성 환경입니다. - OS : [VM]Ubuntu20.04 CLI - CPU : 4core - MEMORY : 16GB - DISK : 50GB TestDisk로 삭제한 파일들을 복구해 보도록 하겠습니다. 💡   [예시] 저는 /test.txt, /test1.txt, /test.yaml 파일을 만든 후, #rm -rf 명령어로 지운 후, TestDisk로 복구를 해보려고 합니다. (1) 우선 설치는 아래와 같이 간단합니다. #sudo apt update #sudo apt install testdisk (1-2) 실행은 아래와 같습니다 #testdisk *아래 이미지가 testdisk에 들어간 상태입니다. 맨 위에 TestDisk7.1은 버전을 나타냅니다. ● Create= 새 로그파일을 생성합니다. ● Append= 로그파일에 정보를 추가합니다. ● NoLog= 아무것도 기록하지 않습니다. [저는 log는 필요 없어서 NOLOG로 진행하였습니다.] *아래는 다음 이미지 입니다. 1. 아래 Proceed, Sudo, Quit가 있습니다. 2. Sudo로 들어가 주세요. *아래는 다음 이미지 입니다. 저는 /dev/sda에 지운 파일들이 있어서, 위에 이미지와 같이 들어가 줍니다. *아래는 다음 이미지 입니다. 여기서는, 맞는 파티션으로 자동으로 지정되기 때문에 바로 엔터를 누르시면 됩니다. *아래는 다음 이미지 입니다. 실수로 지워버린 파일을 복구하기 위해 Advanced로 들어가 줍니다. ● Analyes= 현재 파티션 구조 분석 및 손실된 파티션 검색 ● Advanced= 파일 시스템 유틸리티 ● Geometry= 디스크 지오메트리 변경 *아래는 다음 이미지 입니다. Linux filesys. data 쪽으로 선택하시고 아래 List로 들어가 줍니다. *아래는 다음 이미지 입니다. 이와 같이 빨간색으로 표시된 파일들이 제가 지운 파일입니다. 복구하시고 싶은 파일을 c를 누르시면 됩니다. *다음 이미지 입니다. 1. 복구하실 파일을 c로 누르시면 다음과 같이 나옵니다. 2. 여기서는 복원할 공간을 선택하시면 되는데, c를 한 번 더 누르시면 해당 경로에 기존경로가 복원이 됩니다. *다음 이미지 입니다. 위와 같이 복구가 완료되면 Copy done! 1 ok라고 나옵니다. *다음 이미지 입니다. 이렇게 해당 경로에 들어가보면 test.txt, test1.txt, test.yaml 파일이 잘 복구되신걸 볼수있습니다. 💡   우선 간단한 파일은 복구가 잘 되는 걸 볼 수 있습니다. 하지만 복구라는 게 100%로 완전하지는 않기에 항상 삭제하기 전에 백업을 해두시고, 삭제하시는 걸 권장드립니다. 2023.08.08
PLEASE WAIT WHILE LOADING...