'rsync'에 해당되는 글 2건

  1. 2009.06.04 패키지 관리 속도 향상법 (emerge sync)
  2. 2008.10.27 리눅스(Linux) 시스템 및 데이타 백업(Data Backup)
2009. 6. 4. 15:23

패키지 관리 속도 향상법 (emerge sync)

Speeding up portage with cdb -- UPDATE

When it comes to speed the database backend of portage is rather slow because it's implemented as a raw abstraction in the filesystem. It is possible to replace this with a mysql backend which is not ideal, if you don't want to start a full-blown RDBMS. My solution is rather tiny, if you compare the code and the packages you need for that:

  1. You'll need the python interface python-cdb for DJB's cdb
    emerge python-cdb

  2. Create /usr/lib/portage/pym/portage_db_cdb.py and put this in it:
    # Copyright 2004, 2005 Tobias Bell <tobias.bell@web.de>
    # This program is free software; you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation; either version 2 of the License, or
    # (at your option) any later version.
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # GNU General Public License for more details.
    # You should have received a copy of the GNU General Public License
    # along with this program; if not, write to the Free Software
    # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

    import portage_db_template
    import os
    import os.path
    import cPickle
    import cdb

    class _data(object):

        def __init__(self, path, category, uid, gid):
            self.path = path
            self.category = category
            self.uid = uid
            self.gid = gid
            self.addList = {}
            self.delList = []
            self.modified = False
            self.cdbName = os.path.normpath(os.path.join(
                self.path, self.category) + ".cdb")
            self.cdbObject = None

        def __del__(self):
            if self.modified:


        def realSync(self):
            if self.modified:
                self.modified = False
                newDB = cdb.cdbmake(self.cdbName, self.cdbName + ".tmp")
                for key, value in iter(self.cdbObject.each, None):
                    if key in self.delList:
                        if key in self.addList:
                            newDB.add(key, cPickle.dumps(self.addList[key], cPickle.HIGHEST_PROTOCOL))
                            del self.addList[key]
                    elif key in self.addList:                   
                        newDB.add(key, cPickle.dumps(self.addList[key], cPickle.HIGHEST_PROTOCOL))
                        del self.addList[key]
                        newDB.add(key, value)


                for key, value in self.addList.iteritems():
                    newDB.add(key, cPickle.dumps(value, cPickle.HIGHEST_PROTOCOL))
                del newDB
                self.addList = {}
                self.delList = []


        def openCDB(self):
            prevmask = os.umask(0)
            if not os.path.exists(self.path):
                os.makedirs(self.path, 02775)
                os.chown(self.path, self.uid, self.gid)
            if not os.path.isfile(self.cdbName):
                maker = cdb.cdbmake(self.cdbName, self.cdbName + ".tmp")
                del maker
                os.chown(self.cdbName, self.uid, self.gid)
                os.chmod(self.cdbName, 0664)

            self.cdbObject = cdb.init(self.cdbName)

        def closeCDB(self):
            if self.cdbObject:
                self.cdbObject = None

    class _dummyData:
        cdbName = ""

        def realSync():
        realSync = staticmethod(realSync)

    _cacheSize = 4
    _cache = [_dummyData()] * _cacheSize

    class database(portage_db_template.database):   

        def module_init(self):
            self.data = _data(self.path, self.category, self.uid, self.gid)

            for other in _cache:
                if other.cdbName == self.data.cdbName:
                    self.data = other
                _cache.insert(0, self.data)           
        def has_key(self, key):
            retVal = 0

            if self.data.cdbObject.get(key) is not None:
                retVal = 1

            if self.data.modified:
                if key in self.data.delList:
                    retVal = 0
                if key in self.data.addList:
                    retVal = 1
            return retVal

        def keys(self):
            myKeys = self.data.cdbObject.keys()

            if self.data.modified:
                for k in self.data.delList:
                for k in self.data.addList.iterkeys():
                    if k not in myKeys:
            return myKeys

        def get_values(self, key):
            values = None
            if self.has_key(key):
                if key in self.data.addList:
                    values = self.data.addList[key]
                    values = cPickle.loads(self.data.cdbObject.get(key))

            return values
        def set_values(self, key, val):
            self.data.modified = True
            self.data.addList[key] = val

        def del_key(self, key):
            retVal = 0
            if self.has_key(key):
                self.data.modified = True
                retVal = 1
                if key in self.data.addList:
                    del self.data.addList[key]

            return retVal
        def sync(self):
        def close(self):

    if __name__ == "__main__":
        import portage
        uid = os.getuid()
        gid = os.getgid()
        portage_db_template.test_database(database,"/tmp", "sys-apps", portage.auxdbkeys, uid, gid)

  3. Create /etc/portage/modules and fill in
    portdbapi.auxdbmodule = portage_db_cdb.database
    eclass_cache.dbmodule = portage_db_cdb.database

  4. Now you'll have to regenerate the portage cache with
    emerge metadata

