HOME > °­ÁÂ >
°­ÁÂ| ¸®´ª½º ¹× ¿ÀǼҽº¿¡ °ü·ÃµÈ °­Á¸¦ º¸½Ç ¼ö ÀÖ½À´Ï´Ù.
 
Sulinux17¿¡¼­ lsync - ½Ç½Ã°£ µ¿±âÈ­ »ç¿ëÇϱâ
Á¶È¸ : 10,245  




lsync - ½Ç½Ã°£ µ¿±âÈ­




Lsyncd´Â ¡°Live Syncing Daemon¡±ÀÇ ¾àÀÚ·Î master ¼­¹ö¿¡ ÆÄÀÏ ¶Ç´Â µð·ºÅ丮°¡ º¯°æ »çÇ×ÀÌ ÀÖÀ¸¸é inotify·Î º¯°æ»çÇ×À» üũ ÇÏ¿© slave ¼­¹ö·Î ÆÄÀÏ ¶Ç´Â µð·ºÅ丮°¡ µ¿±âÈ­ ¶Ç´Â º¹Á¦°¡ µÇ¸ç, À̶§ rsync ¿Í ssh¸¦ »ç¿ëÇÏ°Ô µË´Ï´Ù.

  • inotify´Â ¸®´ª½º Ä¿³Î¿¡ Æ÷ÇÔµÈ ±â´ÉÀ¸·Î ÆÄÀϽýºÅÛ¿¡ º¯°æ »çÇ×ÀÌ ¹ß»ýµÉ¶§ À̺¥Æ®¸¦ Åëº¸ÇØ ÁÝ´Ï´Ù.



rsync´Â Remote synchronization ÀÇ ¾àÀÚ·Î local °ú remote ÀÇ µ¥ÀÌÅÍ µ¿±âÈ­¸¦ À§ÇÑ À¯Æ¿¸®Æ¼ ÀÔ´Ï´Ù. Linux System°ú Unix System ¿¡¼­ ¹é¾÷ ¿ëµµ·Î °¡Àå ³Î¸® »ç¿ëÇÏ´Â À¯Æ¿ÀÔ´Ï´Ù.

rsync À¯Æ¿ÀÇ ÀåÁ¡À¸·Î ³×Æ®¿öÅ© ´ë¿ªÆøÀ» ÃÖ¼ÒÈ­ÇÏ´Â µ¨Å¸ ÀÎÄÚµù ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¿© º¯°æÀÌ ÀϾ ºÎºÐ¸¸ Àü¼ÛÇϹǷΠºü¸£°í, È¿À²ÀûÀ¸·Î µ¥ÀÌÅ͸¦ µ¿±âÈ­ ¹× º¹Á¦¸¦ ÇÒ ¼ö ÀÖ½À´Ï´Ù.


µ¿±âÈ­ÀÇ ¹æ½ÄÀº À̵¿ ¹æ¹ý¿¡ µû¶ó Å©°Ô 4°¡Áö Á¾·ù°¡ ÀÖ½À´Ï´Ù.

A ¿Í B ¼­¹öÀÇ µ¿±âÈ­¸¦ ÇÑ´Ù°í °¡Á¤ ÇÑ´Ù¸é, ¾Æ·¡¿Í °°ÀÌ ³ª´­ ¼ö ÀÖ½À´Ï´Ù.


  • A ¡æ B :    A ¼­¹ö¿¡¼­ B ¼­¹ö·Î ÆÄÀÏÀ» ¹Ð¾î ³Ö´Â ¹æ¹ý (Upload)

  • A ¡æ B :    B ¼­¹ö¿¡¼­ A ¼­¹ö¿¡ ÀÖ´Â ÆÄÀÏÀ» ´ç°Ü ¹Þ´Â ¹æ¹ý (Download)

  • B ¡æ A :    B ¼­¹ö¿¡¼­ A ¼­¹ö·Î ÆÄÀÏÀ» ¹Ð¾î ³Ö´Â ¹æ¹ý (Upload)

  • B ¡æ A :    A ¼­¹ö¿¡¼­ B ¼­¹ö¿¡ ÀÖ´Â ÆÄÀÏÀ» ´ç°Ü ¹Þ´Â ¹æ¹ý  (Download)


lsyncd »ç¿ëÀ» À§Çؼ­ A ¼­¹ö¿¡¼­ B ¼­¹ö·Î ÆÄÀÏÀ» ¹Ð¾î ³Ö´Â ¹æ¹ýÀΠù¹øÂ° ¹æ½ÄÀ» »ç¿ëÇÏ¿© Å×½ºÆ®¸¦ ÁøÇà ÇϰڽÀ´Ï´Ù.




