검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : How to create a secure incremental offsite backup in Linux with Duplicity

  재해 복구를 위해 원격 지역에 백업을 하는 경우 보통은 공인망을 통해 데이터가 오가기 때문에 암호화를 염두해야 합니다. 또한 백업으로 인해 소모되는 대역폭, 디스크 스토리지, 시간을 아끼기 위해 풀 백업이 아닌 증강 백업의 지원여부도 중요합니다.

  Duplicity는 암호화가 가능한 증강 백업 툴로서 librsync를 사용하여 대역폭/공간에 있어 효율적인 증강 아카이브를 생성합니다. 또한 GnuPG를 사용해 백업 아카이브를 암호화와/나 사인을 할 수 있어 인증받지 않은 데이터 접근과 조작을 방지합니다.

  이 글에서는 Duplicity로 원격 지점에 보안이 적용된 증강 백업을 하는 방법을 설명합니다.

Duplicity 설치
  데비안 계열에 설치하는 방법은 아래와 같습니다.
$ sudo apt-get install duplicity python-paramiko
  레드햇 계열에 설치하는 방법은 아래와 같습니다. 단, CentOS나 RHEL은 먼저 EPEL 저장소를 사용해야 합니다.
$ sudo yum install duplicity python-paramiko

SCP를 통한 보안성 있는 원격 증강 백업
  로컬 디렉토리(예: ~/Downloads)의 증강 백업본을 만들어 SCP를 이용해 원격 SSH 서버에 전송하려면 아래의 명령어를 사용합니다. 참고로 그 전에 원격 SSH 서버에 대해 패스워드 없이 SSH 로그인을 할 수 있도록 설정해야 합니다.