Now try some searches with emerge especially with --searchdesc :wink:
emerge --searchdesc python
should be much faster than before. You can compare the performance by switching back to the normal
db module. Just make a
mv /etc/portage/modules /etc/portage/__modules
I hope you enjoy your accelerated portage.

Default portage
cd /var/cache/edb/dep/usr
rm * -Rf
time emerge metadata
real    0m40.575s
user    0m26.260s
sys     0m9.592s

time emerge -S mozilla
real    1m46.003s
user    1m36.215s
sys     0m8.721s

time emerge -upDv world
real    0m14.678s
user    0m13.289s
sys     0m1.130s

python-cdb powered portage
cd /var/cache/edb/dep/usr
rm * -Rf
time emerge metadata
real    2m18.022s
user    0m26.538s
sys     0m31.505s

time emerge -S mozilla
real    1m39.624s
user    1m32.628s
sys     0m5.418s

time emerge -upDv world
real    0m13.856s
user    0m12.986s
sys     0m0.727s

## emerge 명령어 사용법 ##

emerge 옵션 테이블

Option1 Option2 기능
-s search 프로그램 찾기 및 각 프로그램에 대한 설명 참조 가능
-p pretend 프로그램 설치 이전, 설치를 가정하고 어떤 일이 벌어지는지 확인 가능
-v -- pretend 옵션과 더불어 쓰이며, 설정 혹은 비설정 use 옵션 확인 가능
unmerge 설치된 패키지 삭제 옵션,(>,<,=)기호 사용시 특정 버젼선택 삭제가능
help 자세한 설명 필요할때
rsync 포테이지 트리 업데이트 옵션
fetchonly 필요한 압축파일을 다운로드(컴파일안함)
emptytree 포테이지가 패키지및 의존성을 만족하는 패키지들이 모두 설치되지 않은것으로 인식
nodeps 의존성을 무시하고 패키지 설치(컴파일 실패 가능성..있음)
onlydeps 패키지의 의존성을 만족시키기 위한 것들만 설치(지정 패키지 설치안됨)
noreplace 이미 설치되어 있다면 패키지 설치를 생략
usepkg 컴파일이 아닌 이미 컴파일된 바이너리로 설치시도(PKGDIR 환경변수값 이용)
debug ebuild에 기초한 bash스크립트 문법적 에러를 추적할때 사용
autoclean emerge가 패키지의 빌드를 시작하기전에 임시 빌드 디렉토리 강제 청소
verbose emerge가 더 많은 정보를 표시
update 패키지 업데이트시 사용
prune 가장 마지막으로 설치된 버전을 제외하고 모든 패키지의 모든 버전들을 제거

사용법 emerging

사용법 1. emerge package_name
 # emerge mozilla
사용법 2. emerge dir/package_name rsync처럼 패키지명이 emerge의 특정 옵션으로 사용될 경우에 사용
# emerge net-misc/rsync
사용법 3. emerge emergefile 특정 버전을 설치할 때 사용
# emerge mozilla-1.3-r1.ebuild

portage tree 동기화

# emerge sync
# emerge rsync

/usr/portage의 개인 설정이 있다면 전부 삭제됨
sync와 rsync는 완전히 동일하게 작동합니다. /lefthander
메뉴얼에서는 rsync가 sync보다 서버의 부하를 덜 주어서 될수 있으면 rsync를 이용해 달라는 당부의 글이 있습니다.
아마도 sync는 모든 파일을 갱신하고 rsync는 없는 파일만 갱신하는것이 아닌가 싶습니다.

# emerge-webrsyncsync

보다 속도가 더 빠름. 스냅샷 압축파일을 받아와서 동기화

portage tree 갱신

# emerge -up system
# emerge -up world 
업데이트할 수 있는 system, world 패키지 확인

# emerge system
시스템 패키지 업데이트

# emerge world
world 패키지 업데이트

system과 world를 업데이트할 때 -u (--update) 옵션을 사용하면 의존성 있는 패키지도 함께 갱신한다.
이 의존성에 걸리는 패키지는 다운그레이드될 수 있다.

패키지 인스톨 전 확인

# emerge --pretend [package name]
# emerge -p pornview
# emerge -pv [package_name | ebuildfile]
설치할 패키지가 이미 설치되어 있는지, 의존관계 등의 정보를 확인