0. ±âŸ

  1. Å×½ºÆ® ȯ°æ
    (ÁÖ)¿¡½ºÀ¯¼ÒÇÁÆ®¿¡¼­ Á¦°ø ¹Þ¾Æ sulinux 17 64bit¸¦ »ç¿ëÇÏ¿´À¸¸ç, Å×½ºÆ® ¹× ÀÛ¾÷ ÁøÇàÀ» È®ÀÎ Çϱâ À§ÇÏ¿© ¼­¹ö 3´ë¸¦ µ¿ÀÏÇÑ ¹öÀüÀ¸·Î ¼³Ä¡ÇÏ¿´½À´Ï´Ù.
    - Kernel : 3.10.0-514.el7.x86_64
    - OS : sulinux-release-17-3.1703.el7.sulinux.x86_6
    - Master A ÀÇ IP :    192.168.0.106
    - Slave B ÀÇ IP :    192.168.0.128
    - Slave C ÀÇ IP :    192.168.0.133


  1. ¿ä±¸ »çÇ× (¼³Ä¡ ¹× µ¿ÀÛ Á¶°Ç)
    master A ¼­¹ö¿¡ rsync ¿Í Á¾¼Ó ÆÐŰÁöµéÀÌ ÇÊ¿äÇϸç, yum À¸·Î ¼³Ä¡ ÁøÇàÇÏ¿´½À´Ï´Ù.
    - kernel 2.6.13 ÀÌ»ó
    - rsync libxml2 libxml2-devel
    - lsync lua lua-devel pkgconfig gcc asciidoc

  2. ±Û ³»¿ë°ú ½ÇÁ¦ ½©»ó¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ¸í·É¾îÀÇ Â÷ÀÌÁ¡À» µÎ±â À§ÇÏ¿© ¸®´ª½º ½© »ó¿¡¼­ »ç¿ëÇÏ´Â ¸í·ÉÀº $ ±âÈ£¸¦ ¾Õ¿¡ µÎ¾î Ç¥½Ã ÇÏ¿´½À´Ï´Ù.

  3. ¸í·É¾î¸¦ ±×´ë·Î º¹»çÇÏ¿© »ç¿ëÇÏ¸é ±âÈ£  ' " ' ` µî Àû¿ëÀÌ µÇÁö ¾Ê´Â ºÎºÐÀÌ ÀÖÀ» ¼ö ÀÖÀ¸¸ç, ¸í·É¾î º¹»ç ÈÄ¿¡ ±âÈ£¸¦ ¼öÁ¤ ÇÏ½Ã°í »ç¿ëÇÏ¸é µË´Ï´Ù.




1. Ä¿³Î ¹öÀü È®ÀÎ


Ä¿³ÎÀº 3.10.0À¸·Î 2.6.13 ¹öÀüÀÇ »óÀ§ ¹öÀüÀ¸·Î È®ÀÎ µÇ¾úÀ¸¹Ç·Î, ÇÊ¿ä ÆÐŰÁöµéÀ» ¼³Ä¡ ÇÕ´Ï´Ù. inotify ¼³Á¤ ¶ÇÇÑ È®ÀÎÀ» ÇÕ´Ï´Ù. uname -r Àº ¼­¹öÀÇ kernel À» È®ÀÎÇÏ´Â ¸í·É¾î À̸ç, inotify ¼³Á¤ È®Àνà [ µû¿ÈÇ¥ Apostrophe(') ]°¡ ¾Æ´Ñ [ ¹°°áÇ¥½Ã ¾Æ·¡ µû¿ÈÇ¥ Grave (`) ] ÀÔ´Ï´Ù.


$ uname -r

3.10.0-514.el7.x86_64


$ cat /boot/config-`uname -r` | grep -i inotify

CONFIG_INOTIFY_USER=y




2. ¼³Ä¡ °úÁ¤

@ ¼³Ä¡

rsync ¿Í libxml2 ´Â ±âº»ÀûÀ¸·Î ¼³Ä¡°¡ µÇ¾î ÀÖÀ¸¸ç, µÎ ÆÐŰÁöÀÇ ¼³Ä¡ ÁøÇàÀ» ÇÏ¸é ¾÷µ¥ÀÌÆ® ȤÀº latest version(ÃֽйöÀü)À̶ó´Â ÇØ´ç ¸Þ½ÃÁö¸¦ º¼ ¼ö ÀÖ½À´Ï´Ù.
libxml2-devel ÆÐŰÁö´Â ¼³Ä¡°¡ ¾ÈµÇ¾î ÀÖÀ¸¹Ç·Î ¼³Ä¡ ÁøÇàÀ» ÇÕ´Ï´Ù.

µ¿±âÈ­ ÆÄÀÏÀ̳ª µð·ºÅ丮°¡ ÀÖ´Â master A ¼­¹ö, Slave B C ¿¡ ¼³Ä¡¸¦ ÁøÇà ÇÏ¸é µË´Ï´Ù.


$ yum install libxml2 libxml2-devel rsync


..

..

Package libxml2-2.9.1-6.el7_2.3.x86_64 already installed and latest version

..

..

..


Dependencies Resolved


================================================================== Package        Arch        Version        Repository        Size

==================================================================

Installing:

libxml2-devel        x86_64    2.9.1-6.el7_2.3    base        1.0 M

Installing for dependencies:

xz-devel        x86_64    5.2.2-1.el7        base        45 k

zlib-devel        x86_64    1.2.7-17.el7        base        49 k


Transaction Summary

==================================================================

Install  1 Package (+2 Dependent packages)


Total download size: 1.1 M

Installed size: 9.1 M

Is this ok [y/d/N]: y


..

...

Installed:

 libxml2-devel.x86_64 0:2.9.1-6.el7_2.3                                                                                                                                                                      


Complete!


@ ¼³Ä¡_2

±âº» ÀúÀå¼Ò¿¡¼­´Â lsyncd ÆÐŰÁö¸¦ »ç¿ë ÇÒ ¼ö ¾øÀ¸¹Ç·Î, epel repo¸¦ Ãß°¡ ÇÏ¿© Ȱ¼ºÈ­ Çϵµ·Ï ÇÕ´Ï´Ù. ±Û¾´ÀÌ´Â dl.fedoraproject.org ÀÇ URL¿¡¼­ ÃֽŠrepo¸¦ Ãß°¡ ÇÏ¿´½À´Ï´Ù.

Ãß°¡°¡ ¿Ï·á µÇ¸é yum À» ÀÌ¿ëÇÏ¿© Á¾¼Ó ÆÐŰÁö¿Í lsyncd ÆÐŰÁö¸¦ ¼³Ä¡ ÇÕ´Ï´Ù.

Complete! ¸Þ½ÃÁö°¡ ¸¶Áö¸·¿¡ Ãâ·ÂÀÌ µÇ¸é Á¤»óÀûÀ¸·Î ¼³Ä¡°¡ µÈ °Í ÀÔ´Ï´Ù.

master A ¼­¹ö¿¡ ¼³Ä¡¸¦ Çϸç, ¼³Á¤ ¶ÇÇÑ master A ¼­¹ö¿¡¼­ ÁøÇàÀ» ÇÕ´Ï´Ù.


rpmÀÇ URL °æ·Î´Â ¹Ù²ð ¼ö ÀÖÀ¸¸ç, À¥ºê¶ó¿ìÀú¿¡ ¼öµ¿À¸·Î URL ÁÖ¼Ò¸¦ ÀÔ·ÂÇÏ¿© °æ·Î¸¦ È®ÀÎÇϵµ·Ï ÇÕ´Ï´Ù.


$ rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm



# Á¾¼Ó ÆÐŰÁö

$ yum install lua lua-devel pkgconfig gcc asciidoc

.. ...

.. ...


