Search Results for '프로그래밍/리눅스 & MY-SQL'


167 posts related to '프로그래밍/리눅스 & MY-SQL'

  1. 2017/12/01 Mysql .frm 과 .idb파일만 남았을때 테이블 구조 및 데이터 복구
  2. 2017/05/21 How to Install PHP 7 on Ubuntu 15.10, 15.04 & 14.04 using PPA
  3. 2017/05/21 How to Install PHP 5.4 or PHP 5.5 or PHP 5.6 on Ubuntu 16.04, 14.04 or…
  4. 2017/05/21 Ubuntu 16.04 : Nginx, PHP 7, MySQL 5.7 설치
  5. 2017/04/18 [DBMS] mysql 접속자 많아서 버벅일때 팁입니다.
  6. 2017/04/18 [DBMS] 그누보드 databas 튜닝
  7. 2017/03/18 Nginx에서 모든 요청을 https non-www로 돌리는 방법
  8. 2017/03/10 리눅스 우분투 계정생성 및 폴더 상위 접근 제한 하기
  9. 2017/03/03 XPEnology(헤놀로지) DSM 6.0 설치하는법
  10. 2017/02/28 MYSQL SELECT 위력을 보여드리죠.
  11. 2017/02/27 우분투 계정 관리
  12. 2012/11/01 Secure CRT 유니코드 한글 설정
  13. 2012/08/06 SQL에서의 기본적인 Join문 설명
  14. 2012/02/07 파일생성 권한 초기화 시키기
  15. 2012/02/07 특정 파일(ex: mp3,avi,mpg)만 찾아서 자동으로 삭제하기!
  16. 2012/02/07 리눅스에서 쓰레드 최대 생성 갯수 확인
  17. 2012/02/07 리눅스 하위 디렉토리의 문자열 검색
  18. 2012/02/07 SSH 포트22번 불량 접속 시도 IP 자동 막기 1
  19. 2011/12/25 우분투 IP변경하기
  20. 2011/12/06 원격서버의 Virtualbox 의 웹관리툴 Phpvirtualbox 관련 삽질
  21. 2011/10/16 우분투에서 웹서버 환경 구축하기 (LAMP or APM)
  22. 2011/10/16 유용한 리눅스(LINUX) 명령어
  23. 2011/10/11 svmon 명령어
  24. 2011/09/25 MySQL 쓰면서 하지 말아야 할 것 17가지
  25. 2011/09/13 Apache(아파치)를 사용해 redirect(리다이렉트) 하는 방법 7가지
  26. 2011/09/11 MySQL 로그 파일 관리
  27. 2011/09/07 [쉘 스크립트] 특정 디렉토리의 파일들 중 html, inc, php 파일들만 찾아서 파일 인코딩 변경 처리 쉘 스크립트
  28. 2011/09/07 Linux DD 명령 Win32용
  29. 2011/09/07 PHP OpenSSH2 (libssh2) 설치 및 사용법
  30. 2011/09/05 네임서버 zone 파일 인쿠르드

미리 mysql의 데이터를 백업시켜놓지 않고 db가 터져서 접속이 불가능한 상태이기 때문에 .frm파일과 .idb파일만 남아서 이것을 이용해서 복구해야 했기에

재가 썻던 방법을 남깁니다.

 

 

.frm에는 테이블 스키마가 남겨져 있는데

 

shell>mysqlfrm --diagnostic <복구하고 싶은 frm이 담겨있는 mysql database의 경로> 

여기서 shell이란 linux terminal과 windows powershell 다 포함됩니다.

 

또한 ibd는 

frm에서 나온 테이블을 추가해준 후에

 

1. alter table <table.name> discard tablespace

2. 복구하고 싶은 idb파일을 해당 db가 있는 폴더에 넣어준다.

3. alter table <table.name> import tablespace

4. .cfg오류는 무시해도 좋습니다.




2017/12/01 12:59 2017/12/01 12:59

Install PHP 7

Use the following set of commands to add PPA for PHP 7 in your Ubuntu system and install it.

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get update
$ sudo apt-get install -y php7.0

Check PHP Version

Now use the following command to check installed php version on your system.

$ 

PHP 7.0.1-4+deb.sury.org~trusty+1 (cli) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies

Install PHP 7 Modules

You may also need to install modules based on your application requirements. Use the following command to find our available php 7 modules.

$ php7.0-common - Common files for packages built from the PHP source
libapache2-mod-php7.0 - server-side, HTML-embedded scripting language (Apache 2 module)
php7.0-cgi - server-side, HTML-embedded scripting language (CGI binary)
php7.0-cli - command-line interpreter for the PHP scripting language
php7.0-phpdbg - server-side, HTML-embedded scripting language (PHPDBG binary)
php7.0-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
libphp7.0-embed - HTML-embedded scripting language (Embedded SAPI library)
php7.0-dev - Files for PHP7.0 module development
php7.0-dbg - Debug symbols for PHP7.0
php7.0-curl - CURL module for PHP
php7.0-gd - GD module for PHP
php7.0-imap - IMAP module for PHP
php7.0-intl - Internationalisation module for PHP
php7.0-ldap - LDAP module for PHP
php7.0-pgsql - PostgreSQL module for PHP
php7.0-pspell - pspell module for PHP
php7.0-recode - recode module for PHP
php7.0-snmp - SNMP module for PHP
php7.0-tidy - tidy module for PHP
php7.0-json - JSON module for PHP
php-all-dev - package depending on all supported PHP development packages
php7.0-sybase - Sybase module for PHP
php7.0-modules-source - PHP 7.0 modules source package
php7.0-sqlite3 - SQLite3 module for PHP
php7.0-mysql - MySQL module for PHP
php7.0-opcache - Zend OpCache module for PHP

Now install modules which is required for you.

$ sudo apt-get install php7.0-mysql php7.0-curl php7.0-json php7.0-cgi



2017/05/21 12:12 2017/05/21 12:12

Install PHP 5.4

Use the following set of command to add PPA for PHP 5.4 in your Ubuntu system and install PHP 5.4.

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:ondrej/php5-oldstable
$ sudo apt-get update
$ sudo apt-get install -y php5

Check Installed PHP Version:

# php -v

PHP 5.4.35-1+deb.sury.org~precise+1 (cli) (built: Nov 19 2014 19:34:07)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies

Install PHP 5.5

Use the following set of command to add PPA for PHP 5.5 in your Ubuntu system and install PHP 5.5.

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get update
$ sudo apt-get install -y php5.5

Check Installed PHP Version:

# php -v

PHP 5.5.19-1+deb.sury.org~precise+1 (cli) (built: Nov 19 2014 19:32:57)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

Install PHP 5.6

Use the following set of command to add PPA for PHP 5.6 in your Ubuntu system and install PHP 5.6.

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get update
$ sudo apt-get install -y php5.6

Check Installed PHP Version:

# php -v

PHP 5.6.3-1+deb.sury.org~precise+1 (cli) (built: Nov 19 2014 19:34:53)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies



2017/05/21 12:12 2017/05/21 12:12

Installing Nginx with PHP 7 and MySQL 5.7 (LEMP) on Ubuntu 16.04 LTS

Nginx(발음 “engine x”)는 무료이며 오픈소스이고 높은 성능의 HTTP 서버이다. Nginx는 매우 적은 자원을 사용하면서 안정적이고 풍부한 기능들을 가지고 있다. 또한 설정도 매우 간단하다. 본 지침서는 우분투 16.04 서버에서 PHP 7(PHP-FPM), MySQL 5.7을 지원하는 Nginx 설치를 설명하고 있다. LEMP = Linux + nginx(engine x) + MySQL + Linux

1. 준비 단계

이 지침서에 호스트 이름은 server1.example.com, 아이피 주소는 192.168.1.100을 사용한다. 이 설정은 사용자마다 다르므로 적절하게 수정 후 사용해야 한다. 이 지침서의 모든 단계는 루트 권한으로 진행하였다. 다음과 같이 루트(root)로 :

sudo -s

2. MySQL 5.7 설치

MySQL을 설치하기 위해서 다음과 같이 실행한다. [root@server1 ~]#은 터미널의 프롬프트이다. 타이핑하는 것은 아니다.

[root@server1 ~]# apt-get -y install mysql-server mysql-client

New password for the MySQL "root" user: <-- yourrootsqlpassword
Repeat password for the MySQL "root" user: <-- yourrootsqlpassword

데이터베이스의 보안을 위해 익명사용자와 테스트 데이터베이스를 제거하기 위해 다음을 실행한다.

[root@server1 ~]# mysql_secure_installation

위의 명령을 실행 후 다음의 몇 가지 질문에 답을 하자.