$ duplicity ~/Downloads scp://user@remote_site.com//home/user/backup/
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: none
GnuPG passphrase:
Retype passphrase to confirm:
No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1375918500.17 (Wed Aug  7 19:35:00 2013)
EndTime 1375918539.07 (Wed Aug  7 19:35:39 2013)
ElapsedTime 38.90 (38.90 seconds)
SourceFiles 3
SourceFileSize 65982804 (62.9 MB)
NewFiles 3
NewFileSize 65982804 (62.9 MB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 3
RawDeltaSize 65978708 (62.9 MB)
TotalDestinationSizeChange 66132356 (63.1 MB)
Errors 0
-------------------------------------------------
  처음 원격 백업을 실시하면 풀 백업을 하게 되며, 암호화를 위한 초기 GnuPG 패스프레이즈를 설정하게 됩니다. 그 다음부터는 증강 백업을 하게 되며, 처음에 설정한 GnuPG 패스프레이즈를 매번 입력해야 합니다.

비대화 모드를 통한 보안성 있는 원격 증강 백업
  패스프레이즈를 입력하는 것이 싫다면 아래처럼 Duplicity를 실행하기 전에 PASSPHRASE 환경변수를 설정할 수 있습니다.
$ PASSPHRASE=mypass duplicity ~/Downloads scp://user@remote_site.com//home/user/backup/
  커맨드라인에 평문 패스프레이즈를 넣기 싫다면 아래의 백업 스크립트를 사용하는 방법도 있습니다. 당연히 본인만 읽을 수 있도록 퍼미션을 설정해야 합니다.
export PASSPHRASE=yourpass
duplicity ~/Downloads scp://user@remote_site.com//home/user/backup/
unset PASSPHRASE

암호화 없이 원격 증강 백업
  암호화할 필요가 없다면 암호화를 비활성화할 수도 있습니다.
$ duplicity --no-encryption ~/Downloads scp://user@remote_site.com//home/user/backup/

원격 백업의 무결성 확인
  중요한 데이터의 경우 원격 백업이 성공적으로 됐는지 확인할 필요가 있습니다. 로컬과 원격 볼륨이 동일한지 확인하려면 아래의 명령어를 사용합니다.
$ duplicity verify scp://user@remote_site.com//home/user/backup/ ~/Downloads
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Wed Aug  7 19:34:52 2013
Verify complete: 8 files compared, 0 differences found.
  참고로 "verify" 옵션을 사용할 때는 로컬과 원격 디렉토리의 순서를 반대로 적어야 합니다. 즉, 원격 디렉토리를 먼저 적어야 합니다.

원격 백업을 사용하여 복구
  원격 백업본을 사용해 로컬에 적용하려면 아래와 같은 명령어를 실행합니다.
$ duplicity scp://user@remote_site.com//home/user/backup/ ~/Downloads_restored
  원격 백업을 사용하여 복구하려면 지정한 복구 대상 디렉토리(예: Downloads_restored)가 로컬에 존재하지 않아야 합니다.

FTP를 통한 보안성 있는 원격 증강 백업
  SCP와 더불어 FTP를 포함한 몇 가지 다른 프로토콜을 사용하는 것도 가능합니다. FTP를 사용하려면 아래와 같은 형식을 이용합니다.
$ duplicity ~/Downloads ftp://username@ftp_server.com/backup_directory
  비대화형으로 실행하려면 FTP_PASSWORD 환경변수에 FTP 패스워드를 설정합니다.
$ FTP_PASSWORD=mypass duplicity ~Downloads ftp://username@ftp_server.com/backup_directory

트러블슈팅 팁
  아래와 같은 에러가 발생한다면 python용 SSH2 프로토콜 라이브러리를 설치하지 않은 것입니다.
BackendException: Could not initialize backend: No module named paramiko
  문제를 해결하기 위해 데비안 계열의 경우 아래 명령어를 실행합니다.
$ sudo apt-get install python-paramiko
  레드햇 계열의 경우 아래 명령어를 실행합니다.
$ sudo yum install python-paramiko

  아래와 같은 에러가 발생한다면 원격 SSH 서버에 대해 패스워드 없이 SSH 로그인을 할 수 있도록 설정하지 않은 것입니다.
BackendException: ssh connection to xxx@xxxx failed: No authentication methods available
2013/08/12 15:39 2013/08/12 15:39
Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : How to back up hard drives for disaster recovery with Clonezilla

  Clonezilla는 GPL 라이선스의 디스크 복제 및 백업 소프트웨어입니다. 디스크/파티션을 다른 로컬 디바이스로 복제하거나 복제 이미지를 외부 SSH/Samba/NFS 서버로 보낼 수 있습니다. 또한 DRBL(Diskless Remote Boot in Linux)에서 실행하여 거대 규모의 네트워크로 묶인 컴퓨터들을 동시에 복제할 수 있습니다.

  이 글에서는 엔드 유저 환경에서 하드 드라이브를 복제/백업하고 복구하는 방법을 설명합니다.

  Clonezilla는 Clonezilla live의 ISO 이미지를 통해 사용할 수 있으며 데비안 기반 ISO 이미지와 우분투 기반 ISO 이미지가 있습니다. 후자는 좀 더 최신 커널을 사용하며 비자유(non-free) 컴포넌트도 사용합니다. Clonezilla로 하드 드라이브를 백업하려면 Clonezilla ISO 이미지로 라이브 CD/USB를 만들어야 합니다.

Clonezilla로 하드 드라이브 백업하기
  전체 하드 드라이브를 백업할 컴퓨터에 Clonezilla 라이브 CD/USB를 넣고 부팅하여 BIOS에서 부팅 우선 순위를 조절 후 부팅하여 초기 화면에 진입합니다. 거기서 Clonezilla live 옵션을 선택합니다.

출처 : http://xmodulo.com/2013/08/how-to-back-up-hard-drives-for-disaster-recovery-with-clonezilla.html

  그러면 이제부터 부팅 옵션을 정하기 위한 선택화면으로 들어가게 됩니다. 먼저 Clonezilla를 시작할 것인지, 아니면 로그인 쉘로 빠질 것인지 선택하는 화면이 나오는데 여기서 Clonezilla를 선택합니다. 물론 쉘로 빠지는 걸 선택하면 fsck 실행, 루트 패스워드 재설정 등 여러 긴급 작업을 할 수 있겠죠.

http://xmodulo.com/2013/08/how-to-back-up-hard-drives-for-disaster-recovery-with-clonezilla.html

  다음으로 "device-image" 모드와 "device-device" 모드 중 하나를 선택합니다. 전자는 디스크/파티션 이미지를 생성하고, 후자는 디스크를 직접 다른 디스크에 복제합니다. 지금은 "device-image" 모드를 선택했다고 가정하고 설명합니다.

  다음으로 이미지가 저장될 곳을 선택합니다. 지금은 "ssh_server"를 선택했다고 가정하겠습니다.

  그 다음에는 네트워크 인터페이스를 설정하는 화면이 나옵니다. IP와 기본 네트워크 정보를 입력한 후 SSH 서버에 접속할 때 사용할 계정명을 적습니다. 이때 이미지 파일을 저장할 SSH 서버의 절대 경로도 지정합니다. Clonezilla는 입력한 SSH 서버 정보를 기반으로 sshfs를 사용하여 원격 SSH 서버의 대상 디렉토리를 로컬에 마운트하는데 이 과정은 직접 화면으로 볼 수 있습니다. 확인이 끝나면 엔터를 눌러 계속 진행합니다.

  이제 복제 모드를 선택하는 화면이 나옵니다. "Beginner"와 "Expert"가 있는데 지금은 "Beginner"를 기준으로 설명합니다.

  다음 화면에서는 디스크 전체를 백업할 것인가, 아니면 디스크의 특정 파티션만 백업할 것인가를 선택합니다. 지금은 디스크 전체를 백업하기 위해 savedisk 옵션을 선택했다고 가정하겠습니다.

  그 다음에는 생성할 이미지 파일의 이름을 설정합니다. 그 후 스페이스 키로 백업할 디스크를 고릅니다.

  다음으로 이미지를 생성하기 전에 원본 파일 시스템에 대한 검사 및 교정을 실시할지를 정합니다. 검사 및 교정을 하려면 해당 파일 시스템이 fsck 명령어로 검사할 수 있는 파일 시스템이어야 합니다.

  다음으로 생성한 이미지에 대한 검사 여부를 정합니다.

  이제 모든 선택이 끝났으며 선택한 디스크 드라이브의 압축된 이미지 파일을 생성하여 원격 SSH 서버에 전송하게 됩니다.

http://xmodulo.com/2013/08/how-to-back-up-hard-drives-for-disaster-recovery-with-clonezilla.html

  이미지가 성공적으로 생성되고 확인까지 끝나면 아래와 같은 화면을 볼 수 있습니다.

http://xmodulo.com/2013/08/how-to-back-up-hard-drives-for-disaster-recovery-with-clonezilla.html

  엔터를 눌러 계속 진행합니다. 그러면 아래와 같은 화면을 통해 컴퓨터 종료, 리붓, 다른 디스크 드라이브/파티션을 대상으로 같은 백업 절차 진행 등을 할 수 있습니다.

http://xmodulo.com/2013/08/how-to-back-up-hard-drives-for-disaster-recovery-with-clonezilla.html


Clonezilla로 하드 드라이브 복구하기
  방법은 매우 쉽습니다. Clonezilla CD/USB로 부팅 후 아래 화면이 나올 때까지 위와 동일하게 진행합니다.

http://xmodulo.com/2013/08/how-to-back-up-hard-drives-for-disaster-recovery-with-clonezilla.html

  위 화면에서 "restoredisk"를 선택하면 복구에 사용할 이미지를 선택하는 화면이 나오며, 그 다음에는 대상 로컬 디스크를 선택하는 화면이 나옵니다. 선택이 끝나면 복구가 진행됩니다.

2013/08/09 09:25 2013/08/09 09:25
Posted
Filed under 쉘 스크립트
참조 원문 : Back up MySQL Databases with a Simple Bash Script
관련 글 : mysqldump로 MySQL DB 백업하기

  LPIC 공부한다는 변명하에 와일드 플래닛에 빠져 살아 포스팅이 사라진 요즘 날로 포스팅할 꺼리가 보여서 낼름 주워먹으러 왔습니다. MySQL DB를 백업하는 간단명료한 스크립트입니다.
NOW=`date +"%Y-%m"`;
BACKUPDIR="location/of/your/backup/dir/$NOW";

### Server Setup ###
#* MySQL login user name *#
MUSER="user";

#* MySQL login PASSWORD name *#
MPASS="pass";

#* MySQL login HOST name *#
MHOST="your-mysql-ip";
MPORT="your-mysql-port";

# DO NOT BACKUP these databases
IGNOREDB="
information_schema
mysql
test
"

#* MySQL binaries *#
MYSQL=`which mysql`;
MYSQLDUMP=`which mysqldump`;
GZIP=`which gzip`;

# assuming that /nas is mounted via /etc/fstab
if [ ! -d $BACKUPDIR ]; then
  mkdir -p $BACKUPDIR
else
 :
fi

# get all database listing
DBS="$(mysql -u $MUSER -p$MPASS -h $MHOST -P $MPORT -Bse 'show databases')"

# SET DATE AND TIME FOR THE FILE
NOW=`date +"d%dh%Hm%Ms%S"`; # day-hour-minute-sec format
# start to dump database one by one
for db in $DBS
do
        DUMP="yes";
        if [ "$IGNOREDB" != "" ]; then
                for i in $IGNOREDB # Store all value of $IGNOREDB ON i
                do
                        if [ "$db" == "$i" ]; then # If result of $DBS(db) is equal to $IGNOREDB(i) then
                                DUMP="NO";         # SET value of DUMP to "no"
                                #echo "$i database is being ignored!";
                        fi
                done
        fi

        if [ "$DUMP" == "yes" ]; then # If value of DUMP is "yes" then backup database
                FILE="$BACKUPDIR/$NOW-$db.gz";
                echo "BACKING UP $db";
                $MYSQLDUMP --add-drop-database --opt --lock-all-tables -u $MUSER -p$MPASS -h $MHOST -P $MPORT $db | gzip > $FILE
        fi
done
  몇몇 변수를 고쳐주면 바로 사용할 수 있으며 변수명과 내용은 아래와 같습니다.
  • BACKUPDIR : 백업을 저장할 디렉토리
  • MUSER : MySQL 유저
  • MPASS : MySQL 유저 패스워드
  • MHOST : MySQL 서버의 IP 주소나 도메인명(예: localhost)
  • MPORT : MySQL 포트(디폴트: 3306)
  이제 스크립트 파일에 실행 권한을 줍니다. 또한 파일 안에 패스워드가 있으므로 아무나 읽지 못하게 읽기 권한을 적절히 설정합니다. 이제 필요할 때 수동으로 실행하거나 crontab을 이용하여 정기적으로 실행하면 됩니다. 예를 들어 매일 자동으로 백업을 하게 하려면 'crontab -e'를 실행하여 아래의 내용을 추가합니다.
@daily /스크립트/경로/스크립트명.sh
  만약 DB가 크다면 max_packet_size의 디폴트 값이 문제가 되어 실행에 실패할 수도 있는데 그럴 경우에는 mysqldump 명령어 부분에 아래와 같은 옵션을 추가하면 됩니다.
--max_allowed_packet=500M
2011/01/17 15:59 2011/01/17 15:59
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : Using lsof to Find Open Files
관련 글 : 특정 포트를 열고 있는 프로세스 찾기

  lsof는 "list open files"의 약자로 특정 프로그램이 사용 중인 파일 또는 열려 있는 네트워크 포트를 알 수 있는 유틸리티입니다. 루트킷이나 IRC 봇을 처리할 때도 유용합니다.

  lsof를 그냥 실행하면 사용 중인 모든 파일(네트워크 소켓, 파이프,특수 파일 포함)을 보여줍니다. 이 명령어로 파일을 사용할 때 쓴 명령어, PID, 사용자, 파일 디스크립터, 종류, 크기, 이름을 알 수 있습니다. 특정 프로세스가 사용 중인 파일만 보려면 -p 옵션과 프로세스의 PID를 적고 특정 사용자가 열고 있는 파일만 보려면 -u 옵션과 사용자명(또는 UID)을 적습니다. 만약 어떤 프로세스나 사용자가 사용 중인 파일들을 결과에서 제외하고 싶다면 프로세스ID나 사용자명 바로 앞에 ^ 문자를 붙이면 됩니다. 참고로 lsof의 실행에는 루트 권한이 필요합니다.
lsof -p 프로세스PID  : 해당 프로세스가 사용 중인 파일 목록 출력
lsof -u 유저명       : 해당 유저가 사용 중인 파일 목록 출력
lsof -u ^유저명      : 목록 중 해당 유저가 사용 중인 파일 제외
  네트워크를 통해 사용 중인 파일은 -i 옵션으로 볼 수 있습니다. 이것으로 사용 중인 파일과 소켓, 프로토콜, 호스트명 등을 알 수 있습니다. 추가로 IP 버전(IPv4는 -i4 옵션, IPv6는 -i6 옵션), 프로토콜(UDP와 TCP 옵션), 호스트명, 포트(콜론 문자 뒤에 포트번호) 같은 것을 적어 검색 결과를 좁힐 수 있습니다. 기본적으로 lsof는 결과를 출력할 때 IP의 도메인을 조회하여 번역한 후 출력하지만 -n 옵션을 사용하면 조회를 하지 않고 출력하여 실행 시간을 단축할 수 있습니다.

  "그리고"의 의미로 -a 옵션을 사용할 수 있습니다. 예를 들어 특정 사용자가 사용 중인 네트워크 소켓(TCP와 UDP 소켓)만 보려면 다음과 같이 명령어를 사용하면 됩니다.
lsof -u 유저명 -a -i


2010/12/13 09:46 2010/12/13 09:46
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Using mysqldump to Back Up Your MySQL Database

  저번에 SSH와 관련된 글에서도 mysqldump를 이용해서 백업을 하는 모습이 잠깐 등장했었는데요. 이걸 이용해서 서버의 모든 데이터베이스를 백업할 수도 있고 하나의 데이터베이스나 테이블 단위로 백업하는 것도 가능합니다. 그래서 이번에는 MySQL에서 가장 기초적인 백업 도구인 mysqldump를 이용한 백업에 대해 알아보겠습니다. 터미널에서 mysqldump를 쳐보면 대략 아래와 같은 실행법이 출력됩니다.
mirashi@myservlab:~$ mysqldump
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help
  예를 들어 모든 데이터베이스의 스키마와 데이터를 backup.sql이라는 이름으로 저장하려면 다음과 같이 명령어를 사용하면 됩니다. 물론 루트가 아니라도 모든 DB를 읽을 수 있는 권한이 있는 계정이 있다면 그 계정을 사용하면 되겠습니다
mysqldump -u root -p --all-databases > backup.sql
Enter password:   <- 패스워드 입력
  만들어진 파일을 까보면 SQL 문으로 이뤄진 것을 볼 수 있는데 DB를 하나하나 Use로 선택하면서(없으면 생성) 기존의 테이블을 DROP으로 지운 후 백업할 당시의 내용으로 다시 만드는 것을 볼 수 있습니다.

  아래는 'singleDB'라는 이름의 데이터베이스를 db_backup.sql이라는 파일로 백업하는 예입니다.
mysqldump -u root -p singleDB > db_backup.sql
  그리고 아래는 'singleDB'라는 데이터베이스 안에 있는 'singleTABLE'이라는 이름의 테이블을 table_backup.sql이라는 파일로 백업하는 예입니다.
mysqldump -u root -p singleDB singleTABLE > table_backup.sql
  경우에 따라서는 데이터베이스의 스키마만 백업하고 싶을 수도 있는데 그럴 때는 아래처럼 --no-data 옵션을 추가하면 됩니다.
mysqldump -u root -p --no-data singleDB > db_backup.sql
  이와 반대로 데이터만 백업하고 싶을 때는 --no-create-info 옵션을 주면 됩니다.
mysqldump -u root -p --no-create-info singleDB > db_backup.sql
  이제 이걸 응용해서 cron을 이용해 자동으로 백업을 하도록 만들어보겠습니다. 먼저 DBbackup.sh 이란 이름으로 아래의 간단한 스크립트를 만듭시다. 스크립트의 저장 위치는 /var/scripts, MySQL 루트 계정의 패스워드는 abcd, 백업할 데이터베이스명은 singleDB, 백업의 저장 위치는 /var/backup, 파일명은 'DBbackup-년월일.sql'로 가정하겠습니다.
#!/bin/sh
mysqldump -uroot -pabcd singleDB > /var/backup/DBbackup-`date +%Y%m%d`.sql
  파일 내에 MySQL 루트 계정의 비번이 노출되어 있으므로 퍼미션 관리에 신경써야 합니다. 이제 'crontab -e'를 통해 특정 시간에 스크립트가 실행되도록 만듭니다. 아래 예에서는 새벽 3시에 돌아가도록 하고 있습니다.
0 3 * * * /var/script/DBbackup.sh
  지금까지 알아본 방법은 MySQL에서 백업을 하는 방법 중 가장 간단한 방법입니다. 만약 증분 백업을 원하신다면 binary_log 툴을 이용하는 방법이 있고 이중화를 위한 마스터/슬레이브 구성(마스터 서버의 데이터를 슬레이브 서버로 복사)을 원하신다면 Replication을 이용하는 방법이 있습니다. 아마 언젠가 관련 내용을 포스트하는 날이 오지 않을까 싶네요.


2010/11/18 15:29 2010/11/18 15:29