Installed:

 asciidoc.noarch 0:8.6.8-5.el7                                                                         lua-devel.x86_64 0:5.1.4-15.el7                                                                      


Dependency Installed:

 boost-regex.x86_64 0:1.53.0-27.el7    docbook-dtds.noarch 0:1.0-60.el7 docbook-style-xsl.noarch 0:1.78.1-3.el7 graphviz.x86_64 0:2.30.1-19.el7 libXaw.x86_64 0:1.0.13-4.el7 sgml-common.noarch 0:0.6.3-39.el7

 source-highlight.x86_64 0:3.1.6-6.el7


Updated:

 gcc.x86_64 0:4.8.5-16.el7_4.1                                                                                                                                                                               


Dependency Updated:

 cpp.x86_64 0:4.8.5-16.el7_4.1       gcc-c++.x86_64 0:4.8.5-16.el7_4.1       gcc-gfortran.x86_64 0:4.8.5-16.el7_4.1        libgcc.x86_64 0:4.8.5-16.el7_4.1      libgfortran.x86_64 0:4.8.5-16.el7_4.1    

 libgomp.x86_64 0:4.8.5-16.el7_4.1   libquadmath.x86_64 0:4.8.5-16.el7_4.1   libquadmath-devel.x86_64 0:4.8.5-16.el7_4.1   libstdc++.x86_64 0:4.8.5-16.el7_4.1 libstdc++-devel.x86_64 0:4.8.5-16.el7_4.1  


Complete!


$ yum install lsyncd

.. ...

.. ...


Installed:

 lsyncd.x86_64 0:2.2.2-1.el7                                                                                                                                                                                 


Complete!




@ ¼³Ä¡ È®ÀÎ


$ rpm -qa | grep "rsync\|libxml2\|libxml2-*"

libxml2-2.9.1-6.el7_2.3.x86_64

libxml2-devel-2.9.1-6.el7_2.3.x86_64

rsync-3.0.9-18.el7.x86_64


$ rpm -qa | grep "lua\|lua-devel\|pkgconfig\|gcc\|asciidoc\|lsyncd"

lua-devel-5.1.4-15.el7.x86_64

libgcc-4.8.5-16.el7_4.1.x86_64

asciidoc-8.6.8-5.el7.noarch

gcc-4.8.5-16.el7_4.1.x86_64

gcc-gfortran-4.8.5-16.el7_4.1.x86_64

pkgconfig-0.27.1-4.el7.x86_64

lua-5.1.4-15.el7.x86_64

gcc-c++-4.8.5-16.el7_4.1.x86_64

lsyncd-2.2.2-1.el7.x86_64



@ lsync »ç¿ë Çü½Ä

lsyncd [OPTION]... [SOURCE] [TARGET 1] [TARGET 2] ...

[SOURCE] => µ¿±âÈ­½Ã ¿øº»ÀÌ Á¸ÀçÇÏ´Â À§Ä¡ /home/test/

[TARGET X] => µ¿±âÈ­°¡ ÇÊ¿äÇÑ ¼­¹ö 192.168.0.3::HOME/test

[OPTION]

--binary FILE        rsync ½ÇÇà ÆÄÀÏ À§Ä¡

--conf FILE         ½ÇÇà½Ã ·ÎµåÇÒ ¼³Á¤ ÆÄÀϸí (DEFAULT: /etc/lsyncd.conf.xml)

--debug         µð¹ö±×¸¦ À§ÇÑ ·Î±×

--exclude-from FILE     µ¿±âÈ­½Ã Á¦¿Ü½Ãų ÆÐÅÏÀÇ ¿É¼Ç

--logfile FILE         ·Î±× ÆÄÀÏÀ§Ä¡

--no-daemon         Æ÷±×¶ó¿îµå·Î ½ÇÇà ½ÃÅ´

--pidfile FILE         pid ÆÄÀÏ »ý¼ºÀ§Ä¡




@ ssh keygen ÀÛ¾÷


¸¶½ºÅÍ¿Í ½½·¹ÀÌºê ¼­¹ö °£ÀÇ Å° ±â¹Ý ÀÎÁõÀ» »ç¿ëÇϱâ À§ÇÏ¿©, ¸¶½ºÅÍ ¼­¹ö¿¡ ·Î±×ÀÎ Çϰí, ssh-keygenÀ» »ç¿ëÇÏ¿© °ø°³ Ű¿Í °³ÀΠ۸¦ »ý¼º ÇÕ´Ï´Ù.

»ý¼º ÀÛ¾÷ÀÌ ¿Ï·á µÇ¾ú´Ù¸é, ssh-copy-id ¸í·ÉÀ» »ç¿ëÇÏ¿© °ø°³ ۸¦ ½½·¹ÀÌºê ¼­¹ö·Î º¹»ç ÇÕ´Ï´Ù.


# keygen »ý¼º

$ ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

0a:5d:c6:37:ec:2c:4b:ab:36:0a:5d:15:5f:e0:0c:97 root@localhost.localdomain

The key's randomart image is:

+--[ RSA 2048]----+

|        o oo.    |

|       . OE.     |

|        = B      |

|     . + + .     |

|    . o S o  |

|   . o o +       |

|  . . . o        |

|   . o.         |

|    .o..         |

+-----------------+


# º¹Á¦

$ ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.128

/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

root@192.168.0.128's password:


Number of key(s) added: 1


Now try logging into the machine, with:   "ssh 'root@192.168.0.128'"

and check to make sure that only the key(s) you wanted were added.


@ È®ÀÎ

keygen ±îÁö º¹»ç°¡ ¿Ï·á°¡ µÇ¾ú´Ù¸é, slave ¼­¹ö¿¡¼­ È®ÀÎÀ» Çϵµ·Ï ÇÕ´Ï´Ù.

º¸¾ÈÀ» À§ÇÏ¿© Áß°£¿¡ °ªµéÀº »ý·«ÇÏ¿© Ãâ·ÂÇÏ¿´½À´Ï´Ù.


slave B

$ cat /root/.ssh/authorized_keys