Enter password for user root: <-- Enter the MySQL root password
...
Press y|Y for Yes, any other key for No: <-- Press y if you want this function or press Enter otherwise.
...
Change the password for root ? ((Press y|Y for Yes, any other key for No) : <-- Press enter
...
Remove anonymous users? (Press y|Y for Yes, any other key for No) : <-- y
...
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : <-- y
...
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : <-- y
...
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : <-- y

3. Nginx 설치

Apache2가 이미 설치되어 있다면 Nginx를 설치하기 전에 Apache2를 제거한다.

[root@server1 ~]# service apache2 stop
[root@server1 ~]# update-rc.d -f apache2 remove
[root@server1 ~]# apt-get remove apache2

이제 Nginx를 설치한다.

[root@server1 ~]# apt-get -y install nginx
// 시작은 다음과 같이
[root@server1 ~]# service nginx start

제대로 설치되었는지 확인하기 위해 웹 브라우저에서 주소를 입력해 본다 (예, http://192.168.1.100). 기본 페이지가 보이면 설치 성공이다. 그리고 Nginx의 웹 문서의 기본 디렉터리는 /var/www/html 이다.

4. PHP 7 설치

PHP-FPM(FastCGI Process Manager)를 이용한다1. FastCGI 데몬 소켓은 /run/php/php7.0-fpm.sock 에서 확인할 수 있다.

[root@server1 ~]# apt-get -y install php7.0-fpm

5. Nginx 설정

vi(또는 nano)편집기를 이용하여 다음의 설정파일을 편집한다2.

[root@server1 ~]# vi /etc/nginx/nginx.conf
[root@server1 ~]# vi /etc/nginx/sites-available/default

예를들면 기본 디렉터리는 설정은 root /var/www/html;이다. 그리고 php 연동을 위해 다음과 같이:

[root@server1 ~]# vi /etc/php/7.0/fpm/php.ini
// 다음과 같이 설정한다.
cgi.fix_pathinfo=0:
[root@server1 ~]# service nginx reload
[root@server1 ~]# service php7.0-fpm reload

이제 /var/www/html/에 info.php 파일을 하나 만들고 웹에서 확인 : <?php phpinfo(); ?>

6. PHP에서 MySQL 지원 및 기타 주요기능 설치

[root@server1 ~]# apt-get -y install php7.0-mysql php7.0-curl php7.0-gd php7.0-intl php-pear php-imagick php7.0-imap php7.0-mcrypt php-memcache  php7.0-pspell php7.0-recode php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl php7.0-mbstring php-gettext

[root@server1 ~]# service php7.0-fpm reload

7. 기타 설정 (옵션)

TCP Connection

[root@server1 ~]# vi /etc/php/7.0/fpm/pool.d/www.conf
...
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000
...
[root@server1 ~]# php7.0-fpm reload
[root@server1 ~]# vi /etc/nginx/sites-available/default
...
fastcgi_pass 127.0.0.1:9000;
...
[root@server1 ~]# service nginx reload
  1. PHP-FPM의 자세한 내용은 https://php-fpm.org/를 참고하자. ↩︎
  2. 설정파일 예제, https://www.nginx.com/resources/wiki/start/topics/examples/full/ ↩︎



2017/05/21 12:11 2017/05/21 12:11
다들 아시겟지만 이전에 디비접속 실패할때 쓰던 꼼수입니다. 
// 디비 접속 
@$sql = mysqli_connect($db_host,$db_user,$db_pw,$db_name); 
// 에러 발생시 2초 후에 페이지 릴로드 
if(mysqli_connect_errno()){echo"<script>re=setTimeout(\"location.reload()\",2000);</script>";exit;} 
접속 실패시 2초후에 페이지 릴로드되도록 하는 팁입니다. 
필요하신분들 유용하시길



2017/04/18 16:19 2017/04/18 16:19
그누보드의 경우 몇개의 큰 테이블의 성능 때문에 고통을 받고 있는데 
이런 부분이 테이블 파티셔닝을 통해서 간단하게 해결 가능하구요 
테이블 파티셔닝은 MySQL 5.7 이상의 버젼에서 사용할 것을 추천 드립니다. 
- 년도를 기준으로 파티셔닝 (point 갯수가 많은 경우는 월별/일별로 파티셔닝) 
- 개인정보 보호를 위한 정보의 최대 보유기간인 5년을 경과하는 것은 table drop 
1. g4_visit 테이블의 record 갯수와 가장 오래된 vi_date를 확인 
있는 날짜부터 파티셔닝을 하면 되니까... 
2. table structure를 확인 
primary key를 확인. 그누보드 기본은 vi_id 입니다. 
3. vi_date를 primary key에 추가 
파티셔닝의 기준이 되는 날짜가 primary key에 들어 있어야 합니다. 
ALTER TABLE `g4_visit` DROP PRIMARY KEY , 
ADD PRIMARY KEY ( `vi_id` , `vi_date` ) 
4. SQL script를 작성 
ALTER TABLE g4_visit 
PARTITION BY RANGE ( TO_DAYS(vi_date) ) ( 
PARTITION vi2007 VALUES LESS THAN (TO_DAYS('2008-01-01')), 
PARTITION vi2008 VALUES LESS THAN (TO_DAYS('2009-01-01')), 
PARTITION vi2009 VALUES LESS THAN (TO_DAYS('2010-01-01')), 
PARTITION vi2010 VALUES LESS THAN (TO_DAYS('2011-01-01')), 
PARTITION vi2011 VALUES LESS THAN (TO_DAYS('2012-01-01')), 
PARTITION vi2012 VALUES LESS THAN (TO_DAYS('2013-01-01')), 
PARTITION vi2013 VALUES LESS THAN (TO_DAYS('2014-01-01')), 
PARTITION vi2014 VALUES LESS THAN (TO_DAYS('2015-01-01')), 
PARTITION vi2015 VALUES LESS THAN (TO_DAYS('2016-01-01')), 
PARTITION vi2016 VALUES LESS THAN (TO_DAYS('2017-01-01')), 
PARTITION vi2017 VALUES LESS THAN (TO_DAYS('2018-01-01')), 
PARTITION vi2018 VALUES LESS THAN (TO_DAYS('2019-01-01')), 
PARTITION vi2019 VALUES LESS THAN (TO_DAYS('2020-01-01')), 
PARTITION vi2020 VALUES LESS THAN (TO_DAYS('2021-01-01')), 
PARTITION vi2021 VALUES LESS THAN (TO_DAYS('2022-01-01')), 
PARTITION vi2022 VALUES LESS THAN (TO_DAYS('2023-01-01')), 
PARTITION vi2023 VALUES LESS THAN (TO_DAYS('2024-01-01')), 
PARTITION vi2024 VALUES LESS THAN (TO_DAYS('2025-01-01')), 
PARTITION vi2025 VALUES LESS THAN (TO_DAYS('2026-01-01')), 
PARTITION vi2026 VALUES LESS THAN (TO_DAYS('2027-01-01')), 
PARTITION vi2027 VALUES LESS THAN (TO_DAYS('2028-01-01')), 
PARTITION vi2028 VALUES LESS THAN (TO_DAYS('2029-01-01')), 
PARTITION vi2029 VALUES LESS THAN (TO_DAYS('2030-01-01')), 
PARTITION vi2030 VALUES LESS THAN (TO_DAYS('2031-01-01')), 
PARTITION vimax VALUES LESS THAN MAXVALUE 
); 
*** 주의사항 *** 
g4_visit의 경우는 primary key의 생성을 할 때 
DB의 접속을 멈추지 않으면 
중복 key가 발생해서 primary key의 생성이 안됩니다. 
g4_point 테이블과 달리 
반드시 DB를 멈춘상태에서 작업을 해야 합니다. 
튜닝의 효과는 서프라이즈이며 
g4_point, g4_board_new 등의 테이블도 튜닝하면 좋습니다.



2017/04/18 16:16 2017/04/18 16:16
사용자 삽입 이미지

1. HTTPS + non-www

 

server {

    listen 80;

    server_name wsgvet.com www.wsgvet.com;

    location / {

        rewrite       ^/(.*)$ https://wsgvet.com/$1 permanent;

    }

}

 

server {

listen 443 ssl http2;

server_name wsgvet.com www.wsgvet.com;

...

if ($host != 'wsgvet.com' ) {

        rewrite          ^/(.*)$  https://wsgvet.com/$1 permanent;

    }

...

}

 

2. HTTPS + www

 

server {

    listen 80;

    server_name www.wsgvet.com wsgvet.com;

    location / {

        rewrite       ^/(.*)$ https://www.wsgvet.com/$1 permanent;

    }

}    

 

server {

listen 443 ssl http2;

server_name www.wsgvet.com wsgvet.com;

...

if ($host != 'www.wsgvet.com' ) {

        rewrite          ^/(.*)$  https://www.wsgvet.com/$1 permanent;

    }

...

}

 

 

3. 결론

 

성능에는 별 차이없는 것 같습니다만, 예전에는 두번 거쳐서 넘어가는 느낌이라면 

 

지금은 단 한번의 리라이트로 넘어가기 때문에 더 나은 것 같습니다.




2017/03/18 13:23 2017/03/18 13:23
후배가 우분투 설정 해달라고 해서 설정해주고. 돌아왔는데.  

후배 친구에게 계정을 생성해  주었다고 한다. 그 친구가 상위 폴더까지 모두 접근해서.

DB  정보등을 확인해서 SSH 로 접근해 ROOT 권한으로 로그인까지 성공 했다고 한다. 그래서 . 전화 상으로  설명하기 힘들듯 하여 내용을 정리 한다.

1.
우분투 설치후 계정 생성 간단하다 

adduser 생성하고자하는아이디

위내용을 입력하면 즉시 사용할 암호를 물어보고 암호를 입력하면 엔터만 치고 마지막 y 하면 계정 생성이 끝난다.

이렇게 하면 사용자는 생성된 아이디 비밀번호로 로그인을 할수 있다. 하지만 상위 폴더 접근이 가능하다 이를 해결하기 위해서  여러가지 방법이 있지만 간단한 방법 권한 설정으로 처리 하는 방법을 설명한다.

2.
최상위 퍼미션 조정 
chmod 711 /
chmod 711 /home
chmod 711 /etc

이렇게 하면 상위 폴더 접근을 막을수 있다 하지만. 문제는 생성된 아이디로 sftp 접속후 파일을 수정 하려고 하면 수정이 안된다 . 

생성된 계정 폴더 소유권자가 아마 root 로 되어 있기 때문이다. 위에서 생성된 계정으로 소유권을 바꾸면 된다.

예) 생성된 계정 이름이 youngsam 이라고 하자

chown -R youngsam:youngsam /home/youngsam/www

명령어가 될것이다 . 마지막 www 부분이 빠질수도 있다. 이후 ls-al 명령어로 소유권이 변경된 것을 확인 할수 있다.


2017/03/10 14:17 2017/03/10 14:17

XPEnology 포럼에서 JUN이라는 유저분이 시놀로지 나스 운영체제인 DSM 커널을 동적으로 패치하는 리눅스 커널 모듈을 개발했다고 합니다.

 

.. 외장하드에 나스 자료를 급하게 백업하고 XPEnology DSM 6.0.2 설치해봤습니다덕분에 BLOG파일을 날려먹었네요

 

설치하고 몇일동안 만지작 거려보니 XPEnology DSM 5.2보다 빠르고 안정적이네요.

 

XPEnology DSM 6.0.2 준비물

 

XPEnology DSM 6.0.2 준비물

 

서버1(블로그 자료실)

 

DS3615xs 6.0.2 Jun's Mod(부트로더) : 다운로드

 

DSM 소프트웨어(운영체제) : 다운로드

 

Win32DiskImager(프로그램) : 다운로드

 

USB View(프로그램) : 다운로드

 

Osfmount(프로그램) : 32비트  64비트

 

 

서버2(구글 드라이브)

 

DS3615xs 6.0.2 Jun's Mod(부트로더) : 다운로드

 

DSM 소프트웨어(운영체제) : 다운로드

 

Win32DiskImager(프로그램) : 다운로드

 

USB View(프로그램) : 다운로드

 

Osfmount(프로그램) : 다운로드

 

 



 

 

XPEnology DSM 6.0 설치하는법

 

 

<사진에 있는 이름과 다운받은 부트로더 이름이 다를수있습니다>

 

1. Win32DiskImager 프로그램을 실행후 부트로더 이미지 경로선택과 USB 디바이스를 선택후 Write(=쓰기)버튼을 클릭해주세요.

 

 

2. 경고버튼이 뜨면 Yes(=)버튼을 클릭해주세요.

 

 

3. 부트로더 이미지파일을 USB 기록중이니 잠시 기다려주세요.

 

 

4. 정상적으로 기록이 끝나면 OK(=알겠음)버튼을 클릭해주세요.

 

[BONUS] 만약, 부트로더 USB 만들고나서 인식이 안되는 경우에는 ofsmount프로그램을 이용해 마운팅 작업해주세요.

 

 

이전 XPEnology(헤놀로지) 설치 방법과 다르게 부트로더 파일을 수정해서 속이는 과정을 거쳐야합니다.

 

5. USB VIEW 프로그램을 실행후 부트로더 이미지를 기록한 USB 선택해주세요.

 

6. idVendor idProduct 메모장에 기록해주세요.

 

 

 

7. /grub 경로에 있는 grub.cfg파일을 메모장이나 에디터플러스 열어주세요.

 

8. set vid=0x058f 부분을 아까 기록해둔 idVendor 값을 교체해주세요.

 

9. set pid=0x6387 부분을 아까 기록해둔 idProudct 값으로 교체해주세요.

 

10. SataPortMap=1 부분을 연결된 하드디스크 개수만큼 수정해주시고 저장해주세요.

 

samsung|SM-G925K|1/30sec|F/1.9|ISO-500

< 바이오스/UEFI 마다 다르게 나올수있습니다 >

 

11. 바이오스/UEFI 설정 들어가신후 부팅 옵션 1순위를 부트로더 USB 선택해주세요.

 

samsung|SM-G925K|1/10sec|F/1.9|ISO-250

< 부트로더 버젼에 따라서 다르게 나올수있습니다>

 

11. 정상적으로 부트로더 USB 부팅이 되면 사진처럼 나타납니다.

 

 

12. 브라우저에 아래 주소를 입력해주신후 자작나스로 자동연결되면 설정버튼을 눌러주세요.

 

주소 : http://find.synology.me 혹은 http://diskstation:5000

 

 

 

 

   

13. 다운받으신 DSM 소프트웨어(운영체제) 경로선택후 지금설치 버튼을 클릭해주세요.

 

 

14. " 하드 디스크의 모든 데이타가 제거된다는 사실을 이해합니다. " 체크후 확인버튼을 클릭해주세요.

 

 

15. 소프트웨어(운영체제) 설치가 끝나면 자동으로 설정창이 연결되니 창을 끄지말아주세요.

 

 

16. 서버이름과 사용자이름, 패스워드 확인을 기입해주신후 다음 버튼을 클릭해주세요.

 

 

17. 다음 버튼을 클릭해주세요.

 

 

18. ' 수동으로 DSM 업데이트 다운로드 설치 ' 선택후 다음버튼을 클릭해주세요.

 

 

19. 퀵커넥트 서비스(기능) 정품 시놀로지 사용자만 이용가능하므로 ' 단계 건너뛰기' 클릭해 넘겨주세요.

 

 

20. ' 단계를 건너뛰면 인터넷을 통해 원격으로 Diskstation 액세스하기 위해 포트 전달을 설정해야 합니다.' 팝업창이 뜨면 예버튼을 클릭해서 넘겨주세요.

 

 

21. 한번 버튼을 클릭해주세요.

 

 

정상적으로 XPEnology DSM 6.0.2 설치가 끝났습니다.




2017/03/03 15:14 2017/03/03 15:14

오랜만에 데이터 베이스에 관련해여 포스트를 작성한다.
조금씩 공부하고 포스트를 올리는 것보다는 몇 단원정도 전체를 흝어본후 포스트를 쓰는게 더 나을 것 같아서 근간에 글을 올리지 않았다 ㅋ

SELECT

이번에는 Select에 대해 알아보자.

Select문은 원하는 자료를 찾아서 출력해주는 명령어이다.
사용법은 단순하다.

SELECT [Field(column)] FROM [table_name] WHERE [조건들.......]

위는 해당 테이블 내의 조건에 맞는 필드들을 출력해주는 것이다. 출력은 열에 맞추어 출력하고 조건은 행의 자료에 맞춰 출력이 된다.

보통 많이 쓰이는 예를 들어보자.


테이블은 미리 작성해둔 것이고, 명령어 select * from easy_drinks 에서 easy_drinks는 테이블 네임이고 "*" 은 모든 Field=column을 출력하겠다는 뜻이다.

위처럼 출력하면 지저분하고 원하는 자료를 검색하기가 쉽지 않다.
그래서 사용되는 것이 바로 WHERE절이다. 이 WHERE절은 DELETE절이나 UPDATE문등 다양하게 쓰이기 때문에 잘 알아둬야 한다. 솔직히 프로그래밍 언어에 익숙한 사람에게는 별 것 없고, 조건 절이라고 생각하면 된다. select절 에서는 어떤 조건으로 검색된 Record의 Field를 출력할 것인지를 판별한다.

그럼 위의 보기 지저분한 소스를 (확인하고자하는 조건)에 맞추어 SELECT를 해보자.


급하게 쓰느라 소문자로 써버렸다 -.-; 사실 소문자, 대문자는 단지 가독성을 위한것이다.

위 결과만 보면 일단 지저분한 상단보다 단순하게 나온 것을 알 수 있을 것이다. 
내가 테이블로부터 알고 싶은 것은 가게 이름과 요리들이다. 그리고 조건은 싸구려 요리들만 검색해 보았다.

SELECT drink_name,main,second FROM easy_drinks WHERE amount1<2.5 AND amount2<4.0;

처음의 밑줄친 곳은 보여질 Field의 이름이고 두번째 밑줄은 테이블 명이다.
내가 원하는 것은 가게 이름과 요리들이기 때문에 drink_name과 main, second를 설정하였다. 가로 없이 쉼표로만 표현 가능하다.
easy_drinks는 단순히 테이블 명이다.

WHERE 이하는 검색 조건으로서 record 내의 값을 분류하게 된다.
내가 설정한 조건은 메인 요리가 2.5달러보다 싸고 세컨요리가 4.0달라보다 싼요리다.

※ 참고할 것 : 문자열이나 문자를 my-sql에서는 '로 시작 종료를 하는데 그럼 문자열 내의 '는 어떻게 처리하는지가 문제가 된다. 그 점은 여타 언어와 같이 \'을 사용한다. 역슬래시 '를 사용하는 것이다. 그러면 단순 문자 '로 처리된다. 그렇지 않으면 '(작은따옴표)의 개수 오류로 에러처리가 되거나 다음 쉼표를 기다리는 대기 열만 계속해서 나올 것이다.

WHERE

아마 WHERE절 사용법은 딱 보면 감이 올 것이다.
조건이 하나일 경우에는 하나만 사용하면 되고 여러개일 경우에는 AND와 OR을 사용할 수 있다.

AND는 둘다 참일 경우 : (다른말로) 첫번째가 거짓이면 검사 종료 (라고 표현하기도 한다.)
OR은 둘중 하나만 만족할 경우 : (다른말로)  첫번째가 참이면 검사 종료 (라고 표현하기도 한다.)

비교연산자는 =, <>, <, > , <=, >= 가 존재한다.
여타 언어랑 유의깊게 봐야할 것은 =이 ==과 같이 쓰인다는 것이다. 비교연산자나 바인딩할때도 같이 사용된다. 또한 !=가아니라 <>가 사용된다. ( 둘다 같지 않다의 의미)

만약 찾으려고 하는 VALUES값이 NULL이면 어떻게 해야 할 것인가
생각하는 것처럼 amount1=NULL 또는 amount1=0 또는 amount1='NULL'을 하면 3게다 되지 않는다.
NULL이 C,C++처럼 0으로 처리되지 않기 때문에 안되고 NULL은 정의되지 않은 값으로 나온다.

이 경우에는 "IS NULL"을 사용한다. 


위를 보면 is null을 통해 age가 널처리된 값을 뽑아낼 수 있다. 

자료를 검색할때 단어내의 원하는 부분이 있는 단어를 원할 때가 있다. 즉 원하는 문자의 일부만으로 결과를 찾아내고 싶을때는 와일드카드 문자를 사용할 수 있다.

이때 사용되는 것은 "LIKE"이다.

LIKE다음에는 %와 _ 두개의 와일드 카드가 사용된다.

% : 다수의 불특정 문자를 의미
_  : 하나의 불특정 문자를 의미

은근히 유용하게 쓰인다. 한번 사용해 보자.


보는 바와 같이 원하는 결과를 얻어낼 수 있다.
LIKE가 등호 대신에 사용된다고 생각하면 이해하기 편할 것이다. '내용~~' 이로 이루어지듯이 문자나 문자열을 대상으로만 가능하다.

어떤 사이의 구간을 표시하기 위해서는 BETWEEN 'A' AND 'B' 가 쓰인다. 물론 A와 B는 정수이다.(문자도 되긴된다. 아스키 코드기준값으로...)
숙어 뜻대로 A와 B사이의 값을 골라준다.

사용예를 보자.


BETWEEN 20 AND 30은 20과 30사이의 값을 찾아달라는 것이다. age 다음에 between이 나왔으므로 등호연산자(=)처럼 사용되었다고 생각해도 된다. 이런명령어는 기본이 AND OR등으로 이루어져있는데 사용자 편의를 위해 등장한 것이다.

다음으로 알아볼 것은 IN이다. 이것은 여러 OR절들의 집합체라고 할 수 있다. 아니 OR의 집합들의 간소화라고 표하는게 더 어울릴 것이다.
사용 예를 보자.


이는 계속 사용해 왔던 shin444 테이블을 select한 것이다. 
WHERE age IN('26','28','12')를 말로 풀어서 쓰면 다음과 같다.

age 필드내에 26이거나 28이거나 12의 값이 있다면 선택하라.

이는 OR문으로 여러개를 선택해야할 때 IN을 통해 간단하게 표현된다. IN또한 등호처럼 생각하면 된다^^;


알아본 WHERE내에 특수한 경우는 LIKE와 BETWEEN, IN 3가지가 있었다.

마지막 한가지는 NOT이다. 이 NOT은 말그대로 부정을 의미하고 이를 이용하여 하나의 표현을 다른표현으로서 가능하게 한다. 이는 곧 쿼리문 간소화에도 영향을 끼친다. 
NOT의 위치는 WHERE 바로 뒤에 사용된다. 모든 기본위치는 NOT이 WHERE뒤에 있는것이고 가끔 예외가 있다. 특수한 예는 NOT IN과 IS NOT NULL 정도가 있다.
헷갈린다면 WHERE다음에 무조건 NOT을 사용하면 될 것이다.




2017/02/28 20:39 2017/02/28 20:39

우분투를 설치후 매번 admin으로 접속하기는 찜찜(?)하니 계정을 추가하여 접속을 해보도록 하자.

 

우분투에서는 계정을 생성하는 명령어가 두가지가 있다. 바로 adduser와 useradd이다. 

두 명령어 모두 계정을 추가하는 명령어지만 약간의 차이점이 있다. 

adduser의 경우 명령어 실행시 기본 계정정보를 같이 생성해주지만

useradd의 경우 계정만 생성하며 기타 다른 정보를 수동으로 생성 및 설정해주어야 한다. 

하나하나 실행하면서 살펴보도록 하자.

 

1. adduser [계정이름] - 계정 추가

- 계정생성시 비밀번호 까지 입력받으며 기본정보를 바로 입력 시켜줄수 있다. 홈 디렉토리 또한 자동으로 생성된다.

$   adduser mirUseradd
'miradduser' 사용자를 추가 중...
새 그룹 'miradduser' (1002) 추가 ...
새 사용자 'miradduser' (1002) 을(를) 그룹 'miradduser' (으)로 추가 ...
'/home/miradduser' 홈 디렉터리를 생성하는 중...
'/etc/skel'에서 파일들을 복사하는 중...
새 UNIX 암호 입력:
새 UNIX 암호 재입력:
passwd: password updated successfully
Changing the user information for miradduser
Enter the new value, or press ENTER for the default
    Full Name []: Mir
    Room Number []: 2000
    Work Phone []: 0101111111
    Home Phone []: 0102222222
    Other []: test
정보가 올바릅니까? [Y/n] y

이렇게 adduser로 계정을 생성시 우선 암호입력창이 뜨고 후에 부가적인 Commant 입력창이 생성된다.

 

2. useradd [계정이름] - 계정 추가

- 순수 계정만 생성해주고 기본 셀인 sh가 할당되며 홈 디렉토리와 패스워드는 따로 설정해줘야 한다.

$   useradd mirUseradd

useradd로 계정을 추가시 따로 결과 메세지나 입력메세지가 없다.

이제 이 두가지 계정을 한번 비교해보도록 하자

 

3. /etc/passwd - 계정 정보 파일

- 사용자 인증에 필요한 계정 정보를 가지고 있다. cat 명령어로 내용을 살펴보자.

$   cat /etc/passwd
[생략]...
mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh
miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash         

맨 아래줄에 보면 mirUseradd와 miradduser 계정이 추가된것이 보인다.

하나하나 자세히 분석해보자.

miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh

- 사용자 계정을 표시한다.

 

miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh

- 비밀번호를 표시한다. (모두 x로 표시되며 자세한 비밀번호는 아래에서 검색해보겠다.)

 

miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh

- 사용자 ID를 표시한다. (0 : 관리자, 1~499 : 시스템 계정, 500~ : 일반 계정)

 

miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh

- 그룹 ID를 표시한다.

 

miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000:(null):/home/mirUseradd:/bin/sh

- 계정정보(Comment)를 표시한다. 

 

miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh

- 홈 디렉토리를 표시한다.

 

miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh

- 로그인 쉘을 표시한다.

분명 위에서 useradd 명령은 홈 디렉토리를 따로 설정해줘야 된다고 말했지만 계정정보를 보면 홈디렉토리가 보인다.

하지만 실제로 홈 디렉토리를 가볼려고 하면 디렉토리가 없다고 표시된다.

$   cd /home/mirUseradd
-bash: cd: /home/mirUseradd: 그런 파일이나 디렉터리가 없습니다    

즉 설정된 홈디렉토리를 생성시켜주거나 다른 홈디렉토리를 생성하여 설정값을 바꿔줘야 한다.

 

4. /etc/shadow - 암호 정보 파일

- 사용자 인증에 필요한 암호 정보를 가지고 있다. cat 명령어로 내용을 살펴 보자.

$   cat /etc/shadow
[생략]...
miradduser:$6$..[생략]..vE.:16596:0:99999:7:::
mirUseradd:!:16595:0:99999:7:::

암호정보도 하나하나 분석해보자.

miradduser:$6$..[생략]..vE.:16596:0:99999:7:::

mirUseradd:!:16595:0:99999:7:::

- 사용자 계정을 표시한다.

 

miradduser:$6$..[생략]..vE.:16596:0:99999:7:::

mirUseradd:!:16595:0:99999:7:::

- 암호화 시킨 패스워드를 표시한다. (useradd명령어로 추가한 계정에는 패스워드가 없어서 !로 표시됨)

 

miradduser:$6$..[생략]..vE.:16596:0:99999:7:::

mirUseradd:!:16595:0:99999:7:::

- 1970년 1월 1일 기준으로 패스워드를 수정한 마지막 날짜를 계산하여 표시한다.

 

miradduser:$6$..[생략]..vE.:16596:0:99999:7:::

mirUseradd:!:16595:0:99999:7:::

- 패스워드를 변경하기위한 최소 사용일수를 표시한다.

 

miradduser:$6$..[생략]..vE.:16596:0:99999:7:::

mirUseradd:!:16595:0:99999:7:::

- 패스워드를 사용할수 있는 최대 사용일수를 표시한다.

 

miradduser:$6$..[생략]..vE.:16596:0:99999:7:::

mirUseradd:!:16595:0:99999:7:::

- 패스워드 만기일 전에 경고메세지를 몇일전 부터 알려줄지 표시한다.

 

miradduser:$6$..[생략]..vE.:16596:0:99999:7:(null)::

mirUseradd:!:16595:0:99999:7:(null)::

- 로그인 차단 일수를 표시한다. (현재는 아무런 정보가 없어서 임의로 null로 표시해주었다.)

 

miradduser:$6$..[생략]..vE.:16596:0:99999:7::(null):

mirUseradd:!:16595:0:99999:7::(null):

- 얼마간 로그인 차단을 시킬지 표시한다. (현재는 아무런 정보가 없어서 임의로 null로 표시해주었다.)

 

miradduser:$6$..[생략]..vE.:16596:0:99999:7:::(null)

mirUseradd:!:16595:0:99999:7:::(null)

- 현재는 사용되지 않는 정보이다.

 

 

5. usermod [옵션] [계정명]- 계정 수정

- 옵션과 계정명을 받아서 해당 계정을 옵션의 명령에 따라 처리 한다.

-c : [Comment] - 계정 Comment를 수정한다.

-d : [Home Diretory] - 계정 홈 디렉토리를 수정한다.

-e : [Expiredate] - 계정 만기 날짜를 수정한다. 

-L : [Lock User] - 사용자 계정을 잠근다.

-U : [Unlock] - 잠금처리되어 있는 계정을 풀어준다.

-h : [Help] - 명령어 옵션 설명을 표시해준다.

 

위 옵션이외의 많은 옵션이 있으며 -h를 이용하여 알아보는것도 좋다.

 

몇몇 명령어를 테스트 해볼겸 useradd로 생성시킨 계정에 Comment를 넣어보자.

$   usermod -c Comment_Test mirUseradd

확인은 /etc/passwd를 살펴보면 된다.

[생략]...
mirUseradd:x:1000:1000:Comment_Test:/home/mirUseradd:/bin/sh
miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

새로운 Comment가 추가된것을 확인할수 있다.

 

6. passwd [계정명] - 계정 암호 수정

- 계정 Password를 수정시 usermod -p를 사용하면 /etc/shadow를 직접 바꾸게 되기때문에 실제로 바꾼 Password로 로그인을 할수가 없다. 그래서 passwd 명령어를 사용하여 수정해주어야 한다.

$   passwd  mirUseradd
새 UNIX 암호 입력:
새 UNIX 암호 재입력:
passwd: password updated successfully

새 암호 입력후 확인을 위해 /etc/shadow를 살펴보자

[생략]...
mirUseradd:$6$Vx23FZI.$6pguZVI5T9oO7nVf7N7cURTqrPAvBj4nT.6LEuIY99fZJxvRabKNp3OuK4jc2TYeE/mE6nlKqy0e0ZXiMUhrs.:16596:0:99999:7:::
miradduser:$6$uqJt2OQg$ZZtpcfz7WMdvOx1gmDzlYEuM4l1vKNyF9.SdkqZwsNIw0z8kO50O8nNmB7fj.tOHmXbFdu9Ty0M1hv0brymZR0:16596:0:99999:7:::

위에서 살펴볼때는 아무 설정도 되어 있지 않았지만 현재는 암호화되어 Password가 들어가 있는것이 확인 된다.

 

7. deluser [계정명] - 계정 삭제

- 계정을 삭제하는 명령어이다. 

기본적으로 계정만 삭제되며 계정에 관련된 폴더, 파일을 삭제할려면 옵션을 주어야 한다.

$   deluser mirUseradd
$   deluser -remove-all-files miradduser

useradd로 추가한 계정은 어차피 계정 정보밖에 없으므로 옵션을 주지 않고 삭제하였고 

adduser로 추가한 계정은 홈디렉토리까지 삭제하기 위해 옵션을 주었다.

만약 옵션을 주지 않고 삭제한경우 홈디렉토리가 그대로 남아있는걸 확인할수 있다.

root@mirwebma001:~# ls /home
miradduser

 

 

 

리눅스 계정관리에 관한 기본적인 명령어를 살펴보았다.

다음번엔 리눅스 계정에 sudo 권한 부여에 대해 알아보겠다.

 

참고로 useradd로 계정을 생성할경우 다양한 옵션값으로 생성시 모든 정보를 입력할수도 있지만

특별한 경우가 아니면 adduser 명령어로 그냥 자동으로 생성되게 하는게 편한듯 하다.




2017/02/27 17:34 2017/02/27 17:34

Secure CRT로 솔라리스 10에 접속해서, 유니코드(UTF-8)로 된 한글을 보려면

1. 계정 환경파일

##### ANSI (KSC-5601)

#setenv LANG ko; /bin/stty cs8 -istrip defeucw

##### unicode (UTF-8)
setenv LANG ko.UTF-8; /bin/stty cs8 -istrip \defeucw

##### 영문 전용
#setenv LANG C; /bin/stty cs7 istrip defeucw

2. Secure CRT 옵션 설정 메뉴 중에

Session Option -> Emulation -> Advanced

또는

Session Option -> Appearance -> Fonts -> Character

부분을 'UTF-8'로 변경

* 아래 alias를 환경파일에 넣어두면, 조금 편하게 전환할 수 있다. (물론 Secure CRT 옵션도 바꿔야 한다.)

alias euckr "setenv LANG ko; /bin/stty cs8 -istrip defeucw"
alias utf8 "setenv LANG ko.UTF-8; /bin/stty cs8 -istrip \defeucw"
alias asc "setenv LANG C; /bin/stty cs7 istrip defeucw"

* 상기 Secure CRT 옵션은 세션(Session)별로 설정하는 것이다. 따라서, 유니코드용 세션을 하나 더 추가해서 창을 2개 열어 놓고 전환해 가면서 사용하면, 편하게 사용할 수 있다.

-------------------------------------------------------

Linux vi editor

:set enc=utf8
:set enc=cp949




2012/11/01 17:27 2012/11/01 17:27

샘플 테이블

test1)
 