패키지 인스톨

#emerge [package name]

변경점 확인

#emerge --changelog [package name] or emerge -pl [package name]
이미 설치된 패키지와 portage상의 최신 패키지와의 차이 표시

패키지 갱신

#emerge [package name]

## 패키지 관리 명령어 비교 (yum / emerge / apt-get) ##

1. 패키지 목록 업데이트

root@Fedora # yum check-update 
root@Gentoo # emerge --sync
root@Debian # apt-get update

2. 최신 패키지로 업데이트
root@Fedora # yum update
root@Gentoo # emerge -DNu world
root@Debian # apt-get upgrade

3. 패키지 설치
root@Fedora # yum install <packagename>
root@Gentoo # emerge <packagename>
root@Debian # apt-get install <packagename>

4. 패키지 재설치
root@Fedora # yum update <packagename>
root@Gentoo # emerge --oneshot <packagename>
root@Debian # apt-get install --reinstall <packagename>

5. 패키지 검색
root@Fedora # yum search <packagename>
root@Gentoo # emerge --searchdesc <packagename>
root@Debian # apt-cache search <packagename>

6. 패키지 삭제
root@Fedora # yum remove <packagename>
root@Gentoo # emerge --unmerge <packagename>
root@Debian # apt-get remove <packagename>
참고 : http://wiki.kldp.org/wiki.php/PackageMgmt

Trackback 1 Comment 0
2008. 10. 27. 09:27

리눅스(Linux) 시스템 및 데이타 백업(Data Backup)


시스템 백업의 중요성 : 외부의 침입자로부터 보호, 예기치 못한 사고로부터의 복원, 시스템 백업은 매일 해야 한다.


1. 백업(backup) 종류

1) 완전 백업(Full backup)

2) 증분 백업(Incremental Baxkup) - 부분 백업

3) 차등 백업(Differential Backup) - 전체 백업후의 모든 것을 백업하는것


2. 백업 정책과 백업 시간

백업 매체: 하드 디스크, CD-RW, DVD-RW

백업 시간: 이용자가 적은 새벽 시간대(cron이나 at데몬을 이용)에 한다.


3. 백업 매체 선택

비용보다는 매체의 신뢰성을 더 따져야 할 것이다. 테이프는 장비가 비싸고 저장 매체는 저가이나 일반인이 사용하기엔 너무 비용부담이 크다.


4. tar를 이용한 로컬 데이터 백업

1) tar의 증분 백업(--listed-invremental (-g)옵션)

# mkdir /backup

# mkdir /backup/home

# mkdir /backup/home/fedora

# cd /home/fedora

# touch test1 test2 test3

# tar cpfz /backup/Full-backup.tar.gz --listed-incremental /backup/backuplist /home/fedora

# touch /home/fedora/test4

# tar cpfz /backup/Incremental1.tar.gz --listed-incremental /backup/backuplist /home/fedora

# touch /home/fedora/test5

# tar cpfz /backup/Incremental2.tar.gz --listed-incremental /backup/backuplist /home/fedora

# rm -f /home/fedora/test5

# tar cpfz /backup/Incremental3.tar.gz --listed-incremental /bckup/backuplist /home/fedora

# ls -l /backup

2) 증분 백업 복원

# cd /backup

# tar xvzf Full-backup.tar.gz

# ls /backup/home/fedora

# tar xvzf Incremental1.tar.gz -g ./backuplist

# ls home/fedora

# tar svzf Incremental2.tar.gz -g ./backuplist

# ls home/fedora

# tar xvzf Incremental3.tar.gz -g ./backuplist

# ls home/fedora

# ls /home/fedora

3) tar를 이용한 특정 디렉토리 데이터 자동 백업

자동화 작업은 백업할 때 많은 도움을 주는데, 아래에서는 자동으로 백업하기 위해서 backup.cron이라는 스크립트를 예로들어 설명하고 있다. 이 백업 스크립트는 몇 가지 변수(COMPUTER, DIRECTORIES, BACKUPDIR 그리고 TIMEDIR)만 변경해 주면 어떠한 환경에서도 사용할 수 있다. 이 스크립트를 이용해 첫 달 초에 실행하고 주된 변경이 있기 전에 한 달 동안 실행한다. 이 예제에서는 로컬 서버의(BACKUPDIR) 디렉토리로 백업을 하는데 물론 이 스크립트를 수정하여 로컬 서버에 있는 테이프나 nfs를 통한 백업도 할 수 있다.


'touch /etc/cron.daily/backup.cron'로 /etc/cron.daily/ 디렉토리에 backup.cron 파일을 생성하고 아래의 내용을 추가한다.