ssh-rsa AAAA¡¦ .. ...bbbBB root@localhost.localdomain


  • (*) A ¡æ B ¼­¹ö·Î keygen »ý¼º º¹»ç¸¦ ÇÏ°Ô µÇ¸é A ¼­¹ö¿¡¼­ ÆÐ½º¿öµå ÇÊ¿ä ¾øÀÌ shell »ó¿¡¼­ ssh Á¢±ÙÀÌ °¡´ÉÇÑ Á¡ Âü°í ÇϽðí, keygen ¿¡ ´ëÇØ¼­ °¢ÀÚ ÇнÀ Çϵµ·Ï ÇսôÙ.
    $ ssh root@192.168.0.128



@ lsyncdÀÇ ±¸¼º ÆÄÀÏ ¼³Á¤

¼³Ä¡ ÀÛ¾÷À» ¿Ï·á ÇÏ¿´´Ù¸é Ç×»ó ½À°üÀûÀ¸·Î È®ÀÎÀ» Çϵµ·Ï ÇսôÙ.

È®ÀαîÁö ¸¶Ä£ ÈÄ ±¸¼º ÆÄÀÏÀ» ¼³Á¤ ÇϰڽÀ´Ï´Ù.


»ùÇà ÆÄÀÏÀ» /etc/lsyncd.conf À¸·Î º¹»ç¸¦ ÇÕ´Ï´Ù. ¼³Á¤ ÆÄÀÏÀÌ »ý¼ºµÇ¾î ÀÖ´Ù¸é, ¹é¾÷ ÈÄ º¹»ç¸¦ ÁøÇà ÇÏ¸é µË´Ï´Ù.

º¹»ç¸¦ ¸¶Ä£ ÈÄ ±¸¼º ÆÄÀÏÀ» ´ÙÀ½°ú °°°Ô ¼³Á¤ ÇÕ´Ï´Ù.

  • slave C ¿¡´Â delete ¿É¼ÇÀ» ÁÖ¾î master ¼­¹ö¿¡¼­ µð·ºÅ丮³ª ÆÄÀÏ »èÁ¦½Ã slave C ¼­¹ö¿¡µµ ÇÔ²² »èÁ¦°¡ µÇµµ·Ï ¼³Á¤ ÇÏ¿´½À´Ï´Ù.

  • slave C ¿¡´Â archive ¿É¼ÇÀ» ÁÖ¾î permission °ú ¼ÒÀ¯±Ç ¶ÇÇÑ µ¿ÀÏÇÏ°Ô º¹»ç°¡ µÇµµ·Ï ¼³Á¤ ÇÏ¿´½À´Ï´Ù.

  • slave C ¿¡´Â exclude ¿É¼ÇÀ» ÁÖ¾î test01 µð·ºÅ丮¿Í work_2018 À̶ó´Â ÆÄÀÏÀ» Á¦¿ÜÇÏ°í µ¿±âÈ­ Çϵµ·Ï ¼³Á¤ ÇÏ¿´½À´Ï´Ù.



1) »ùÇà ÆÄÀÏ º¹»ç

$ cp /usr/share/doc/lsyncd-2.2.2/examples/lrsync.lua /etc/lsyncd.conf


$ cat /etc/lsyncd.conf ## ¼öÁ¤ Àü

----

-- User configuration file for lsyncd.

--

-- Simple example for default rsync.

--

settings {

       statusFile = "/tmp/lsyncd.stat",

       statusInterval = 1,

}


sync{

       default.rsync,

       source="src",

       target="trg",

}






# ¼³Á¤À» À§ÇØ ¼öÁ¤À» ÇÕ´Ï´Ù.

$ vi /etc/lsyncd.conf

----

-- User configuration file for lsyncd.

--

-- Simple example for default rsync.

--

settings {

       logfile = "/var/log/lsyncd.log",

       statusFile = "/var/log/lsyncd.stat",

       statusInterval = 2,

}


sync{

       default.rsync,

       source="/home/",

       target="192.168.0.128:/root/home2/",

       rsync={rsh ="/usr/bin/ssh -l root -i /root/.ssh/id_rsa",}

}


sync{

       default.rsync,

       source="/home/",

       delete=true,

       target="192.168.0.133:/root/home3/",

       exclude={'/test01','work_2018'},

       rsync={rsh ="/usr/bin/ssh -l root -i /root/.ssh/id_rsa",archive=true,}


}




log ÆÄÀÏÀº /var/log/lsyncd.log ÆÄÀÏ À̸ç, lsync ¼­ºñ½ºÀÇ »óÅ ȮÀÎÀº /var/log/lsyncd.stat ¿¡¼­ ÇÒ ¼ö ÀÖ½À´Ï´Ù.


@ ¼­ºñ½º ½ÃÀÛ

¼³Á¤ÀÌ ¿Ï·á µÇ¾ú´Ù¸é, ½Ã½ºÅÛÀÌ ÀçºÎÆÃ(reboot)ÀÌ µÉ ¶§ »ç¿ëÇϵµ·Ï ¼³Á¤À» ÇÏ°í ¼­ºñ½º¸¦ ½ÃÀÛ ÇÕ´Ï´Ù.


$ systemctl start lsyncd

$ systemctl enable lsyncd



@ È®ÀÎ

±Û¾´ÀÌ´Â master ¼­¹öÀÇ /home/ ÀÌÇÏ µð·ºÅ丮¸¦ slave B ¼­¹ö¿¡´Â /root/home2/ ÀÇ °æ·Î·Î µ¿±âÈ­¸¦ ÁøÇà ÇÏ¿´À¸¸ç, slave C ¼­¹ö¿¡´Â /root/home3/ °æ·Î¿¡ µ¿±âÈ­¸¦ ÁøÇà ÇÏ¿´½À´Ï´Ù.


$ systemctl status lsyncd.service

¡Ü lsyncd.service - Live Syncing (Mirror) Daemon

  Loaded: loaded (/usr/lib/systemd/system/lsyncd.service; enabled; vendor preset: disabled)

  Active: active (running) since È­ 2017-12-25 19:20:19 KST; 5s ago

Main PID: 6119 (lsyncd)

  CGroup: /system.slice/lsyncd.service

          ¦¦¦¡6119 /usr/bin/lsyncd -nodaemon /etc/lsyncd.conf


12¿ù 25 19:20:19 localhost.localdomain systemd[1]: Started Live Syncing (Mirror) Daemon.