+--------+------+
 
| a | b |
 
+--------+------+

| 금강 | 1 |
 
| 한강 | 2 |
 
| 대동강 | 3 |
 
| 두만강 | 4 |
 



test2)
 
+------+--------+
 
| b | d |
 
+------+--------+
 
| 1 | 백두산 |
 
| 2 | 금강산 |
 
| 5 | 지리산 |
 
| 6 | 한라산 |
 


1) INNER JOIN
 
Inner join를 이용하여 앞 예제와 동일한 결과를 얻을 수 있는 예는 다음과 같다.

이는 select 문에서 join에 사용할 컬럼명을 ON test1.b=test2.b와 같이 직접 지정해도 된다.
 
【예제】
 
mysql> select * from test1 inner join test2 using(b);
 
+------+------+------+--------+
 
| a | b | b | d |
 
+------+------+------+--------+
 
| 금강 | 1 | 1 | 백두산 |
 
| 한강 | 2 | 2 | 금강산 |
 
+------+------+------+--------+
 
2 rows in set (0.00 sec)
 


mysql> select * from test1 inner join test2 on test1.b=test2.b;
 
+------+------+------+--------+
 
| a | b | b | d |
 
+------+------+------+--------+
 
| 금강 | 1 | 1 | 백두산 |
 