#각자의 환경에 맞도록 아래 5개의 변수를 수정한다.

COMPUTER=deep #이 컴퓨터의 이름

DIRECTORIES="/home #백업할 디렉토리

BACKUPDIR=/backups #백업을 저장할 위치

TIMEDIR=/backups/last-full #풀 백업한 시각을 저장할 파일

TAR=/bin/tar #tar 명령의 위치

#아래는 전혀 변경할 필요가 없다.


DOW=`date +%a` #일주일 중의 요일. 예를 들면 Mon

DOM=`date + %d` #한 달(31일) 중의 날짜. 예를 들면 27

DM=`date +%d%b` #날짜와 달. 예를 들면 27Sep

#한 달의 첫날(1일)에 영원한 풀 백업이 진행된다.

#매 일요일에는 지난 일요일의 백업을 덮어쓰는 풀 백업이 진행된다.

#나머지 시간에는 증가분 백업이 진행되는데,

#각각의 증가분 백업은 같은 이름으로 일주일 전의 증가분 백업을 덮어쓴다.


#만약 NEWER = ""일 경우 tar는 디렉토리에 있는 모든 파일을 백업하고

#NEWER의 날짜는 매주 일요일에 쓰여지는 파일에서 읽어온다.


#매달 풀 백업

if( $DOM = "01" ]; then




#매주별 풀 백업

if [ $DOW = "Sun" ]; then


NOW=`date +%d-%b`

#풀 백업 날짜를 갱신한다.

echo $NOW > $TIMEDIR/$COMPUTER-full-date


#증가분 백업을 한다. 지난 주의 데이터를 덮어쓴다.


#지난 풀백업의 날짜를 가져온다.

NEWER="--newer `cat $TIMEDIR/$COMPUTER-full-date`"



주의) 백업하기 전에 백업을 저장할 디렉토리인(BACKUPDIR)의 풀 백업한 시간을 저장한 파일(TIMEDIR)은 이 백업 스크립트를 실행하기 전에 미리 생성해야 한다. 그렇지 않다면 오류 메시지가 나타날 것이다.


매 달의 처음(01-month-year)에 이 백업 스크립트를 실행하지 않는다면 증가분 백업을 제대로 실행하기 위해 일요일에 백업되었음을 나타내는 파일이 필요하다. 한 주의 중반 정도에 백업을 시작한다면 TIMEDIR에 시간을 나타내는 파일을 생성할 필요가 있다.

- TIMEDIR 디렉토리에 시간을 나타내는 파일을 생성하려면 아래와 같은 명령을 입력한다.

#date +%d%b > /backups/last-full/myserver-full-date

'/backups/last-full'은 TIMEDIR 변수로서 풀 백업을 한 시간을 저장하는 것이고 'myserver-full-date'은 서버의 이름이다(이를테면 deep등). 그리고 시간을 나타내는 파일은 15-Feb와 같이 한 줄로 되어 있다.


이 스크립트를 실행이 가능하고 관리자인 root만 읽고 실행할 수 있도록 실행권한을 변경한다.

#chmod 700 /etc/cron.daily/backup.cron

주의) 이 스크립트 파일은 /etc/cron.daily 디렉토리에 있으므로 cron에 의해 매일 오전 1시에 자동으로 실행된다.

4) tar를 이용한 로컬 데이터 미러링하기

형식 : tar cpf - --directory=백업할경로 | (cd /mnt/hdb4; tar xpf -)

# mkdir /data/fedora

# ls -l /home/fedora

# tar cpf - --derectory=/home/fedora | (cd /data/fedora; tar xpf -)

# ls -l /data/fedora

5) tar를 이용한 리눅스 운영체제 백업

운영체제를 백업하기 위해서 /proc, /mnt, /media, tmp 디렉토리는 포함하지 않아도 된다.(--exclude)

# tar cpvfz /backup/Fedora-Core4-bk.tar.gz --exclude=/proc --exclude=/tmp --exclude=/media --exclude=/backup --absolute-name /


5. Rsync를 이용한 로컬 데이터 백업 및 서버 동기화

1) 미러링(Mirroring)

리눅스 배포판의 미러링 사이트, 사이트 동기화, 로컬 시스템의 데이터 백업

2) rsync

분산 서버 데이터 동기화, SSH를 이용한 미러링

3) rsync 설치

# rpm -q rsync

# yum list installed rsync 또는 # apt-get install rsync 를 이용하여 설치

4) SSH를 이용한 원격 서버 데이터 미러링

형식 : rsync -avzr --delete -e ssh 원격서버:데이터경로 백업경로