12¿ù 25 19:20:19 localhost.localdomain systemd[1]: Starting Live Syncing (Mirror) Daemon...



@ Error

¾Æ·¡ÀÇ ¼³Á¤Ã³·³ slave B ¼­¹öÀÇ /root/ µð·ºÅ丮 ¹Ø¿¡ home2 µð·ºÅ丮°¡ »ý¼ºµÇ¾îÀÖÁö ¾Ê¾Æµµ ÀÚµ¿À¸·Î »ý¼ºÀÌ µÇ°Ô µË´Ï´Ù.


$ cat /etc/lsyncd.conf

.. ...

       source="/home/",

       target="192.168.0.128:/root/home2/",

.. ¡¦



ÇÏÁö¸¸ slave B ¼­¹öÀÇ »ý¼ºµÇÁö ¾ÊÀº home3 µð·ºÅ丮ÀÇ test01 °æ·Î·Î ÁöÁ¤ÀÌ µÇ¸é Á¤»óÀûÀ¸·Î µ¿±âÈ­°¡ µÇÁö ¾Ê½À´Ï´Ù. µû¶ó¼­ slave B ¼­¹ö¿¡ mkdir ¸í·É¾î »ç¿ëÇÏ¿© ÇØ´ç °æ·Î¸¦ ¸¸µé¾î Áà¾ß ÇÕ´Ï´Ù.


$ cat /etc/lsyncd.conf

.. ...

       source="/home/",

       target="192.168.0.128:/root/home3/test01",

.. ¡¦


## error message

$ systemctl status lsyncd

¡Ü lsyncd.service - Live Syncing (Mirror) Daemon

  Loaded: loaded (/usr/lib/systemd/system/lsyncd.service; enabled; vendor preset: disabled)

  Active: active (running) since È­ 2017-12-25 17:50:21 KST; 7min ago

.. ...


.. ...

12¿ù 25 17:57:11 localhost.localdomain lsyncd[28239]: rsync: connection unexpectedly closed (9 bytes received so far) [sender]

12¿ù 25 17:57:11 localhost.localdomain lsyncd[28239]: rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]

4¿ù 03 17:57:26 localhost.localdomain lsyncd[28239]: rsync: mkdir "/root/home3/test01" failed: No such file or directory (2)

.. ...


slave B

$ mkdir /root/home3/



@ ·Î±× È®ÀÎ

¸¶Áö¸·À¸·Î master ¼­¹ö¿¡¼­ slave ¼­¹ö·Î Á¤»óÀûÀÎ µ¿±âÈ­°¡ ÁøÇàµÇ´ÂÁö ·Î±×¸¦ º¸µµ·Ï ÇϰڽÀ´Ï´Ù. ¾Æ·¡¿¡´Â master ¼­¹ö 1´ë¸¦ slave 2´ë ¼­¹ö¿¡ lsync ¼­ºñ½º¸¦ Àû¿ëÇÑ ¿¹ ÀÔ´Ï´Ù.

µ¿±âÈ­ µÇ´Â µð·ºÅ丮 ¹× ÆÄÀÏÀ» È®ÀÎ ÇÒ ¼ö ÀÖ½À´Ï´Ù.



$ cat /var/log/lsyncd.log

.. ...

Wed Apr  4 09:50:28 2018 Normal: --- Startup ---

Wed Apr  4 09:50:28 2018 Normal: recursive startup rsync: /home/ -> 192.168.0.128:/root/home3/

Wed Apr  4 09:50:28 2018 Normal: recursive startup rsync: /home/ -> 192.168.0.133:/root/home3/

Wed Apr  4 09:50:29 2018 Normal: Startup of /home/ -> 192.168.0.133:/root/home3/ finished.

Wed Apr  4 09:50:29 2018 Normal: Startup of /home/ -> 192.168.0.128:/root/home3/ finished.

.. ...


$ tail -f /var/log/lsyncd.status

.. ...

Lsyncd status report at Wed Apr 25 10:00:00 2017


Sync1 source=/home/

There are 0 delays

.. ¡¦

.. ...

Sync2 source=/home/

There are 0 delays

Excluding:

 nothing.



Inotify watching 98 directories

 1: /home/

 2: /home/test01/

 3: /home/test01/´Ù¿î·Îµå/

 4: /home/test01/¹®¼­/

 5: /home/test01/.cache/

 6: /home/test01/.cache/abrt/

.. ...



@ slave ¼­¹ö È®ÀÎ

slave ¼­¹ö µÎ´ë¿¡ Á¢¼ÓÇÏ¿© Á¤»óÀûÀ¸·Î ÆÄÀÏÀÌ µ¿±âÈ­ µÇ¾ú´ÂÁöµµ È®ÀÎÇØ ÁÖµµ·Ï ÇÕ´Ï´Ù.

±Û¾´ÀÌ´Â À§¿¡¼­ slave ¼­¹öÀÇ /root/home3/ ·Î °æ·Î ÁöÁ¤À» ÇÏ¿´±â ¶§¹®¿¡ ¾Æ·¡¿Í °°ÀÌ È®ÀÎÀ» ÇÏ¿´½À´Ï´Ù. ¸¶½ºÅÍ ¼­¹öÀÇ µ¿±âÈ­ µð·ºÅ丮¿ÍÀÇ ¿ë·®ÀÌ ÀÏÄ¡ÇÏ´ÂÁöÀÇ ¿©ºÎµµ È®ÀÎ ¹æ¹ý Áß ÇѰ¡Áö ¹æ¹ýÀ̶ó°í ÇÒ ¼ö ÀÖ½À´Ï´Ù.


slave B

$ ls /root/home3/


$ du -sch /root/home3/



@ Trouble_1

¿î¿µÇÏ´Ù º¸¸é µð·ºÅ丮°¡ ÆÈõ°³ ÀÌ»ó ³Ñ´Â °æ¿ì µ¿±âÈ­°¡ Á¤»óÀûÀ¸·Î ÀÛµ¿ µÇÁö ¾Ê´Â °æ¿ì°¡ ÀÖ½À´Ï´Ù. inotify ±âº»ÀûÀÎ ¼³Á¤ °ª È®ÀÎ ÈÄ ¼öÁ¤À» Çϵµ·Ï ÇÕ´Ï´Ù.