| 한강 | 2 | 2 | 금강산 |
 
+------+------+------+--------+
 
2 rows in set (0.00 sec)
 


mysql> select * from test1, test2 where test1.b=test2.b;
 


mysql>
 


2) NATURAL JOIN
 
두 테이블에 같은 이름을 가진 컬럼이 있고, 이 컬럼을 기준으로 join을 하려면 natural join
 
을 사용한다.
 
【예제】
 
mysql> select * from test1 natural join test2;
 
+------+------+------+--------+
 
| a | b | b | d |
 
+------+------+------+--------+
 
| 금강 | 1 | 1 | 백두산 |
 
| 한강 | 2 | 2 | 금강산 |
 
+------+------+------+--------+
 
2 rows in set (0.00 sec)
 


mysql>
 


3) LEFT OUTER JOIN
 
test1에는 4개의 레코드가 있는데 where test1.b=test2.b라는 조건 때문에 두 개의 레코드 밖
 
에 선택되지 않았다. 이때 test2의 b에 test1의 b 값이 존재하지 않더라도 test1의 레코드를

모두 가져오려면 left outer join을 사용한다. left outer join에서 outer는 옵션이므로 생략해
 
도 된다.
 
【예제】
 
mysql> select * from test1 left join test2 using(b);
 
+--------+------+------+--------+
 
| a | b | b | d |
 
+--------+------+------+--------+
 
| 금강 | 1 | 1 | 백두산 |
 
| 한강 | 2 | 2 | 금강산 |
 
| 대동강 | 3 | NULL | NULL |
 
| 두만강 | 4 | NULL | NULL |
 
+--------+------+------+--------+
 
4 rows in set (0.00 sec)
 


mysql> select * from test1 left join test2 on test1.b=test2.b;
 
+--------+------+------+--------+
 
| a | b | b | d |
 
+--------+------+------+--------+
 
| 금강 | 1 | 1 | 백두산 |
 
| 한강 | 2 | 2 | 금강산 |
 
| 대동강 | 3 | NULL | NULL |
 
| 두만강 | 4 | NULL | NULL |
 
+--------+------+------+--------+
 
4 rows in set (0.01 sec)
 


mysql>
 


4) RIGHT OUTER JOIN
 
test2에는 4개의 레코드가 있는데, where test1.b=test2.b라는 조건 때문에 2개의 레코드 밖
 
에 선택되지 않는다. 이때 test1의 b에 test2의 b값이 존재하지 않더라도 test2의 레코드를

모두 가져오려면 right outer join을 사용한다. right outer join에서 outer는 옵션이므로 생략
 
할 수 있다.
 
【예제】
 
mysql> select * from test1 right join test2 on test1.b=test2.b;
 
+------+------+------+--------+
 
| a | b | b | d |
 
+------+------+------+--------+
 
| 금강 | 1 | 1 | 백두산 |
 
| 한강 | 2 | 2 | 금강산 |
 
| NULL | NULL | 5 | 지리산 |
 
| NULL | NULL | 6 | 한라산 |
 
+------+------+------+--------+
 
4 rows in set (0.00 sec)
 


mysql>




2012/08/06 21:34 2012/08/06 21:34
chmod 644 -R * (초기화)
chmod -R go+X * (디렉토리별 실행권한을 준다)
chmod -R 707 나머지 바꾸고 싶음 퍼미션 폴더



2012/02/07 09:50 2012/02/07 09:50
예제로 나온 스크립트는 mp3 라는 단어가 들어있는 파일을 지웁니다.

for LIST in `find / | grep mp3`
do
rm -f $LIST
echo $LIST
done

이런 예제의 문제점은 mp3.html 도 지울수가 있다는 것이겠죠
그렇다면 다음과 같이 바꿀수 있겠죠

for LIST in `find / -name *.mp3`
do
rm -f $LIST
echo $LIST
done

이렇게 바꿀수가 있답니다.

그러면 저걸 vi 를 열어서 작성한다음 저장하고 빠져나옵니다
(파일명은 자기맘^^)

그런후 excute 권한을 줘야죠.. 지금 이 작업을 하시는분은 당연히 root 이실테니..

# chmod 700 파일명

자기자신이외에 실행을 못시킵니다..

그러나 여기서 또 발견되는 문제점.. 의사를 확인하지않고 지우면 문제가될수있으니..
다음과 같이바꿀수 있죠(그러나, 귀찮은 단점이있습니다)

for LIST in `find / -name *.mp3`
do
rm $LIST
echo $LIST
done

그럼.. 계정관리하시는데 도움이 되길 바랍니다~~



2012/02/07 09:50 2012/02/07 09:50
cat /proc/sys/kernel/threads-max

명령을 할 경우 최대 생성 갯수가 나옴


2012/02/07 09:50 2012/02/07 09:50
find . | xargs grep '검색 하고 싶은 문자열'

명령 실행시 실행시키는 디렉토리의 하위 디렉토리의 문자열과

문자열이 들어있는 파일이 검색된다.


2012/02/07 09:49 2012/02/07 09:49

SSH를 돌리면 /var/log/secure 에 22번포트로 접속시도가 많이 보인다. 부적절하게 접속시도하는 IP 들을 자동으로 차단하는 스크립트를 만들어 보겠다.
 
과정은 /var/log/secure 에서 불량 ssh 접속 ip를 추려내서 /etc/hosts.deny 에 등록된다.
 
 # grep "Failed password for" /var/log/secure | egrep -v "invalid user" | egrep -v "{USERID}|{LOGINIP}" | awk '{ print $11}' | uniq | sed "s/^/all:/" > /root/ssh-login-ip
# grep "Failed password for invalid user" /var/log/secure.1 | awk '{ print $13}' | uniq | sed "s/^/all:/" >> /root/ssh-login-ip
 
 [위의 명령어 설명] USERID=관리자 ssh 접속계정 LOGINIP=관리자 ssh접속계정의 공인 ip : 직접 입력해야함.
 
-------------------------------------------------------------------------------------------------------------
 
grep "Failed password for" /var/log/secure: /var/log/secure 파일 내에서 "Failed password for" 문장이 들어간 행만 뽑아냄
 
egrep -v "invalid user" : 위 결과에서 "invalid user" , "USERID" , "LOGINIP" 가 들어간 부분은 제외
 
egrep -v "{USERID}|{LOGINIP}": 위 결과에서 관리상 필요에 의해 접속했던 계정, IP는 제외
 
awk '{print $11}' : 위 결과에서 각 행마다 11번째 문장을 뽑아냄 -> 비정상 IP
 
uniq : 중복된 문장을 하나씩만 출력
 
sed "s/^/all:/" > /root/ssh-login-ip: 각 행의 맨 앞에 "all:" 을 입력 후 /root/ssh-login-ip 파일에 저장

grep "Failed password for invalid user" /var/log/secure.1 : var/log/secure.1 파일에서 "Failed .... user" 문장이 들어간 행만 추출
 
awk '{print $13}' : 각 행마다 11번째 문장만 뽑아냄 -> 비정상 IP
 
>> /root/ssh-login-ip : 위의 /root/ssh-login-ip 파일에 뒤이어 내용을 첨가함

------------------------------------------------------------------------------------------------------------
 
# cat /root/ssh-login-ip /etc/hosts.deny | sort | uniq >> /root/hosts.deny : hosts.deny에 블럭킹할 ip 등록

▶crontab 등록
 
# crontab -e
 
------------------------------------------------------------------------------------------------------------------
 
05,15,25,35,45,55 * * * * grep "Failed password for" /var/log/secure | egrep -v "invalid user" | egrep -v "{USERID} | {LOGINIP}" | awk '{ print $11}' | uniq | sed "s/^/all:/" > /root/ssh-login-ip
 
06,16,26,36,46,56 * * * * cat /root/ssh-login-ip /etc/hosts.deny | sort | uniq > /root/hosts.deny
 
07,17,27,37,47,57 * * * * cp /root/hosts.deny /etc/hosts.deny
 
-------------------------------------------------------------------------------------------------------------------




2012/02/07 09:48 2012/02/07 09:48

우분투가 데비안 커널을 사용하는것인지 서버설정이며 기본명령어가 대부분 데비안과 비슷하다. ㅡ.,ㅡ;
이제껏 사용했던 빨간모자-레뎃(redhat)의 네트웍 설정은 아무런 도움이 되지 못했다.

초기 설치시 DHCP를 사용하게 되어있던 항목을 고정아이피로 바꿔주기 위해서 구글신을 빌었다.
설정은 아래와 같이 하면된다.

우선 서버콘솔박스 앞에서 작업한다면 (리모트로 작업한다면 ifdown하는 동시에 터미널접속이 끊어지므로 주의)

ifdown eth0

로 네트웍카드를 잠시 멈춘후 아래 내용을 etc/network/interfaces에 설정한다.

auto lo
iface lo inet
loopback

auto eth0
iface eth0 inet static
address 192.168.10.136
netmask 255.255.255.0
network 192.168.10.0
broadcast 192.168.10.255
gateway 192.168.10.1
dns-nameservers 168.126.63.1 168.126.63.2
위와 같이 설정후
ifup eth0
으로 네트웍을 설정한다.
리모트로 작업한다면 위의 ifdown이나 ifup을 사용하지 말고

sudo /etc/init.d/networking restart
으로 네트웍을 다시 시작하는것이 좋다.



2011/12/25 19:38 2011/12/25 19:38
###########################################################################
### 쓴건 : 원격서버의 Virtualbox 웹관리를 위한 Phpvirtualbox 설치
### 쓴이 : 권성재 (nonots@hanmail.net, http://www.badaweb.co.kr)
### 쓴때 : 2011-12-13
###########################################################################

### 환경
- CentOS 5.x 64비트
- 아파치 2.2, PHP 5.2
- X 윈도우(GUI) 없이 텍스트모드(TUI)로 서버 실행중


1) 서버 CPU 가 가상화기술을 지원하는지 확인. 지원 안한다면 포기.
# egrep '(vmx|svm)' /proc/cpuinfo


2) php 확장기능에 soap, json 이 포함되어 있는지 확인. 없다면 추가 설치.
php 버전도 5.1 이상이어야 한다.
# php -i | egrep -i '(soap|json)'


3) dkms 패키지 설치
아래 링크에서 다운받아 설치
- http://rpmfind.net/linux/rpm2html/search.php?query=dkms
- http://linux.dell.com/dkms/permalink/
# rpm -Uvh dkms-~~~.rpm


4) VirtualBox 4.1 및 확장팩 설치
-http://download.virtualbox.org/virtualbox/
글쓰는 현재 최신버전이 4.1.6 이다. 확장팩도 같이 다운받는다
# rpm -Uvh VirtualBox-4.1-4.1.6_74727_rhel5-1.x86_64.rpm

-확장팩 설치
# VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.1.6-74713.vbox-extpack

부가기능 설치 위한 VBoxGuestAdditions_4.1.6.iso 파일도
다운받아 놓는다.

- vbox 사용자 추가하고 비밀번호 정한다. 비번을 kawkf123 이라고 하자
# useradd -g vboxusers vbox
# passwd vbox
만약 홈디렉토리를 /home/vbox 가 아니라 용량큰 다른 곳에 마운트한
/data/vbox 와 같은 위치를 사용한다면 -d /data/vbox 와 같이 추가