# mkdir /data4/Fedora-Nirror

# rsync -avzr --delete -e ssh /data4/Fedora-Mirror/

>> ssh를 이용한 rsync데이터 동기화를 위해서는 서버에 ssh서버가 작동 하고 있어야 한다.

5) rsync 서버 설정(/etc/rsyncd.conf)

>> 사용자가 직접 /etc/rsyncd.conf파일을 만듬.

# cat > /etc/rsyncd.conf


comment=Fdora Core6 Linux




use chroot=yes

read only=yes

host allow=

max connections=5


6) /etc/xinetd.d/rsync 설정

rsync 서비스는 수퍼 데몬 xinetd에 의해서 동작한다.

/etc/xinetd.d/rsync 파일을 만들어 xinetd 데몬에 의해 읽어 지도록 설정.

# default: off

# description: The rsync server is a good addirion to an ftp server, as it \

# allows crc checksumming etc.

service rsync


disable = no

sicket_type = stream

wait = no

user = root

server = /usr/bin/rsync

server_args = --deamon

log_on_failure += USERID



-- insert --

# /etc/init.d/xinetd restart

>> rsync 데몬은 독립 모드(standalone)으로 동작하질 않기 때문에 ps ax 명령으로느 이 데몬이 동작하고 있는지를 확일할 수 없다.

(tcp873번 포트로 텔넷 접속을 시도하여 연결 확인 /etc/sysconfig/iptables에서 수정)

# telnet localhost 873

7) rsync 사용법

형식: rsync [옵션] rsync서버주소::서비스명 미러경로

>> rsync 서비스 모듈(서비스명과 설명) 알아보기

형식: rsync 서버주소::

# rsync

>> 로컬 시스템 데이터 백업

형식: rsync -avzr --delete 백업소스경로 백업될경로

# mkdir /rsync-src /rsync-mirror

# cd /rsync-src

# touch test1 test2 test3 test4 test5

# rsync -avzr /rsync-src/ /ysync-mirror/

# ls -l /rsync-mirror/

# rm -f test3 test4

# rsync -avzr --delete /rsyc-src/ /rsync-mirror/

# ls -l /rsync-mirror/

>> 원격 서버의 데이터 미러링

형식: rsync-avz 서버주소::모듈명(서비스명) 백업될경로


6. CD-RW/DVD-RW를 이용한 하드 디스크 백업

1) CD/DVD 레코딩 도구 설치

# yum list installed mkisofs 또는 # yum install mkisofs

# yum install cdrecord

# yum install dvd+tw-tools

# yum install k3b

# yum install xcdroast

2) 로컬 데이터 백업 ISO 파일 만들기

mkisofs 도구로 ISO이미지 파일 만들기

형식: mkiso -r -J -input-charset UTF-8 -o /디렉토리/이미지파일명.iso /백업데이터경로

# mkisofs -r -J -input-charset UTF-8 -o /tmp/homebackup.iso /home/

3) ISO 이미지 파일 레코딩 하기

>> cdrecord로 iso이미지 파일 CD굽기

형식: cdrecord -v speed=배속 -dao driveropts=burnfree -eject dev-디바이스명 -data 이미지명

# cdrecord -v speed=40 -dao driveropts=burnfree -eject dev=/dev/hdc -data /tmp/homebackup.iso

>> growisofs로 iso이미지 DVD로 굽기

형식: growisofs -Z DVD-R/RW디바이스명 iso파일명 -use-the-force-luke=notray \

-use-the-force-luke=tty -speed=배속

# growisofs -Z /dev.hdc /tmp/homebackup.iso -use-the-force-luke=notray \

-use-the=force-luke=tty -speed=4

>> CD-RW 미디어 포맷

cdrecord -v speed=배속 dev=디바이스명 blank=all or blank=fast

>>DVD-R/+R/RW 미디어 포맷

형식: dvd+rw-format -force 디바이스명

4) 그래픽 레코딩 프로그램으로 레코딩하기

엑스윈도우용 CD레코더 : K3B, X-CD-Roast, 노틸러스, Burn-it, KOnCD, gcombust

# yum install k3b


7. 시스템 응급 복구

1) 시스템 장애 일으키기

/etc/fstab 파일의 내용중 한곳을 임으로 틀리게 수정한다.

2) 시스템 응급 복구

설치 cd를 입력하고 GRUB 상태에서 boot: linux rescue 입력후 진행

3) 수동 응급 복구

rescue창에서 skip버튼을 눌러 실행.

>> mount -o remount,rw / 를 이용해 수정하는 방법도 있다.

Trackback 1 Comment 0