$ cat /proc/sys/fs/inotify/max_user_watches

8192


$ vi /etc/sysctl.conf

.. ¡¦

fs.inotify.max_user_watches = 16000


$ sysctl -p

.. ¡¦

fs.inotify.max_user_watches = 16000


$ cat /proc/sys/fs/inotify/max_user_watches

16000




@ Trouble_2

¹æÈ­º® ¹®Á¦·Î ½Ç½Ã°£ µ¿±âÈ­°¡ ¾ÈµÇ´Â °æ¿ì°¡ ÀÖ½À´Ï´Ù. ÀÌ´Â 873 Æ÷Æ®ÀÇ ¹®Á¦°¡ ¾Æ´Ñ sshd port ÀÇ ¿ÀÇÂÀÌ ¾ÈµÇ¾î »ý±â´Â Àå¾Ö ÀÔ´Ï´Ù. ¾Æ·¡¿Í °°ÀÌ ½½·¹ÀÌºê ¼­¹öÀÇ sshd Æ÷Æ®°¡ ±âº» Æ÷Æ®°¡ ¾Æ´Ï¸ç, ƯÁ¤ IP¸¸ Çã¿ë ÇÏ¿´À» ½Ã master A ¼­¹ö¿¡¼­µµ Á¢±Ù ÇÒ ¼ö ÀÖµµ·Ï ¼³Á¤À» ÇÏ¿© ÇØ°á Çϵµ·Ï ÇÕ´Ï´Ù. Ãß°¡ÀûÀ¸·Î master A ¼­¹öÀÇ /etc/lsyncd.conf ÆÄÀϵµ ¼öÁ¤À» Çϵµ·Ï ÇÕ´Ï´Ù.


slave

$ cat /etc/ssh/sshd_config | grep -i port

Port 8281


$ vi /etc/sysconfig/iptables

.. ¡¦

-A INPUT -s 192.168.0.106 -m state --state NEW -m tcp -p tcp --dport 8281 -j ACCEPT

.. ...


$ systemctl restart iptables

$ systemctl status iptables

$ iptables -nL
.. ...

ACCEPT     tcp  -- 192.168.0.106        0.0.0.0/0            state NEW tcp dpt:8281

.. ...

master

$ cat /etc/lsyncd.conf

.. ¡¦

sync{

       default.rsync,

       source="/home/",

       target="192.168.0.128:/root/home2/",

       rsync={rsh ="/usr/bin/ssh -p 8281 -o StrictHostKeyChecking=no",}

}

.. ..

$ systemctl restart lsyncd

$ systemctl status lsyncd






À̰ÍÀ¸·Î lsyncd ¼³Ä¡ ¹× ¿î¿µ ³¡¸ÎÀ½À» Çϵµ·Ï ÇϰڽÀ´Ï´Ù.






## Âü°í URL
http://axkibe.github.io/lsyncd/manual/config/layer4/





## Âü°í »çÇ× - rsync - ##

¾Æ·¡ÀÇ Âü°í »çÇ× À̸ç, ³»¿ëÀº ÀÐÁö ¾Ê°í ³Ñ¾î°¡µµ lsync »ç¿ë¿¡´Â ÁöÀåÀÌ ¾ø½À´Ï´Ù.

lsync ÀÇ »ç¿ë ¹æ¹ýÀ» À§ÇÑ ¼³Ä¡ ¹æ¹ýÀº Å©°Ô ¾î·ÆÁö ¾Ê½À´Ï´Ù.

ÇÏÁö¸¸ lsync ¸¦ »ç¿ëÇϱâ À§Çؼ­´Â rsync ÀÇ ÀÌÇØ°¡ ÇÊ¿äÇϸç,

ÀÌ´Â º¸¾È»ó Áß¿äÇÑ ºÎºÐÀ̱⠶§¹®¿¡ ¾Æ·¡ ºÎºÐÀº ÀÐ°í ³Ñ¾î °¡µµ·Ï ÇսôÙ.



$ cat /etc/rsyncd.conf

[ROOT]

       path = /

       uid = root

       gid = root

       use chroot = yes

       read only = no

       hosts allow = 192.168.0.128

#    hosts.allow = 192.168.0.126 ## À߸øµÈ ¼³Á¤



Issue_1) read only = no


path ¼³Á¤µÈ µð·ºÅ丮 ÀÌÇÏ¿¡ ÀÖ´Â ¸ðµç ÆÄÀÏÀÌ º¯Á¶ µÉ ¼ö ÀÖÀ¸´Ï ÁÖÀǸ¦ ¿ä±¸ ÇÕ´Ï´Ù.


$ cat /etc/rsyncd.conf

.. ...

read only = no

.. ...

  • A ¼­¹ö¿¡ À§¿Í °°Àº ¼³Á¤À» ÇÏ¿´´Ù¸é Á¢±Ù Çã¿ëµÈ IP¿¡¼­ ¸ðµç ÆÄÀÏÀ» ¹Ð¾î ³ÖÀ» ¼ö ÀÖ½À´Ï´Ù.

  • A ¼­¹öÀÇ ÃÖ»óÀ§ µð·ºÅ丮 "/" ¹Ø¿¡ ÀÖ´Â /etc/passwd, /etc/shadow, /etc/group ÆÄÀÏÀ» B ¼­¹öÀÇ Àӽ÷Π¸¸µç /etc/passwd_2 /etc/shadow_2 ÆÄÀÏ·Î º¯Á¶ ÇÒ ¼ö ÀÖ½À´Ï´Ù.

    * ¾Æ·¡ ¸í·É¾î·Î È®ÀÎÇØ º¾½Ã´Ù.

1) Master A ¼­¹ö

## Å×½ºÆ® ÀÌÈÄ ¿øº¹À» À§ÇÏ¿© MasterA ¼­¹öÀÇ passwd ÆÄÀÏÀ» ¹é¾÷ Çϵµ·Ï ÇÕ´Ï´Ù.

$ cp -rp /etc/passwd /etc/passwd_backup


2) Slave B ¼­¹ö