- /etc/vbox/vbox.cfg 파일 생성
[root@home3 ~]# cat /etc/vbox/vbox.cfg
VBOXWEB_USER=vbox
VBOXWEB_HOST=222.231.xxx.xxx
VBOXWEB_PORT=18083
VBOXWEB_LOGFILE=/var/log/vbox.log

와 같이 하고 반드시 /var/log/vbox.log 를 만들어줌
# touch /var/log/vbox.log
# chmod 600 /var/log/vbox.log
# chown vbox.vboxusers /var/log/vbox.log
이렇게 안만들어주고 데몬시작하니 말도 없이 까칠하게 생깜.
VBOXWEB_HOST=222.231.xxx.xxx 이 부분을
VBOXWEB_HOST=0.0.0.0 으로 하기도 한담.
18083 포트가 막혀있으면 열어준다.


5) Phpvirtualbox 4.1 설치
- http://code.google.com/p/phpvirtualbox/
위 링크에서 phpvirtualbox-4.1-5.zip 다운받아서 웹루트 적당한 곳에
압축을 푼다.
만약 Virtualbox 4.0 이 설치되었다면 phpvirtualbox 도 4.0 버전대를 사용
해야 할꺼다.
config.php-sample 파일을 config.php 로 복사한 후 편집기로 열어서 상단에