## B ¼­¹ö¿¡¼­ passwd2¶ó´Â ÆÄÀÏÀ» ¸¸µé¾î ÆÄÀÏ ³»¿ëÀ» "test sulinux" ·Î º¯°æÀ» ÇÕ´Ï´Ù.

$ touch passwd2

$ echo "test sulinux" > passwd2


## B -> A ¼­¹ö·Î º¯Á¶ÆÄÀÏÀ» ¹Ð¾î ³Ö¾î º¸µµ·Ï ÇÕ´Ï´Ù.

$ rsync -av ./passwd2 [A¼­¹öÀÇ ip]::ROOT/etc/passwd


3) A ¼­¹ö

## º¯Á¶ ÆÄÀÏÀ» ¹Ð¾î ³ÖÀº ÈÄ È®ÀÎ

$ cat /etc/passwd

test sulinux


4) A ¼­¹ö

## º¯Á¶È®ÀÎÀÌ µÇ¾ú´Ù¸é ¿øº¹À» ÇÕ´Ï´Ù.

$ cp -rp /etc/passwd_backup /etc/passwd



Issue_2) À§¿Í °°Àº ¿¹Á¦´Â Çã¿ëµÈ IP¿¡¼­ ¸ðµç ÆÄÀÏÀ» ¹Ð¾î ³Ö°Å³ª(Upload), ³»·Á ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù.(Download) ÇÏÁö¸¸ ¾Æ·¡¿Í °°Àº À߸øµÈ ¼³Á¤À¸·Î ƯÁ¤ IP¿¡¼­¸¸ Á¢±ÙÀÌ °¡´É Çϵµ·Ï ¼³Á¤À» ÇÏ¿´´Ù°í Âø°¢À» Çϰí ÀÛ¾÷À» Á¾·á ÇÏ¿´´Ù¸é, º¹±¸ ¹æ¹ý¿¡ ¸¹Àº ½Ã°£°ú, ±ÝÀüÀÌ ¼Ò¿ä µÉ ¼ö ÀÖÀ¸´Ï ÁÖÀÇ Çϵµ·Ï ÇսôÙ.


$ cat /etc/rsyncd.conf

[ROOT]

path = /

.. ...

read only = no

.. ...

hosts.allow = 192.168.0.128


1) read only = no

- À§¿Í °°Àº ¼³Á¤À¸·Î ƯÁ¤ IP¿¡ ´ëÇØ¼­ Á¢±ÙÀÌ °¡´ÉÇÕ´Ï´Ù.


2) hosts.allow = yes

- À߸øµÈ ¼³Á¤ÀÔ´Ï´Ù. "hosts.allow" ¶ó´Â Parameter´Â Á¸Àç ÇÏÁö ¾Ê½À´Ï´Ù.

  ±×·¯¹Ç·Î ÇØ´ç ¼³Á¤Àº Àû¿ëÀÌ µÇÁö ¾ÊÀ¸¸ç, ¸ðµç IP¿¡¼­ Á¢±ÙÀÌ °¡´ÉÇÕ´Ï´Ù.


3) ½Ç½À ¹æ¹ýÀº °£´ÜÇÕ´Ï´Ù.

 ÀÚ½ÅÀÇ IP°¡ 192.168.0.126 À̶ó°í °¡Á¤À» Çϰí "hosts.allow = 192.168.0.128" À¸·Î ¼³Á¤À» ÇÑ´Ù¸é, 192.168.0.126 Àº Çã¿ëÀÌ µÇ¾î ÀÖÁö ¾ÊÀº IPÀ̱⠶§¹®¿¡ rsync µ¥¸óÀÇ µÇÁö ¾Ê¾Æ¾ß ÇÕ´Ï´Ù.

 ±×·¯³ª À߸øµÈ ¼³Á¤À¸·Î Á¢±ÙÀÌ °¡´É Çϸç, ¸ðµç IP ¶ÇÇÑ Á¢±ÙÀÌ °¡´É ÇÕ´Ï´Ù.   


4-1) ÇØ°á ¹æ¹ý

/etc/rsyncd.conf ÆÄÀÏÀÇ ¼³Á¤¿¡ ¹®Á¦°¡ ÀÖ´Ù¸é /var/log/messages log¿¡ ¾Æ·¡¿Í °°ÀÌ ±â·ÏÀÌ µÈ´Ù. ¾Æ·¡ ¸Þ½ÃÁö¿Í °°ÀÌ ¼³Á¤ ÆÄÀÏÀÇ ÆÄ¶ó¸ÞŸ¿¡ À߸øµÈ ¼³Á¤ÀÌ ÀÖÀ¸¸é ¸ðµç ¼­¹ö¿¡¼­ ÆÄÀÏÀ» °¡Á® ¿Ã ¼ö ÀÖÀ¸´Ï ÁÖÀÇ Çϵµ·Ï ÇսôÙ.


À߸øµÈ ¼³Á¤ ºÎºÐÀÌ ¾ø´ÂÁö È®ÀÎ ÇÏ·Á¸é rsync µ¥¸óÀ» »ç¿ë ÈÄ Ç×»ó messages ·Î±×¸¦ º¸´Â ½À°üÀ» ±â¸£µµ·Ï ÇÕ´Ï´Ù.


 ¾Æ·¡ÀÇ ¸Þ½ÃÁöÀÇ Àǹ̴ hosts allow = [Á¢±Ù Çã¿ë IP]ÀÇ ¼³Á¤¿¡ Á¡( . ) µé¾î°¡ ¼³Á¤ °ª¿¡ ¸ÂÁö ¾Ê´Â parameter·Î ·Î±×¿¡ ±â·Ï µÇ¾ú½À´Ï´Ù.


$ tail -f /var/log/messages | grep -i para*


Mar 31 19:23:06 localhost rsyncd[8300]: Unknown Parameter encountered: "hosts.allow"

Mar 31 19:23:06 localhost rsyncd[8300]: IGNORING unknown parameter "hosts.allow"


À§ÀÇ ·Î±×°¡ ±â·Ï µÇ±â À§Çؼ­´Â ¾Æ·¡¿Í °°Àº Á¶°Ç µîÀÌ ÇÊ¿ä ÇÕ´Ï´Ù.

  • A ¼­¹öÀÇ rsync daemon process °¡ ÀÛµ¿Çϰí ÀÖÀ» ¶§

  • B ¼­¹ö¿¡¼­ A ¼­¹ö·Î rsync ÀÛ¾÷À» ÁøÇàÇÒ ¶§

  • rsync ¼­ºñ½º¸¦ ¿Ã¸®°Å³ª Àç ½ÃÀÛ ÇÒ ¶§




4-2) ÇØ°á ¹æ¹ý 2


µÎ¹øÂ° ÇØ°á ¹æ¹ýÀ¸·Î ¸®´ª½º¿¡¼­ ÁÖ·Î »ç¿ëµÇ´Â iptables ¹æÈ­º®À» ÀÌ¿ëÇÏ¿© rsyncdÀ» ƯÁ¤ IP¸¸ »ç¿ë ÇÒ ¼ö ÀÖµµ·Ï Çã¿ëÇØÁÖ´Â ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù.


rsyncd µ¥¸óÀÇ port ´Â 873 Æ÷Æ®ÀÔ´Ï´Ù.


## sulinux 17 Version

$ netstat -nlpt | grep 873

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp6       0      0 :::873                  :::*                    LISTEN      5470/rsync        



## sulinux 2014 Version

$ netstat -nlpt | grep 873

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   

tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      1298/xinetd       


¸®´ª½º »ç¿ëÀÚ¶ó¸é iptables ±âº»ÀûÀÎ ·ê¼Â Àû¿ëÀº ÇÒ ¼ö ÀÖ´Ù°í ÆÇ´ÜÇϸç, ¹æÈ­º® ¼³Á¤ ¼³¸íÀº »ý·« Çϱâ·Î ÇÕ´Ï´Ù.


## ¼³Á¤ °ª

-A INPUT -s 192.168.0.128 -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT


## È®ÀÎ*


$ iptables -nL | grep 873

ACCEPT     tcp  -- 192.168.0.128        0.0.0.0/0           state NEW tcp dpt:873


4-3) ÇØ°á ¹æ¹ý 3

¼¼¹øÂ° ÇØ°á ¹æ¹ýÀ¸·Î´Â TCP_wrapper ¸¦ »ç¿ëÇÑ ¼³Á¤ ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù.

TCP_wrapper ¼³¸í ¶ÇÇÑ ÀÚ¼¼ÇÏ°Ô ¼³¸íÀ» ÇÏ°Ô µÇ¸é ³»¿ëÀÌ ±æ¾îÁö¹Ç·Î »ý·«Çϸç,

¾Æ·¡¿¡´Â ÀÛ¼ºÀÚÀÇ ¼³Á¤ ºÎºÐÀ̸ç, Âü°í¸¸ Çϱ⠹ٶø´Ï´Ù.

(*) ¼³Á¤ ÇÏ°Ô µÈ´Ù¸é ¹Ýµå½Ã Á¢¼Ó È®ÀÎÀÌ ÇÊ¿äÇÕ´Ï´Ù.


## rsync ¼­ºñ½º¸¦ ƯÁ¤ IP¿¡¼­¸¸ Çã¿ë ÇÒ ¼ö ÀÖµµ·Ï ¸ðµÎ Â÷´Ü ÇÕ´Ï´Ù.


$ cat /etc/hosts.deny

rsync : ALL



## rsync ¼­ºñ½º Á¢±ÙÀ» Çã¿ë ÇÒ IP¸¦ Àû¿ë.

TCP-wrapperÀÇ Àû¿ë ÀÌÈÄ Á¢¼Ó Å×½ºÆ® ¹× ¼­ºñ½º È®ÀÎÀÌ ¹Ýµå½Ã ÇÊ¿ä ÇÕ´Ï´Ù.


$ cat /etc/hosts.allow

rsync : 196.128.0.128

rsync : 196.128.0.126


(*) /etc/hosts.deny -> /etc/hosts.allow ¼øÀ¸·Î deny ÆÄÀÏÀÇ Àû¿ëÀÌ ¿ì¼± ¼øÀ§¿¡ ÀÖÀ¸¸ç,

/etc/hosts.deny ÀÇ ³»¿ëÀÌ " ALL : ALL " À̶ó¸é rsync ¼­ºñ½º ÀÌ¿ÜÀÇ ¸ðµç ¼­ºñ½º°¡ Â÷´ÜÀÌ µÇ´Ï ¼³Á¤À» À§Çؼ­´Â ÇнÀÀÌ ¼±Çà µÇ¾î¾ß ÇÕ´Ï´Ù.

(*) hosts.allow ´Â TCP-wrapperÀ» »ç¿ëÇϱâ À§ÇÑ ¼³Á¤ ÆÄÀÏ À̸§ÀÔ´Ï´Ù.

(***) Áß¿ä /etc/rsyncd.conf ÆÄÀÏÀÇ ¼³Á¤ parameter°ú Çò°¥¸®Áö ¾Êµµ·Ï ÁÖÀǸ¦ Çϵµ·Ï ÇÕ´Ï´Ù.


5) ¹æÈ­º®À» ±¸ÀÔÇѴٰųª, ±âŸ ´Ù¸¥ ¹æ¹ýÀ¸·Îµµ ¾ó¸¶µçÁö ¼³Á¤ÀÌ °¡´ÉÇÕ´Ï´Ù.

À­ ºÎºÐ¿¡¼­ ¾ð±Þ ÇÑ °Íó·³ ²À rsync ¼­ºñ½º¸¦ »ç¿ëÇÑ µÚ¿¡´Â /var/log/messages ¿¡ ±â·ÏµÈ ·Î±×¸¦ º¸´Â °ÍÀ» ½À°üÈ­ ÇսôÙ.




[¿ø±Û¸µÅ©] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1885


ÀÌ ±ÛÀ» Æ®À§ÅÍ·Î º¸³»±â ÀÌ ±ÛÀ» ÆäÀ̽ººÏÀ¸·Î º¸³»±â ÀÌ ±ÛÀ» ¹ÌÅõµ¥ÀÌ·Î º¸³»±â

 
À±»óÁø
À̸§ : À±»óÁø
E-Mail : sjyun°ñ»±ÀÌlinux.co.kr
¼Ò¼Ó : (ÁÖ)¿¡½ºÀ¯¸®´ª½º