var $username = 'vbox';
var $password = 'kawkf123';
var $location = 'http://222.231.xxx.xxx:18083/';`

여기 username,password 는 4)에서 생성한 리눅스 서버 vbox 계정정보다.

이 웹접속 위치가 http://www.mysite.com/phpvirtualbox/index.php 라고 하자

어떤데서는 아래 명령어 줘야한다고함. vbox 계정으로 전환한 뒤 해야하거나.
# VBoxManage setproperty websrvauthlibrary null


6) 접속방법

# /etc/init.d/vboxballoonctrl-service start
# /etc/init.d/vboxdrv start
# /etc/init.d/vboxweb-service start
와 같이 데몬을 시작한다.
만약 위 3)에서 dkms 커널모듈이 설치가 불안정하게 되었다면
# /etc/init.d/vboxdrv setup 로 재설치할 수도 있다.
위 3 개 데몬 실행에 오류가 없고 18083 포트가 열렸고,프로세스가
# ps aux |grep vbox
vbox 32002 0.0 0.1 149588 4268 ? Sl 18:26 0:00 /usr/lib/virtualbox/vboxwebsrv --background -H 222.231.xxx.xxx -p 18083 -F /var/log/vbox.log
vbox 32007 0.0 0.0 119560 2200 ? S 18:26 0:00 /usr/lib/virtualbox/VBoxXPCOMIPCD
vbox 32012 0.0 0.1 140076 5620 ? Sl 18:26 0:00 /usr/lib/virtualbox/VBoxSVC --auto-shutdown
와 같이 보이면 일단 된거다.

http://www.mysite.com/phpvirtualbox/index.php 와 같이 접속하면
로그인 아이디 비번 물을꺼다.
여기에 위에서 vbox 서버 계정 정보를 넣으려고 삽질하면 안.된.다. 나처럼 -_-;;
아이디 비번에 모두 admin 이라고 넣어야 한다.
로그인후 메뉴에서 admin 비밀번호를 바꾸면 된다.
보이는 화면은 그냥 virtualbox 와 비슷할꺼다.
..
이제 알아서 직관적으로 사용하면 된다.




### 참고
http://codefat.com/tag/phpvirtualbox/
http://www.oss.kr/12792


2011/12/06 09:39 2011/12/06 09:39
우분투에서 웹서버 환경 LAMP or APM (Apache, PHP, MySQL) 를 구축하는 법입니다.

우선 apache를 설치합니다.

$ sudo apt-get install apache2

설치후 잘 작동하나 확인해 봅시다.
브라우저 주소창에 http://localhost/ 입력해 다음 메세지가 나오면 정상적으로 작동하는겁니다.

이제 PHP를 설치합니다.

$ sudo apt-get install php5 libapache2-mod-php5

설치가 끝나면 재시작 합니다.

$ sudo /etc/init.d/apache2 restart

재시작후 PHP가 잘 작동하는지 확인합니다. (다음 코드를 입력후 저장)

$ sudo gedit /var/www/testphp.php

<?php phpinfo(); ?>

브라우저 주소창에 http://localhost/testphp.php 입력해 다음 메세지가 나오면 정상적으로 작동하는겁니다.
Attachment:
사용자 삽입 이미지


마지막으로 MySQL 을 설치합시다.

$ sudo apt-get install mysql-server


설치 중간에 암호를 설정하는 화면이 나옵니다.
New password for the MySQL "root" user: 비밀번호 입력
Repeat password for the MySQL "root" user: 비밀번호 확인
Attachment:
사용자 삽입 이미지
* 참고로 비밀번호를 바꾸려면 다음처럼 입력합니다.

$ mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('yourpassword');


* 참고로 서버 주소를 바꾸려면 다음처럼 입력후 bind-address 라인의 IP주소를 바꿔주시면 됩니다.

$ sudo gedit /etc/mysql/my.cnf

bind-address = 127.0.0.1 # 기본설정은 localhost



설치가 끝나면 MySQL 관리자 (phpMyAdmin) 를 설치합니다.

$ sudo apt-get install libapache2-mod-auth-mysql php5-mysql phpmyadmin


설치 중간에 다음 메세지가 나오면 apache2를 선택합니다. (space bar로 선택)
Web server to reconfigure automatically: apache2
Attachment:
사용자 삽입 이미지

그후 phpMyAdmin의 데이터베이스를 dbconfig-common으로 설정합니다.

"예"를 눌러 넘어가면 phpMyAdmin에서 사용할 암호를 묻습니다.

이제 끝으로 phpMyAdmin에서 디비 서버와 연결할 비밀번호를 설정하면 설치가 끝납니다.
(임의의 암호 생성이 있는거보니 직접 제어 할일이 적은 설정 같은데 혹시 모르니 적어둡시다.)

역시 phpMyAdmin가 잘 설치되었나 확인해 봅시다.
브라우저 주소창에 http://localhost/phpmyadmin/ 입력해 다음 메세지가 나오면 정상적으로 작동하는겁니다.
Attachment:
사용자 삽입 이미지



2011/10/16 22:15 2011/10/16 22:15

시스템 모니터링

  • top -d 1
    • 시스템 프로세스 모니터링(표시 딜레이 1초)
  • crontab
    • crontab -l : 크론탬 목록
    • crontab -e : 크론탭 수정
    • crontab -l -u {사용자} : 특정사용자 크론탭 목록(root권한 필요)
  • ps -ef
    • 현제 모든 프로세스 목록
  • vmstat 1 100 : 1초 딜레이로 100번 시스템의 상태를 보여준다.
  • sar : 단위 시간별 CPU 상태를 보여준다.
  • 메모리
    • free -lm : 메모리 정보(물리, 사용량, 스왑 등)
    • 스왑메모리 : cat /proc/swaps (크기 및 사용량)

시스템 관리

  • crontab
    • crontab -l : 크론탬 목록
    • crontab -e : 크론탭 수정
    • crontab -l -u {사용자} : 특정사용자 크론탭 목록(root권한 필요)
  • su - : root 로 로그인
  • netstat -ant : 현재 모든 네트워크 상태중 TCP상태를 hostname변환없이 보여준다.

시스템 정보

  • uname -a : OS정보를 보여준다.
    • ex > Linux dev 2.6.18-92.el5PAE #1 SMP Tue Apr 29 13:31:02 EDT 2008 i686 i686 i386 GNU/Linux
  • uptime : OS의 간단한정보(동작시간, 사용자수, load average)를 보여준다.
    • ex > 14:59:44 up 343 days, 2:04, 5 users, load average: 0.07, 0.02, 0.00
  • ifconfig : 현재 네트워크 카드의 상태를 보여준다. (root 권한 필요)
  • ulimit -Sa : OS의 제한 설정을 보여준다.
검색
  • grep
    • grep -r {찾을글자} . : 현 폴더의 하위 폴더까지 포함해서 파일 속에 찾을 글자가 있는 파일을 찾아준다.
    • {명령어} | grep {찾을글자} : {명령어}의 축력 내용에서 찾을 글자가 있는 line 만 보여준다.
  • find -name "{찾을글자}*" : 현 폴더를 기준으로 찾을글자로 시작되는 파일명을 가진 파일 목록을 보여준다.

기타

  • ctrl+d : 터미널 로그아웃
  • 압축
    • 하기
      • tar cvfzp {압축파일명} {압축대상}
      • tar cvfzp file.tar.gz * : 현재 폴더의 모든 파일을 압축
    • 풀기
      • tar xvfzp file.tar.gz : 현재 폴더에 풀기
    • 목록보기
      • tar ztvf file.tar.gz
  • vi : 텍스트 에디터
    • vi -R {파일명} = view {파일명} : 파일을 읽기 전용으로 열기



2011/10/16 14:20 2011/10/16 14:20

svmon 명령어 (참고문서 : AIX 5.1 Command(pdf) 내용에서 발췌)
-------------------------------------------------------------

svmon 명령은 메모리의 현재 상태에 관한 정보를 보여줍니다.

표시된 정보는 메모리의 실제 스냅샵을 구성하지 않는데,

그 이유는 svmon 명령이 인터럽트가 가능한 사용자 레벨에서 수행되기 때문입니다.

세그먼트는 페이지 세트로, 메모리 소비를 보고하기 위해 사용되는 기본 오브젝트입니다.

그러므로, svmon에 의해 보고되는 통계는 페이지 수 측면에서 표시됩니다.

1 페이지는 가상 메모리의 4K 블록이고, 1 프레임은 실제 메모리의 4K 블록입니다.

달리 명시하지 않으면, 모든 통계는 4096 바이트 메모리 페이지 단위입니다.

메모리 소비는 inuse, free, pin, virtual 및 paging space 계수기를 사용하여 보고됩니다.

- inuse 계수기 : 사용된 프레임 수

- free : 모든 메모리 풀에서 사용 가능한 프레임 수

- pin : 고정된 프레임 수, 즉 스왑될 수 없는 프레임 수

- virtual : 시스템 가상공간에 할당된 페이지 수

- paging space : 페이징 공간에서 예약되거나 사용된 페이지 수

한 세그먼트를 여러 개의 프로세스에서 사용할 수 있습니다.

그러한 세그먼트에 속한 각 페이지는 해당 세그먼트를 사용하는 각 프로세스에 대해서

inuse, pin, virtual 또는 pgspace 필드에서 설명됩니다.

그러므로, 활성화된 모든 프로세스에 걸친 inuse, pin, virtual 및 pgspace 필드의 합계가

메모리나 페이징 공간의 총 페이지 수를 초과할 수도 있습니다.

VMM은 통계 목적으로만 virtual 페이지 계수기를 관리합니다.

즉, 항상 최신 데이터가 아니며 값도 해당되는 inuse 계수기보다 작을 수 있습니다.

세그먼트는 다음의 5가지 유형 중 하나에 속합니다.

persistent - 파일 및 디렉토리 조작에 사용되는 세그먼트

working - 프로세스 및 공유 메모리 세그먼트의 데이터 영역을 구현하기 위해 사용되는 세그먼트

client - NFS와 CD-ROM 파일시스템과 같은 일부 가상 파일 시스템을 구현하기 위해 사용

mapping - 메모리에서 파일 맵핑을 구현하기 위해 사용되는 세그먼트

real memory mapping - 가상 주소 공간으로부터 10 공간에 액세스하기 위해 사용되는 세그먼트

----------------------------------

시스템 전체 메모리 사용량 통계 확인

----------------------------------

# svmon -G

size inuse free pin virtual
memory 32760 22182 10578 6035 25932
pg space 65536 8061

work pers clnt lpage
pin 6035 0 0 0
in use 17057 5125 0 0

간단히 설명하면, 전체 메모리 사이즈는 32760*4096byte/1024/1024 = 127MB.

Free Memory는 10578*4096/1024/1024 = 41MB

4096byte를 곱한 이유는 svmon에서 나오는 결과는 전부 페이지단위(1page=4K)이므로....

(설명)

memory - 다음을 포함해 실제 메모리의 사용을 설명하는 통계를 지정.

- size 실제 메모리 프레임의 수(실제 메모리 크기)
- inuse 페이지를 포함되는 프레임의 수
- free 모든 메모리 풀 중 사용 가능 프레임의 수
- pin 고정된 페이지를 포함하는 프레임의 수
- virtual 시스템 가상 영역내에 할당된 페이지 수

in use - 다음을 포함해 사용중 인 실제 메모리의 서브세트에 대한 통계

- work 작업 세그먼트 페이지를 포함하는 프레임 수
- pers 영구 세그먼트 페이지를 포함하는 프레임 수
- clnt 클라이언트 세그먼트 페이지를 포함하는 프레임 수

pin - 다음을 포함해 고정된 페이지가 있는 실제 메모리의 서브세트에 대한 통계 열거.

- work 작업 세그먼트 페이지를 포함하는 프레임 수
- pers 영구 세그먼트 페이지를 포함하는 프레임 수
- clnt 클라이언트 세그먼트 페이지를 포함하는 프레임 수

pg space - 페이지공간의 사용을 설명하는 통계를 나타냅니다

- size 페이징 공간의 크기
- inuse 사용 중인 페이징 공간 페이지 수

-----------------------------
유저별 메모리 사용량 통계 확인
-----------------------------

# svmon -U root -d ; root 사용자가 사용하는 메모리 내역
===============================================================================
User Inuse Pin Pgsp Virtual LPageCap
root 10556 2000 5555 16182 Y

-------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd LPage
3922 dtgreet 5045 1823 1705 7781 N N N
7020 rpc.mountd 5032 1826 1595 7629 N Y N
8514 hostmibd 5010 1823 1586 7281 N N N
4518 X 4981 1825 1938 7838 N N N
1 init 4979 1823 1579 7576 N N N
13420 getty 4963 1823 1586 7245 N N N
7482 portmap 4877 1823 1614 7513 N N N
13158 getty 4858 1823 1674 7239 N N N
2524 telnetd 4741 1823 1574 7292 N N N
3600 telnetd 4741 1823 1574 7292 N N N
15494 i4lmd 4729 1823 1586 7238 N N N
15752 i4lmd 4722 1823 1586 7221 N N N
7998 snmpd 4717 1823 1616 7339 N N N
12412 i4lmd 4712 1823 1583 7213 N N N
16512 i4lmd 4710 1823 1597 7234 N N N
14972 i4llmd 4705 1823 1627 7217 N N N
14466 i4llmd 4680 1826 1686 7284 N Y N
17386 -ksh 4671 1823 1574 7214 N N N
18012 -ksh 670 1823 1574 7214 N N N
8256 dpid2 4647 1823 1576 7254 N N N
4756 svmon 4631 1823 1574 7211 N N N
7740 inetd 4628 1823 1574 7225 N N N
9834 cron 4626 1823 1594 7227 N N N
5166 errdemon 4624 1823 1661 7250 N N N
16256 IBM.AuditRMd 4599 1830 2010 7675 N Y N
5704 prngd 4598 1823 1574 7193 N N N
15998 IBM.ERrmd 4592 1830 2114 7785 N Y N
14212 rmcd 4586 1826 2112 7733 N Y N
7226 syslogd 4573 1823 1608 7205 N N N
5422 srcmstr 4572 1823 1656 7229 N N N
2704 dtlogin <:0> 4567 1823 1602 7202 N N N
15232 IBM.CSMAgentR 4563 1832 2125 7775 N Y N
14712 ctcasd 4562 1830 1968 7566 N Y N
9550 biod 4555 1823 1574 7160 N N N
13938 diagd 4546 1823 1627 7188 N N N
6268 nfsd 4542 1823 1597 7175 N N N
11356 qdaemon 4537 1823 1608 7173 N N N
10586 rpc.lockd 4527 1823 1635 7199 N N N
3412 syncd 4525 1823 1603 7159 N N N
4246 dtlogin 4520 1823 1601 7152 N N N
10846 uprintfd 4517 1823 1580 7131 N N N
11618 writesrv 4516 1823 1638 7191 N N N
11094 rpc.lockd 2907 1832 1561 4326 N Y N
10066 nfsd 2906 1832 1561 4326 N Y N
1548 gil 2898 1827 1563 4320 N Y N
9030 kbiod 2888 1824 1559 4306 N Y N
6726 j2pg 2887 1828 1572 4318 N Y N
1032 xmgc 2884 1823 1559 4302 N N N
1290 netm 2884 1823 1559 4302 N N N
8774 rtcmd 2884 1823 1559 4302 N N N
774 reaper 2884 1823 1561 4302 N N N
3102 lvmbb 2882 1823 1561 4302 N N N
516 wait 2882 1823 1559 4300 N N N
1806 wlmsched 2882 1823 1561 4302 N N N
0 swapper 4 2 0 4 N N N

...............................................................................
SYSTEM segments Inuse Pin Pgsp Virtual
3008 1888 1631 4487

Vsid Esid Type Description LPage Inuse Pin Pgsp Virtual
0 0 work kernel seg - 2880 1821 1559 4298
8c5 - work - 23 9 1 23
16aa - work - 22 9 1 23
2792 - work - 11 9 18 29
1a0f - work - 11 7 12 23
2191 - work - 11 7 12 23
3f3e - work - 11 7 15 22
1eae - work - 10 3 0 10
3619 - work - 9 3 3 10
2752 - work - 7 3 8 11
e26 - work - 5 5 1 6
1a2d - work - 4 4 1 5
3c9f - work - 4 1 0 4

...............................................................................
EXCLUSIVE segments Inuse Pin Pgsp Virtual
5915 112 3909 8875

Vsid Esid Type Description LPage Inuse Pin Pgsp Virtual
aa4 2 work process private - 396 2 15 410
182c 2 work process private - 374 2 4 377
19cc 2 work process private - 327 2 119 446
365b - pers /dev/hd2:12338 - 312 0 - -
3b9d 2 work process private - 296 2 345 640
2473 2 work process private - 275 2 38 313
..........
..........(중략)

3f9e - pers /dev/hd9var:308 - 0 0 - -
1e8e 1 pers code,/dev/hd2:10638 - 0 0 - -
d67 - pers /dev/hd9var:2127 - 0 0 - -
27b3 - work shmat/mmap - 0 0 2 2
2151 - pers /dev/hd9var:2115 - 0 0 - -
2012 3 mmap mapped to sid 1408 - 0 0 - -
1d4f - pers /dev/hd9var:120 - 0 0 - -

...............................................................................
SHARED segments Inuse Pin Pgsp Virtual
1633 0 15 2820

Vsid Esid Type Description LPage Inuse Pin Pgsp Virtual
2a15 d work shared library text - 1633 0 15 2820

-----------------------------------
특정 명령어의 메모리 사용량 통계 확인
-----------------------------------

# svmon -C inetd ; inetd 데몬에 의해 사용되어지는 메모리 통계

===============================================================================
Command Inuse Pin Pgsp Virtual
inetd 4628 1823 1574 7225

...............................................................................
SYSTEM segments Inuse Pin Pgsp Virtual
2880 1821 1559 4298

Vsid Esid Type Description LPage Inuse Pin Pgsp Virtual
0 0 work kernel seg - 2880 1821 1559 4298

...............................................................................
EXCLUSIVE segments Inuse Pin Pgsp Virtual
115 2 0 107

Vsid Esid Type Description LPage Inuse Pin Pgsp Virtual
2a74 2 work process private - 62 2 0 62
367a f work shared library data - 45 0 0 45
3a7c 1 pers code,/dev/hd2:10656 - 7 0 - -
162e - pers /dev/hd2:68574 - 1 0 - -

...............................................................................
SHARED segments Inuse Pin Pgsp Virtual
1633 0 15 2820

Vsid Esid Type Description LPage Inuse Pin Pgsp Virtual
2a15 d work shared library text - 1633 0 15 2820

-------------------------------
프로세스 메모리 사용량 통계 확인
-------------------------------

# svmon -P ; 시스템 프로세스별 메모리 통계 확인

-------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd LPage
3922 dtgreet 5045 1823 1705 7781 N N N

Vsid Esid Type Description LPage Inuse Pin Pgsp Virtual
0 0 work kernel seg - 2880 1821 1559 4298
2a15 d work shared library text - 1633 0 15 2820
19cc 2 work process private - 327 2 119 446
3e5d f work shared library data - 173 0 11 188
27d3 - work shmat/mmap - 29 0 1 29
2b14 1 pers code,/dev/hd2:116793 - 3 0 - -
3198 - pers /dev/hd9var:2182 - 0 0 - -
106a - pers /dev/hd2:145819 - 0 0 - -
186e - pers /dev/hd2:68956 - 0 0 - -
1f8f - pers /dev/hd9var:2125 - 0 0 - -
......
......
......
-------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd LPage
0 swapper 4 2 0 4 N N N

Vsid Esid Type Description LPage Inuse Pin Pgsp Virtual
2412 2 work process private - 4 2 0 4

프로세스 개별확인은 # svmon -P (pid)

---------------
세그먼트 테이블
---------------
세그먼트 유형 세그먼트 사용법 설 명
----------------------------------------------------------------------------------------
persistent 로그파일 로그
persistent 파일 및 디렉토리 장치 이름: i-노드 번호
persistent 대형 파일 대형 파일 장치 이름: i-노드 번호
mapping 파일 맵핑 sid 소스 sid에 맵핑됨
working 프로세스 및 공유 메모리 세그먼트의 VSID및 ESID를 기초로 세그먼트의
데이타영역 역할에 따라 다름
client NFS 및 CD-ROM 파일 상 동
rmapping IO 영역 맵핑 상 동

이상입니다. 그냥 대충 svmon -G 정도만 아시면 될 듯 합니다.

많이 헷갈리네요~ 더 연구를 해야할 듯...




2011/10/11 12:08 2011/10/11 12:08
*MySQL 쓰면서 하지 말아야 할 것 17가지*

작게 생각하기
- 조만간 규모가 커질거라면 MySQL ecosystem을 봐야된다.
- 그리고 캐싱 빡시게 안 하는 메이저 웹사이트는 없다.
- develooper.com의 Hansen PT랑 Ilia 튜토리얼 볼 것
- 처음부터 확장 가능하게 아키텍처 잘 쪼개놔야된다.
- 복제랑 파티셔닝 어떻게 할지 미리 계획 세워놔라.
- 파일 기반 세션 좀 쓰지마 -_-
- 그렇다고 너무 쓸데없이 크게 생각하지도 말 것
- 특히 성능하고 확장성 구분 못 하면 난감함

EXPLAIN 안 써보기
- SELECT 앞에 EXPLAIN 이라고 붙이기만 하면 되는 것을 (..)
- 실행 계획 확인
- 타입 컬럼에 index 써있는거랑 Extra 컬럼에 index 써있는거랑 "매우 큰" 차이 있음
* 타입에 있으면 Full 인덱스 스캔 (안 좋다.)
* Extra 컬럼에 있으면 Covering 인덱스 찾았다는 의미임 (좋다!)
- 5.0 이후부터는 index_merge 최적화도 한다.

잘못된 데이터 타입 선택
- 한 메모리 블럭 단위에 인덱스 레코드가 많이 들어갈수록 쿼리가 빨리 실행될 것이다. (중요)
- 아.. 정규화 좀 해 -_-... (이거 정말 충격과 공포인 듯)
- 가장 작은 데이터 타입을 써.. (진짜 BIGINT가 필요하냐고..)
- 인덱스 걸리는 필드는 정말 최소한으로 데이터 크기를 써야된다고.
- IP는 INT UNSIGNED로 저장해!! (아주 공감)
* 이럴 때 쓰라고 INET_ATON 함수가 아예 내장되어 있음.

PHP에서 pconnect 쓰는 짓
- 아파치에서 좀비 프로세스라도 생기면 그 커넥션은 그냥 증발하는거야..
- 어차피 MySQL 접속 속도는 Oracle이나 PostgreSQL 보다 10~100배 빠르다고.

너무 과도한 DB 추상화 계층을 두는 것
- 어디 포팅 열심히 할 거 아니면 추상화 계층 쓰지마 (ADODB, MDB2, PearDB 등)
- scale out 가능한걸 쓰라고.

스토리지 엔진 이해 못 하는 것
- 단일 엔진만으로 전체 아키텍처를 결정했다면 대부분 최적이 아님
- 엔진 별 장단점을 공부할 것
- ARCHIVE : zlib으로 압축해주고 UPDATE 안 되고 로그 Bulk Insert에 유용함.
- MEMORY : 서버 재시작하면 증발. 인덱스가 HASH나 BTREE로 가능함. 임시, 요약 데이터에 사용.
* 주간 top X 테이블 같은 것.
* 하여튼 메모리에 박아넣고 싶은 데이터 있으면..

인덱스 레이아웃 이해 못 하는 것
- 제대로 인덱스랑 스토리지 엔진 선택하려면 공부 좀 해
- 엔진은 데이터와 인덱스 레코드를 메모리나 디스크에 레이아웃하는 걸 구현한 것
- clustered 구성은 데이터를 PK 순서에 따라 저장함.
- non-clustered 구성은 인덱스만 순서대로 저장하고 데이터는 순서 가정하지 않음.
- clustered에서는 인덱스만 타면 추가적인 조회 없이 바로 데이터 가져오는 것임.
- 그래서 clustered PK는 작은 놈으로 할 필요가 있다는거
* 다른 인덱스는 각 레코드마다 PK를 앞에 더 붙이게 되니까.
* PK 지정 안 하면 아무렇게나 해버림

쿼리 캐시 이해 못 하는 것
- 어플리케이션 read/write 비율은 알고 있어야지
- 쿼리 캐시 설계는 CPU 사용과 읽기 성능 간의 타협
- 쿼리 캐시 크기를 늘린다고 읽기 성능이 좋아지는게 아님. heavy read라도 마찬가지.
- 과도한 CPU 사용을 막기 위해 무효화 할 때는 캐시 항목들을 뭉텅이로 날려버림
- 한마디로 SELECT가 참조하는 테이블 데이터 하나라도 변경되면 그 테이블 캐시는 다 날라간다는 얘기임
- 수직 테이블 파티셔닝으로 처방
* Product와 ProductCount를 쪼갠다든지..
* 자주 변하는 것과 변하지 않는 것을 쪼개는게 중요하다 이 말임.

Stored Procedure를 쓰는 것
- 무조건 쓰면 안 된다는게 아니고..
- 컴파일 할 때 무슨 일이 일어나는지 이해 못 하고 쓰면 재앙이 된다 이 말.
- 다른 RDBMS랑 다르게 connection thread에서 실행 계획이 세워짐.
- 이게 뭔 얘기냐 하면 데이터 한 번 가져오고 연결 끊으면 그냥 CPU 낭비 (7~8% 정도)하는 꼴이라는 것.
- 웬만하면 Prepared 구문과 Dynamic SQL을 써라.. 아래 경우를 제외하고
* ETL 타입 프로시저
* 아주아주 복잡하지만 자주 실행되지는 않는 것
* 한 번 요청할 때마다 여러번 실행되는 간단한 것 (연결한 상태로 여러번 써야 된다니까)

인덱스 컬럼에 함수 쓰는 것
- 함수에 인덱스 컬럼 넣어 호출하면 당연히 인덱스 못 탄다
- 함수를 먼저 계산해서 상수로 만든 다음에 = 로 연결해야 인덱스 탈 수 있다.
* 여기 실행 계획 보면 LIKE도 range type 인덱스 타는 것 보임

인덱스 빼먹거나 쓸모없는 인덱스 만들어 놓는 것
- 인덱스 분포도(selectivity)가 허접하면 안 쓴다.
- S = d/n
* d = 서로 다른 값의 수 (# of distinct values)
* n = 테이블의 전체 레코드 수
- 쓸모없는 인덱스는 INSERT/UPDATE/DELETE를 느리게 할 뿐..
- FK는 무조건 인덱스 걸어라. (물론 FK 제약 걸면 인덱스 자동으로 생긴다.)
- WHERE나 GROUP BY 표현식에서 쓰이는 컬럼은 인덱스 추가를 고려할 것
- covering index 사용을 고려할 것
- 인덱스 컬럼 순서에 유의할 것!

join 안 쓰는 짓
- 서브쿼리는 join으로 재작성해라
- 커서 제거해라
- 좋은 Mysql 성능을 내려면 기본
- 집합 기반으로 생각해야지 루프 돌리는거 생각하면 안 된다.

Deep Scan 고려하지 않는 것
- 검색엔진 크러울러가 쓸고 지나갈 수 있다.
- 이 경우 계속해서 전체 집합을 정렬한 다음 LIMIT로 가져와야 하니 무진장 느려진다.
- 어떻게든 집합을 작게 줄인 다음 거기서 LIMIT 걸어 가져올 것

InnoDB 테이블에서 WHERE 조건절 없이 SELECT COUNT(*) 하는 짓
- InnoDB 테이블에서는 조건절 없이 COUNT(*) 하는게 느리다.
- 각 레코드의 transaction isolation을 유지하는 MVCC 구현이 복잡해서 그렇다는..
- 트리거 걸어서 메모리 스토리지 엔진 쓰는 테이블에 통계를 별도로 유지하면 된다.

프로파일링이나 벤치마킹 안 하는 것
- 프로파일링 : 병목 찾아내기
- 벤치마킹 : 시간에 따른 성능 변화 추이 평가, 부하 견딜 수 있는지 테스트
- 프로파일링 할 때는 실제 데이터를 옮겨와서 할 것
- 어디가 병목이냐~ Memory? Disk I/O? CPU? Network I/O? OS?
- 느린 쿼리 로그로 남기기
* log_slow_queries=/path/to/log
* log_queries_not_using_indexes
- 벤치마킹 시에는 다 고정시키고 변수 하나만 바꿔가면서 해야 함. (쿼리 캐시는 끌 것.)
- 도구를 써라~~
* EXPLAIN
* SHOW PROFILE
* MyTop/innotop
* mysqlslap
* MyBench
* ApacheBench (ab)
* super-smack
* SysBench
* JMeter/Ant
* Slow Query Log

AUTO_INCREMENT 안 쓰는 것
- PK를 AUTO_INCREMENT로 쓰는건 무진장 최적화 되어 있음
* 고속 병행 INSERT 가능
* 잠금 안 걸리고 읽으면서 계속 할 수 있다는!
- 새 레코드를 근처에 놓음으로써 디스크와 페이지 단편화를 줄임
- 메모리와 디스크에 핫 스팟을 생성하고 스와핑을 줄임

ON DUPLICATE KEY UPDATE를 안 쓰는 것
- 레코드가 있으면 업데이트하고 없으면 인서트하고 이런 코드 필요없다!! 다 날려버려라!!
- 서버에 불필요하게 왔다갔다 할 필요가 없어짐
- 5-6% 정도 빠름
- 데이터 입력이 많다면 더 커질 수 있음

하지 말아야 할 것 총정리
Thinking too small
Not using EXPLAIN
Choosing the wrong data types
Using persistent connections in PHP
Using a heavy DB abstraction layer
Not understanding storage engines
Not understanding index layouts
Not understanding how the query cache works
Using stored procedures improperly
Operating on an indexed column with a function
Having missing or useless indexes
Not being a join-fu master
Not accounting for deep scans
Doing SELECT COUNT(*) without WHERE on an InnoDB table
Not profiling or benchmarking
Not using AUTO_INCREMENT
Not using ON DUPLICATE KEY UPDATEK                                       


2011/09/25 19:19 2011/09/25 19:19
List of methods used to redirect a web site using Apache:

Web site forwarding and redirection methods:

  1. One can forward a web page URL or home page using the following web page with the "Refresh" directive:
    <META HTTP-EQUIV="Refresh" Content="0; URL=http://www.company.com/dir1/">
    This commands the browser to refresh the page with the new specified URL. This forwards a single page only and not the entire domain. It can forward the default home page for the domain giving the appearance of forwarding the domain..

    or:

    <html>
    <head>
    <META HTTP-EQUIV="Refresh" Content="3; URL=http://www.company.com/dir1/">
    </head>
    <body>
    This page will forward to http://www.company.com/dir1/ in three seconds.
    <p>
    Please update your links.
    </body>
    </html>
  2. Use a CGI script to forward a home page: (mod_cgi)
    File: httpd.conf
    ScriptAlias / /var/www/cgi-bin/redirect-script/
    File: /var/www/cgi-bin/redirect-script
    #!/usr/bin/perl
    
    print "Status: 301 Moved\r\n" .
          "Location: http://www.new-domain.com/\r\n" .
          "\r\n";
                        
    or:
    #!/usr/bin/perl -w
    use strict;
    use CGI qw/:standard/;
    print redirect('http://www.new-domain.com');
                        
  3. Use a PHP script to redirect:
    <?php
    header("Location: http://www.new-domain.com/");
    ?>
                        
  4. Use a Javascript to redirect:
    <html>
    <head>
    <script language="Javascript" type="text/javascript">
    <!-- Hide script
    //<![CDATA[
    window.location.href="http://www.new-domain.com/"	    
    //]]> End script hiding -->
    </script>
    </head>
    </html>
                        
  5. Use Apache module (mod_rewrite)
    File: httpd.conf
    RewriteEngine On
    RewriteRule /.* http://www.new-domain.com/ [R]
    Forwards all references in entire domain.
  6. Use Apache module (mod_alias )
    File: httpd.conf
    • Redirect Domain:
      Redirect / http://www.new-domain.com/
      or
      Redirect permanent / http://www.new-domain.com/
    • Redirect Page:
      Redirect /web-page.html http://www.new-domain.com/destination-web-page.html
                              
    Note:
    • Redirect directives take precedence over Alias and ScriptAlias directives.
    • Other "Redirect" options include: temp (error 302) default - temporary redirect status, seeother (error 303) resource has been replaced and gone (error 410) resource has been permanently removed.

    Example httpd.conf with virtual hosts for multiple domains which all redirect:

    <VirtualHost XXX.XXX.XXX.XXX>
    ServerName directtolinux.com
    ServerAlias www.directtolinux.com
    ServerAlias direct-to-linux.com
    ServerAlias www.direct-to-linux.com
    ServerAlias digitalpenguins.com
    ServerAlias www.digitalpenguins.com
    Redirect permanent / http://www.yolinux.com/
    </VirtualHost>
                            
  7. Apache 301 redirect using the .htaccess file:

    If one wants to permanently forward an entire web site to a new URL or forward a single page permanently and have the search engines update their database, one should use a 301 redirect. This may redirect to a new server or to itself but to a different domain. This tutorial shows how. This method is a variation of using the mod_alias redirection shown above except that it allows the customer to redirect themselves by providing a .htaccess file themselves.

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^yolinux.com
    RewriteRule ^(.*)$ http://www.yolinux.com/$1 [R=permanent,L]
    This example forwards http://yolinux.com to http://www.yolinux.com/ to unify your site to a single URL. This can also simplify your web logs if they can not distinguish between the two



2011/09/13 20:56 2011/09/13 20:56

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

MySQL 로그 파일 관리

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


Mysql 의 로그 파일은 다음과 같이 크게 3종류가 있습니다.

1. 에러로그
2. 일반적인 로그
3. UPDATE 로그

첫번째 에러 로그는 hostname.err 의 이름으로 서버 실행시 에러를 기록하는 파일입
니다. 두번째 로그파일은 mysql 에 접근하는 사용자와 그들이 파일과 관련된 쿼리를
실행할 경우에 기록되는 로그 파일로 /usr/local/mysql/var 밑에 host_name.log 으로
저장이 되어집니다. Mysql 데이터에 파일을 기록하므로 파일과 관련된 쿼리는 DB 생
성/삭제 , 테이블 생성/삭제 , 레크드 삽입/갱신 이 있습니다.
이 로그 파일은 Mysql 실행시 --log 옵션을 주어 활성화 시키면 된다.

# /usr/local/mysql/bin/safe_mysqld --log &

업데이터로그는 테이블이 변경될때마다 해당 쿼리가 기록 됩니다. 기본적으로 활성
화 되지 않고 Mysql 실행시 --log-update 옵션으로 가능하다.

# /usr/local/mysql/bin/safe_mysql --log-update &

업데이터 로그는 /usr/local/mysql/var 밑에 host_name.00X 식으로 서버가 다시
실행되거나 mysqladmin reflesh 혹은 mysqladmin flush-logs 명령을 내릴때마다
뒤의 번호가 1씩 증가 한다. 혹은 --log-update=mysql.log 와 같이 로그파일명을
정해줄수도 있다. Update 로그는 update 쿼리만 저장하거 같지만 ..
delete , create 등의 쿼리도 모두 저장한다.

mysql 의 사용량이 많은 사이트는 이런 로그파일이 쌓이므로 해서 디스크 용량에
문제가 생길수 있다. 관리자는 수시로 점검하여 삭제를 해어야 한다.

로그 파일을 관리하는 방법으로는 두가지가 있다.

먼저 /usr/local/mysql/share/mysql/mysql-log-rotate 파일을 이용하는 방법과
간단한 스크립트를 작성하여 cron 에 등록한뒤 관리하는 방법이 있다.

/usr/local/mysql/share/mysql/mysql-log-rotate 파일을 이용하는 방법은 ..
--log-update=mysqld.log 와 같이 로그파일을 정해서 관리할때 이용하면 된다.

# vi /usr/local/mysql/share/mysql/mysql-log-rotate
-------------------------------------------------------------------------
----
# This logname is set in mysql.server.sh that ends up in /etc/rc.d/init.d/mysql
#
# If the root user has a password you have to create a
# /root/.my.cnf configuration file with the following
# content:
#
# [mysqladmin]
# password = <secret>
# user= root
#
# where "<secret>" is the password.
#
# ATTENTION: This /root/.my.cnf should be readable ONLY
# for root !

/usr/local/mysql/var/mysqld.log {
# create 600 mysql mysql
notifempty
daily
rotate 3
missingok
compress
postrotate
# just if mysqld is really running
if test -n "`ps acx|grep mysqld`"; then
/usr/local/mysql/bin/mysqladmin flush-logs
fi
endscript
}

-------------------------------------------------------------------------
--

위의 파일을 /etc/logrotate.d 디렉토리에 복사만 하면 알아서 로테이트 하게 된다.
단..로그파일을 교체한후 mysqladmin flush-logs 를 적용하므로 root 홈디렉토리에
.my.cnf 파일을 만든후 MySQL 의 root 사용자의 암호와 사용자 명을 적어주어야 한
다.

vi /root/.my.cnf
--------------------------------------
[mysqladmin]
password = xxxxxxxxx
user = root

--------------------------------------

정상적인 로그 교체의 확인은 다음과 같이 하면 된다.

# logrotate -f /etc/logrotate.d/mysql-log-rotate


이밖에 --log-update 등의 옵션을 이용하면 수시로 로그파일의 뒤에 001,002 씩으로
번호가 증가 되면서 저장이 되므로 별도의 스크립트를 작성하여 관리해야 한다.

이는 각자 머리를 잘 짜면 될거 같다.

#!/bin/sh

find /usr/local/mysql/var -name "*.[0-9]*" -type f -mtime +3 -exec rm -f {} \;
/usr/local/mysql/bin/mysqladmin flush-logs

위와 같은 만들면 된다. 이는 "3일 지난 파일은 지워라" 로 cron 에 등록한뒤 적절한
시간마다 실행해주면 된다.




2011/09/11 20:24 2011/09/11 20:24
개발을 하다보면 euc-kr 파일인코딩을 utf-8 로 변경할 경우나 그 반대의 경우 등등 여러가지 경우가 발생한다.

인터넷 검색해서 나오는 쉘 스크립트의 경우 이미 utf-8일 경우도 다시 utf-8로 변환해서 깨지는 현상이 발생하여 변환시 에러가 안날 경우만 변경되도록 처리가 필요하였다.

그럴 경우를 위해 일괄적으로 특정 디렉토리의 파일들을 찾아서 euc-kr -> utf-8 로 만드는 쉘 스크립트를 만들어서 돌려보니 잘 작동해서 올린다.

html, inc, php 이외의 파일을 변환하려면 중간에 "*[php|inc|html?]" 부분을 수정하면 된다.

================ 스크립트 시작 ==================

#!/bin/bash
if [ $# != 3 ]
then
echo "Usage : char_convert.sh [char_from] [char_to] [dir]"
exit 0
fi

charfrom=$1
charto=$2
objdir=$3

for x in $(find $objdir -type f -name "*[php|inc|html?]") ; do

iconv -f $charfrom -t $charto $x > $x.utf-8
if [ $? != 0 ]
then
echo "-----------------------------------"
rm -f $x.utf-8
echo "deleted $x.utf-8"
else
echo "-----------------------------------"
rm -f '$x'
echo "deleted $x"
mv $x.utf-8 $x
echo "mv $x.utf-8 -> $x"
fi

done

exit 0

================ 스크립트 종료 ==================

PS. 리눅스 iconv 기능을 이용했으므로 없다면 설치해야 함.
PS. PHP 를 사용하는 분들이라면 기본적으로 있을거라 생각함.                                       


2011/09/07 01:36 2011/09/07 01:36
리눅스에서 사용하는 dd 를 Windows용으로 포팅한 것이다.

부트섹터 덤프나 디스크를 덤프할때 많이 사용하는 프로그램이다.

dd for Win32


배포 : http://www.chrysocome.net/dd

최신버전 0.6beta-source    

dd for windows

dd - convert and copy a file

This version does not actually do any conversion but it allows the flexible copying of data under in a win32 environment. At the moment block devices under Win9x are not supported but that will be added soon.

Read more in the Wikipedia entry for dd

Usage

dd [bs=SIZE[SUFFIX]] [count=BLOCKS[SUFFIX]] if=FILE of=FILE [seek=BLOCKS[SUFFIX]] [skip=BLOCKS[SUFFIX]] [--size] [--list] [--progress]

bs is the block size. The block size can be specified in bytes or with one of the following suffix

DescriptionSuffixSize
Charactersc1
Wordsw2
Double Wordsd4
Quad Wordsq8
Kilobytesk1,024
MegabytesM1,048,576
GigabytesG1,073,741,824

The default block size is 512 which will work for most files and devices but the copy will be a lot faster if you use a larger block size. For example a floppy disk read with bs=1k count=1440 takes almost twice as long than if you use bs=1440k count=1. Don't make the block size too large because windows will run out of memory. 1M is probably a good size and upper limit. Most CD/DVDs have a 2k sector size and probably will not work with a block size which is not a multiple of that.

skip is the distance to skip over the input file before reading is commenced. It is in blocks so the distance will be skip * blocksize. You can also use a suffix here so skip=1k will skip 1024 blocks. You can remember that skip relates to the input file by thinking of a 'skipping rope'.

seek is the distance to seek over in the output file before writing is commenced. It is also in blocks do the distance will be seek * blocksize. You can also use a suffix here so seek=1k will seek 1024 blocks. You just have to remember that if skip is for in then seek is for out.

count is the number of blocks to copy. If it is not specified then the dd will continue until the end of the file/device is reached. On many usb devices this is not reliable so you should use --size to guess the size of the device, see below. You can also use a suffix here so count=1k will copy 1024 blocks.

Using --size

Traditionally when using dd, if you wanted to copy an entire device, you did not specify a block count and dd would read until it reached the end of the device. If you tried to read past the end of the device, the data up to the end of the device would be returned and if you kept reading you would get an error message. Windows however does not always do this so --size will tell dd to figure out the size of the device and make sure it does not read past that point. This is important for USB sticks which stop working if you read past the end of them. This is not on by default because getting the correct size of the device is not always possible. Some devices also keep returning bogus data past the end of the device without returning a suitable error code

Using --list

Windows provides a number of ways to name a device. The --list will output the preferred names. Under NT4, only the \\?\Device\Harddisk<n>\Partition<n> method is available. Partition0 is the entire disk. Under Windows XP, some partitions may not have a Volume device. In this case you can still use the Harddisk<n>\Partition<n> name.

Windows 2000 and later have Volume devices which are unique GUIDs which identify a disk or partition (what MS call a Volume). These are listed along with any mount point that they may be mounted on. Most of the time this is a drive letter but it may be a path on another filesystem. If you want to read the underlying device, do not include the trailing \ character. If the volume is not mounted there is no easy way to identify it so be careful. Under XP SP2, many partitions can not be read directly, even if they are not in use. There is a work around which I call reading partitions via the back door.

Sample output

dd --listrawwrite dd for windows version 0.4beta1. Written by John Newbigin <jn@it.swin.edu.au> This program is covered by the GPL. See copying.txt for details Win32 Available Volume Information \\.\Volume{5cd94d2c-3251-11d9-9444-806d6172696f}\ link to \\?\Device\HarddiskVolume1 fixed media Mounted on \\.\c: \\.\Volume{129b1243-3252-11d9-b167-806d6172696f}\ link to \\?\Device\CdRom0 CD-ROM Mounted on \\.\r: \\.\Volume{129b1242-3252-11d9-b167-806d6172696f}\ link to \\?\Device\Floppy0 removable media Mounted on \\.\a: \\.\Volume{e3429891-0eb9-11da-b18f-000d60dc98cd}\ link to \\?\Device\Harddisk1\DP(1)0-0+3 removable media Mounted on \\.\d: NT Block Device Objects \\?\Device\CdRom0 \\?\Device\Floppy0 \\?\Device\Harddisk0\Partition0 link to \\?\Device\Harddisk0\DR0 Fixed hard disk media. Block size = 512 \\?\Device\Harddisk0\Partition1 link to \\?\Device\HarddiskVolume1 \\?\Device\Harddisk1\Partition0 link to \\?\Device\Harddisk1\DR2 Removable media other than floppy. Block size = 512 \\?\Device\Harddisk1\Partition1 link to \\?\Device\Harddisk1\DP(1)0-0+3 Removable media other than floppy. Block size = 512 Virtual devices /dev/zero /dev/random

Using --progress

--progress is an non-standard enhancement to dd which will show you progress as each block is copied.

Virtual devices

Virtual devices are a new feature in version 0.4beta1.

Because windows does not have devices like the unix /dev/zero or /dev/random these have been implemented inside dd. You can use these as input files to supply an infinite amount of zeros or pseudo random data.

Standard I/O

Standard Input (stdin) is now the default input file if you do not specify a value for if. You can also explictly use stdin with if=-. Standard Out (stdout) is now the default output file if you do not specify a value for of. You can also explictly use stdout with of=-. Progress and error messages are written to Standard Error (stderr). This allows the use of dd with pipe commands.

Safety with --filter=

To prevent accidental overwriting of the wrong disk, a safety filter can be enforced. Available filters are:

fixedOnly write to a fixed disk
removableOnly write to a removable disk
diskOnly write to any kind disk
partitionOnly write to a partition

You can enforce a filter by renaming dd.exe to dd-<filter>.exe. For example, dd-removable.exe can only write to removable disks like USB and CF, making sure that you don't accidently write to a fixed hard disk.

Examples

Make an image of a floppy disk:

dd if=\\.\a: of=c:\temp\disk1.img bs=1440k

Write the image back to a floppy disk:

dd if=c:\temp\disk1.img of=\\.\a: bs=1440k

Rip an .iso from a CD

dd if=\\?\Device\CdRom0 of=c:\temp\disc1.iso bs=1M

Read a partition from a USB memory device

dd if=\\.\Volume{c18588c0-02e9-11d8-853f-00902758442b} of=c:\temp\usb1.img bs=1M

Read the entire USB memory device

dd if=\\?\Device\Harddisk1\Partition0 of=c:\temp\usb2.img bs=1M --size --progress

You can write to any file or block device which windows will allow you to write to. You can use the standard \\.\ notation for win32 exported devices or the dd specific \\?\ notation to access windows native devices.

Note: You can not write to a CD with this program. Get microsoft cdburn from the windows XP resource kit.

Note: Floppy disks are extremely unreliable. If you get errors, please try another floppy disk or reformatting the disk.

Downloads for dd family
Program Version Content Format Platform Download
Installation Instructions
dd0.6beta3Source.zipDelphi dd-0.6beta3.src.zip
dd0.6beta3Binary.zipWindows dd-0.6beta3.zip
dd0.6beta1Source.zipDelphi dd-0.6beta1.src.zip
dd0.5Binary.zipWindows dd-0.5.zip
dd0.4beta4Binary.zipWindows dd-0.4beta4.zip
dd0.4beta4Source.zipDelphi dd-0.4beta4.src.zip

Changes in version 0.6beta3

  • add errorlevel exit code
  • progress is written to stderr

Changes in version 0.6beta2

  • Implemented of=/dev/null which will just throw away the data
  • skip on stdin now works
  • fix checking size of floppy disks

Changes in version 0.6beta1

  • --progress output is in the same unit as bs is specified with
  • new filter type 'file' which will Only write to a fileystem file
  • new feature id=<drive>/od=<drive> for input disk and output disk. if <drive> is the only partition on a disk, then the entire disk is selected. Eg: if you insert a USB disk and it is mounted as f: then 'id=f:' will select the USB disk (not just the partition like if=\\.\f: would do)

Changes in version 0.5

  • count, seek and skip can now use a multiplicative suffix like bs
  • stdin and stdout are now the defaults

Changes in version 0.4beta6

  • Implemented of=- for stdout
  • Renamed if=- for stdin
  • Messages are now printed to stderr

Changes in version 0.4beta5

  • If a partial block write fails, the buffer is padded to the end of the block and the write is attempted again
  • This allows disk images which are not an exact multiple of the block size to be written to disk

Changes in version 0.4beta4

  • Implemented if=stdin
  • --filter= added

Changes in version 0.4beta2

  • --list shows disk and partition sizes
  • --size added

Changes in version 0.4beta1

  • --list shows correct syntax for drive letters
  • virtual devices added

Changes in version 0.3

  • Modified native device scan to find noncontiguously numbered devices
  • Show symlink destinations in device scan
  • Open source file with FILE_SHARE_READ
  • Stupid bug opening native output devices (assigned handle to input instead of output)
  • Stupid bug where native devices were always read only
  • added progress indicator

Alternate versions

This is a list of other dd tools for windows from other projects:

This is a list of other dd tools for linux/unix:

Original dd for windows web site

License & Copyright

dd is owned and copyright by Chrysocome and John Newbigin. It is made available under the terms of the GPL. Other licensing is available on request.

Development on this project is funded by donations. If you like it, please donate. As little as $5 can ensure that dd continues to be maintained in the future.




2011/09/07 01:22 2011/09/07 01:22
PHP 에서 원격지의 서버에 접속해서 데이터를 교환하거나 , 특정 프로그램을 실행시키기 위해 사용할 수 있다.

준비물 : OpenSSL(lib), libssh2, php_ssh2

리눅스 시스템
1. OpenSSL http://www.openssl.org
직접 다운로드 (http://www.openssl.org/source/openssl-0.9.8k.tar.gz)

2. libssh2 http://sourceforge.net/projects/libssh2/
직접 다운로드 (http://jaist.dl.sourceforge.net/sourceforge/libssh2/libssh2-1.1.tar.gz)

3. ssh2 PHP extension http://pecl.php.net/package/ssh2
직접 다운로드 (http://pecl.php.net/get/ssh2-0.11.0.tgz)

OpenSSL 설치


우선 소스를 적당한 디렉토리 (예제에서는 /usr/local/src 를 사용함) 에 다운로드 받는다.
# tar zxvf openssl-0.9.8k.tar.gz
# cd openssl-0.9.8k
# ./config 또는 ./Configure --linux-elf --prefix=/usr/local/OpenSSL
# make
# make install

Libssh2 설치


소스를 다운로드 받고 적당한 디렉토리에 타르볼을 해제한다.
# tar zxvf libssh2-1.1.tar.gz
# cd libssh2-1.1
# ./configure (기본적으로 설치는 /usr/local 에 이루어진다. )
# make
# make install
설치가 완료된 후에 /usr/local/lib 에 libssh2.so 파일이 존재한다.

PHP ssh2 Extension 설치


# tar zxvf ssh2-0.11.0.tgz
# cd ssh2-0.11.0
# phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
# ./configure
# make
# cp .libs/ssh2.so /usr/local/php/
(이 예제는 PHP Extension을 /usr/local/lib 에 복사를 한다.)
# vi /usr/local/lib/php.ini
extension=ssh2.so 를 추가 시켜준다.
** 여기서 extension_dir의 경로가 /usr/local/php 로 설정이 되어있고 , 시스템마다 다른경로로 표현이 될수 있음
# php -m | grep ssh2
ssh2

설치가 완료 되었으므로 Apache 웹서버를 재 시작해준다.

PHP ssh2 Extension 설치 후 해당 Extension 사용방법이다.

사용자 삽입 이미지

phpinfo() 구문을 실행 했을때 위와 같이 ssh2 확장이 설치가 되어 있어야 한다.

 'diffie-hellman-group1-sha1',
		'client_to_server' =>	// 클라이언트 -> 서버
			array(
				'crypt' => '3des-cbc',	// 암호화 방식은 3des-cbc 로 사용하고 
				'comp' => 'none'		// 압축은 사용하지 않는다.
			),
		'server_to_client' => 	// 서버 -> 클라이언트 
			array(
				'crypt' => 'aes256-cbc,aes192-cbc,aes128-cbc',	// 암호화 방식
				'comp' => 'none'		// 압축사용여부
			)
	);

	// SSH 에 접속한다. 
	$rCon = ssh2_connect('125.***.50.***', 22, $arMethod);
	$bLgn = ssh2_auth_password($rCon ,'lovelgw' , '********');	// 계정 , 비밀번호를 적어 넣는다.
	
	var_dump($bLgn);	// true로 나오면 정상 접속
	
	// 프로그램 실행
	
	$strExec = '/usr/local/bin/php -m';
	$rStream = ssh2_exec($rCon, $strExec);
	
	stream_set_blocking($rStream, true);	// 스트림을 블럭킹 모드로 변환시킨다. 
	echo fread($rStream, 10240);		// 값을 가져온다. 10240 Byte까지만
?>

위와같은 식으로 사용하면 된다.    



2011/09/07 01:17 2011/09/07 01:17
네임서버에서 서브도메인을 많이 사용할 경우 zone 파일을 따로 생성해서 인쿠루드 해서 사용가능하더군요.

서브도메인의 저장위치가 /var/named/zone/subdomain.zone 에 위치했다고 가정한다면

maindomain.zone
-------------------------------------------------------------------------
$TTL 86400
@ ~~~~~~
.
.
.
~~~
www IN A 123.45.67.89
$include "/var/named/zone/subdomain.zone"

-----------------------------------------------------------------------

subdomain.zone 파일에는
sub1 IN A 123.456.67.98
~~~~

와 같이 입력하면 끝


PS. INCLUDE 앞에 $를 붙여줘야 하는 것을 몰라 한참을 헤매서 저같은 분이 있을까 해서 올립니다.                                       


2011/09/05 03:21 2011/09/05 03:21