학습자료/Java 2015. 7. 22. 10:11

자바에는 기본적으로 ScheduledJob과 Timer 이용하여 간단한 스케줄링이 가능하다.

하지만 30분 마다 0에 , 월요일부터 금요일까지 와 같이 디테일하게 스케줄링은 하기 어렵다.

리눅스에 crontab 이라는 스케줄링 데몬이 있는데 자바에서 그와 같은 동작을 하는 라이브러리를 사용하겠다.


crontab 사용

예)

20  2     *  *  6  명령어 => 매주 토요일 새벽 2:20

0  4-6   *  *  *  명령어 => 매일 오후 4,5,6시

5  */2 *  *  * 명령어 => 매일 2시간간격으로 5분대에

15  1   1  *  *  명령어 => 매월 1일 새벽 1:15

30  0   1  1,7  *  명령어 => 1,7월 1일 새벽 0:30


quartz 라이브러리 다운로드(2.2.1)

http://quartz-scheduler.org/downloads



quartz 크론 표기법

http://quartz-scheduler.org/api/2.2.0/org/quartz/CronExpression.html

Field Name Allowed Values Allowed Special Characters
Seconds 0-59 , - * /
Minutes 0-59 , - * /
Hours 0-23 , - * /
Day-of-month 1-31 , - * ? / L W
Month 1-12 or JAN-DEC , - * /
Day-of-Week 1-7 or SUN-SAT , - * ? / L #
Year (Optional) empty, 1970-2199 , - * /


1.  main class (스케줄러에 job 등록, job에 데이터 바인딩, 스케줄러 주기 세팅)

public class CronTest {

public CronTest() {

try {

ArrayList state = new ArrayList<String>();

//주기적으로 실행시클 job 클래스 등록

//job 클래스는 생성자에 인자가 들어가면 안됨, inner class로 생성하면 안됨.

//job 클래스에 데이터 전송

JobDetail job = JobBuilder.newJob(DumbJob.class)

.withIdentity("testJob")

.usingJobData("jobSays", "Hello World!")

.usingJobData("myFloatValue", 3.141f).build();

job.getJobDataMap().put("state", state);


// 10초마다 계속 돌기 java Timer와 비슷

/*

* Trigger trigger = TriggerBuilder.newTrigger()

* .withSchedule(SimpleScheduleBuilder.simpleSchedule()

* .withIntervalInSeconds(10) .repeatForever()) .build();

*/


// CronTrigger 매 10초마다(10,20,30 ...) 작업 실행

CronTrigger cronTrigger = TriggerBuilder

.newTrigger()

.withIdentity("crontrigger", "crontriggergroup1")

.withSchedule(

CronScheduleBuilder.cronSchedule("*/10 * * * * ?"))

.build();


// schedule the job

SchedulerFactory schFactory = new StdSchedulerFactory();

Scheduler sch = schFactory.getScheduler();

    //스케줄러 시작

sch.start();

sch.scheduleJob(job, cronTrigger);

// 스케줄러 정지 sch.shutdown();


} catch (SchedulerException e) {

e.printStackTrace();

}

}


public static void main(String[] args) {

new CronTest();

}

}



2. job 구현

public class DumbJob implements Job {

    String jobSays;

    float myFloatValue;

    ArrayList state;

      

    public DumbJob() {

    }


//스케줄러에 인해 주기적으로 실행되는 함수.

    public void execute(JobExecutionContext context)

      throws JobExecutionException

    {

      JobKey key = context.getJobDetail().getKey();

      JobDataMap dataMap = context.getMergedJobDataMap(); 


//데이터는 아래 setter에서 저장된다. 혹은 아래와 같이 얻어도 된다.

/*

       String jobSays = dataMap.getString("jobSays");

       float myFloatValue = dataMap.getFloat("myFloatValue");

       ArrayList state = (ArrayList) dataMap.get("myStateData"); 

*/

      state.add(new Date());

      System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue + ", state size:" + state.size() + "," +state.get(state.size()-1));

    }


//아래와 같이 setter 형식으로 값을 받을 수도 있고 혹은, datamap을 통해 얻을 수 있음

    public void setJobSays(String jobSays) {

      this.jobSays = jobSays;

    }

    public void setMyFloatValue(float myFloatValue) {

      this.myFloatValue = myFloatValue;

    }

    public void setState(ArrayList state) {

      this.state = state;

    }}


3. 실행결과

Instance DEFAULT.testJob of DumbJob says: Hello World!, and val is: 3.141, state size:1,Wed Jul 22 10:03:40 KST 2015

Instance DEFAULT.testJob of DumbJob says: Hello World!, and val is: 3.141, state size:2,Wed Jul 22 10:03:50 KST 2015

Instance DEFAULT.testJob of DumbJob says: Hello World!, and val is: 3.141, state size:3,Wed Jul 22 10:04:00 KST 2015


.....





참고

quartz 사이트(tutorials, examples, cookbook)

http://quartz-scheduler.org/documentation/quartz-2.2.x/quick-start


'학습자료 > Java' 카테고리의 다른 글

[java] 자바어플에 webview(javafx) 삽입  (0) 2015.03.16
[java] jTable 실시간 값 변경  (0) 2015.01.08
[java] timetask  (0) 2015.01.08
[java] 파일 실행  (0) 2015.01.08
[java] html 파싱, jsoup 예제  (0) 2015.01.08
posted by cozyboy
:
학습자료/리눅스 2015. 3. 24. 11:43

크론탭이 작동하지 않는 세가지 이유.


1. 잘못된 크론탭 표기법

2. 권한 문제

3. 환경변수


이중 대부분의 문제는 3. 환경변수 문제일듯 하다


환경변수 

SHELL

등록된 프로그램을 실행시킬 쉘프로그램을 지정한다. 정의 하지 않을 경우 /bin/sh이 쉘 프로그램으로 지정된다.

PATH

cron은 별도로 쉘을 띄우귀 때문에, 쉘에서 프로그램을 찾기 위한 PATH도 지정해줄 필요가 있다. 왜냐하면 로그인을 해서 shell을 실행시키지 않으므로, 로그인과정에서의 PATH변수를 사용할 수 없기 때문이다.

MAILTO

cron이 수행한 작업의 결과를 mail로 보낼 수 있다. 위의 경우 root유저에게 메일을 전송한다. 만약 MAILTO를 설정하지 않으면 crontab의 실행유저에게 메일이 전송된다.

HOME

cront의 home 디렉토리(:12)경로를 설정한다. 기본적으로는 crontab의 실행유저의 홈디렉토리로 /etc/passwd에 설정된 경로를 따른다. 


환경변수 등록방법 예

SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ * * * * * env > /tmp/env.output


해결법

예를 들어 파이썬모듈을 동작시키는데 동작하지 않았다.


import sys

print sys.path


구동시키려는 스크립트에서 위의 구문으로 사용자의 모듈경로를 모두 읽어서,

crontab -e 를 실행하여


PATH=  <-- 이곳에 모두 기입하자. 그러니 파이썬 모듈이 크론탭에서 제대로 구동하였다.

HOME= <-- 이곳을 작업path로 설정하지 않을 시, 매우 삽질을 할수 있음. 파일관리를 한다던지..하는


ex)

PATH=/home/min/workspace/test:/usr/lib/python2.7:/usr/lib/python2.7/plat-x86_64-linux-gnu:/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/lib-old:/usr/lib/python2.7/lib-dynload:/usr/local/lib/python2.7/dist-packages;/usr/lib/python2.7/dist-packages;/usr/lib/python2.7/dist-packages/PILcompat;/usr/lib/python2.7/dist-packages/gtk-2.0:/usr/lib/python2.7/dist-packages/ubuntu-sso-client

HOME=/home/min/workspace/test

* * * * * /usr/bin/python /home/min/workpace/test/tt.py



참고.

크론탭이 작동하지 않는 세가지 이유.

http://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work

crontab은 유저의 환경 변수를 가져오지 않는다

http://ohgyun.com/227  

crontab이 작동 안하는 이유는 뭘까

https://kldp.org/node/59859  

파이썬 스크립트 crontab으로 오픈시 모듈 경로 미설정 문제 해결하기.

http://makekr.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-crontab%EC%9C%BC%EB%A1%9C-%EC%98%A4%ED%94%88%EC%8B%9C-%EB%AA%A8%EB%93%88-%EA%B2%BD%EB%A1%9C-%EB%AF%B8%EC%84%A4%EC%A0%95-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0






posted by cozyboy
:
학습자료/Java 2015. 3. 16. 10:27



import java.awt.Dimension;
import java.awt.Point;

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class JavaFX {

    /* Create a JFrame with a JButton and a JFXPanel containing the WebView. */
    private static void initAndShowGUI() {
        // This method is invoked on Swing thread
        JFrame frame = new JFrame("FX");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().setLayout(null); // do the layout manually

        final JButton jButton = new JButton("Button");
        final JFXPanel fxPanel = new JFXPanel();

        frame.add(jButton);
        frame.add(fxPanel);
        frame.setVisible(true);

        jButton.setSize(new Dimension(200, 27));
        fxPanel.setSize(new Dimension(300, 300));
        fxPanel.setLocation(new Point(0, 27));

        frame.getContentPane().setPreferredSize(new Dimension(300, 327));
        frame.pack();
        frame.setResizable(false);

        Platform.runLater(new Runnable() { // this will run initFX as JavaFX-Thread
            @Override
            public void run() {
                initFX(fxPanel);
            }
        });
    }

    /* Creates a WebView and fires up google.com */
    private static void initFX(final JFXPanel fxPanel) {
        Group group = new Group();
        Scene scene = new Scene(group);
        fxPanel.setScene(scene);

        WebView webView = new WebView();

        group.getChildren().add(webView);
        webView.setMinSize(300, 300);
        webView.setMaxSize(300, 300);

            // Obtain the webEngine to navigate
        WebEngine webEngine = webView.getEngine();
        webEngine.load("http://www.google.com/");
    }

    /* Start application */
    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                initAndShowGUI();
            }
        });
    }
}

펌 : http://stackoverflow.com/questions/8374365/integrating-javafx-2-0-webview-into-a-swing-java-se-6-application



javafx 란 및 간단 강좌?? : http://btsweet.blogspot.kr/2014/03/javafx.html


javafx doc : 

http://www.oracle.com/technetwork/java/javase/documentation/javafx-docs-2159875.html

http://docs.oracle.com/javase/8/javase-clienttechnologies.htm


'학습자료 > Java' 카테고리의 다른 글

[java] 스케줄링 like cron(quartz Scheduler)  (1) 2015.07.22
[java] jTable 실시간 값 변경  (0) 2015.01.08
[java] timetask  (0) 2015.01.08
[java] 파일 실행  (0) 2015.01.08
[java] html 파싱, jsoup 예제  (0) 2015.01.08
posted by cozyboy
:
학습자료/tools 2015. 2. 3. 13:44

https://browserling.com/#

'학습자료 > tools' 카테고리의 다른 글

CTDB(cifs/nfs/iSCSI/ftp with ceph) 구성 - 문서 첨부  (0) 2014.06.30
linux cron 사용법  (0) 2014.02.11
xming 사용(putty gui)  (0) 2014.02.03
xshell 파일전송  (0) 2013.12.23
이클립스 단축키  (0) 2013.09.25
posted by cozyboy
:
학습자료/Java 2015. 1. 8. 21:37

동작 (붉은색 글 표기)

1. 초기 더미데이터 2줄 테이블 생성

2. 시작 버튼을 누를시 timertask를 이용하여 주기적으로 테이블 값 변경

3. 정지 버튼 누를시 taimertask를 정지하여 테이블 값 변경을 취소


GUI 다루는건 항상 맘처럼 안되네요....


package test;


import java.awt.BorderLayout;

import java.awt.EventQueue;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.Date;

import java.util.Timer;

import java.util.TimerTask;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.ListSelectionModel;

import javax.swing.table.DefaultTableModel;


public class TablePrint3 {


private JFrame frame;

private JTable table;

private JButton button;

private JButton button2;


ScheduledJob job;

Timer jobScheduler;

Integer a = 1;


public TablePrint3() {

initialize();

}


public static void main(String args[]) {

EventQueue.invokeLater(new Runnable() {


@Override

public void run() {

// TODO Auto-generated method stub

try {

TablePrint3 window = new TablePrint3();

window.frame.setVisible(true);

} catch (Exception e) {

e.printStackTrace();

}


}

});

}


private void initialize() {

Object headers[] = { "aaa", "aaaa", "제목", "aa위" };

Object[][] rows = { { "one", "1", "3", "4" }, { "one", "1", "3", "4" } };

frame = new JFrame("Table Printing");

table = new JTable(rows, headers);

// 초기 더미 테이블 값 설정


frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);



JScrollPane scrollPane = new JScrollPane(table);

frame.getContentPane().add(scrollPane, BorderLayout.CENTER);

button = new JButton("정지");

button2 = new JButton("시작");


ActionListener startTask = new ActionListener() {

public void actionPerformed(ActionEvent e) {

if( jobScheduler != null){ 

job = new ScheduledJob();

jobScheduler = new Timer();

jobScheduler.scheduleAtFixedRate(job, 1000, 3000);

}

}

};   //Time Task 시작

ActionListener openConfig = new ActionListener() {


@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub


jobScheduler.cancel();

//timetask 정지

jobScheduler = null;

Runtime rt = Runtime.getRuntime();

String exeFile = "C://Windows//System32//notepad.exe C://chc_conf.txt";

Process p;


try {

p = rt.exec(exeFile);

p.waitFor();

} catch (Exception ee) {

ee.printStackTrace();

}

}

};


button.addActionListener(openConfig);

button2.addActionListener(startTask);


frame.getContentPane().add(button, BorderLayout.SOUTH);

frame.getContentPane().add(button2, BorderLayout.NORTH);

frame.setSize(490, 592);

frame.setVisible(true);


}


class ScheduledJob extends TimerTask {


public void run() {

a++;

table.setValueAt(a, 1, 2);

//2째줄 3번째 칼럼의 수를 하나씩 올리는 부분

}

}


}



'학습자료 > Java' 카테고리의 다른 글

[java] 스케줄링 like cron(quartz Scheduler)  (1) 2015.07.22
[java] 자바어플에 webview(javafx) 삽입  (0) 2015.03.16
[java] timetask  (0) 2015.01.08
[java] 파일 실행  (0) 2015.01.08
[java] html 파싱, jsoup 예제  (0) 2015.01.08
posted by cozyboy
:
학습자료/Java 2015. 1. 8. 20:23

import java.util.Timer;
import java.util.TimerTask;
import java.util.Date;

public class PrintTimer {
   
   public static void main(String[] args) {
      ScheduledJob job = new ScheduledJob();
      Timer jobScheduler = new Timer();
      jobScheduler.scheduleAtFixedRate(job, 1000, 3000);
      try {
         Thread.sleep(20000);
      } catch(InterruptedException ex) {
         //
      }
      jobScheduler.cancel();
   }
}

class ScheduledJob extends TimerTask {
   
   public void run() {
      System.out.println(new Date());
   }
}

PrintTimer는 main() 메소드에서 Timer 객체를 생성한 후, scheduleAtFixedRate() 메소드를 사용하여 1초 후부터 3초 간격으로 ScheduledJob 클래스의 run() 메소드를 실행한다. PrintTimer 클래스를 실행해보면 다음과 같은 결과가 출력될 것이다.



펌 : http://javacan.tistory.com/28

'학습자료 > Java' 카테고리의 다른 글

[java] 자바어플에 webview(javafx) 삽입  (0) 2015.03.16
[java] jTable 실시간 값 변경  (0) 2015.01.08
[java] 파일 실행  (0) 2015.01.08
[java] html 파싱, jsoup 예제  (0) 2015.01.08
[java] proxy setting  (0) 2014.04.05
posted by cozyboy
:
학습자료/Java 2015. 1. 8. 17:39


button2를 눌렀을때 chc_conf.txt 이란 메모장을 열기


ActionListener openConfig = new ActionListener() {


@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

Runtime rt = Runtime.getRuntime();

String exeFile = "C://Windows//System32//notepad.exe C://chc_conf.txt";

Process p;


try {

p = rt.exec(exeFile);

p.waitFor();

} catch (Exception ee) {

ee.printStackTrace();

}

}

};


button2.addActionListener(printAction);


'학습자료 > Java' 카테고리의 다른 글

[java] jTable 실시간 값 변경  (0) 2015.01.08
[java] timetask  (0) 2015.01.08
[java] html 파싱, jsoup 예제  (0) 2015.01.08
[java] proxy setting  (0) 2014.04.05
Installing software' has encountered a problem. 이클립스 문제  (0) 2013.05.23
posted by cozyboy
:
학습자료/Java 2015. 1. 8. 12:40

1. jsoup 라이브러리 다운

http://jsoup.org/download


2. 샘플 코드 (args = http://www.google.co.kr)

package org.jsoup.examples;

import org.jsoup.Jsoup;
import org.jsoup.helper.Validate;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;

/**
 * Example program to list links from a URL.
 */

public class ListLinks {
   
public static void main(String[] args) throws IOException {
       
Validate.isTrue(args.length == 1, "usage: supply url to fetch");
       
String url = args[0];
       
print("Fetching %s...", url);

       
Document doc = Jsoup.connect(url).get();
       
Elements links = doc.select("a[href]");
       
Elements media = doc.select("[src]");
       
Elements imports = doc.select("link[href]");

       
print("\nMedia: (%d)", media.size());
       
for (Element src : media) {
           
if (src.tagName().equals("img"))
               
print(" * %s: <%s> %sx%s (%s)",
                        src
.tagName(), src.attr("abs:src"), src.attr("width"), src.attr("height"),
                        trim
(src.attr("alt"), 20));
           
else
               
print(" * %s: <%s>", src.tagName(), src.attr("abs:src"));
       
}

       
print("\nImports: (%d)", imports.size());
       
for (Element link : imports) {
           
print(" * %s <%s> (%s)", link.tagName(),link.attr("abs:href"), link.attr("rel"));
       
}

       
print("\nLinks: (%d)", links.size());
       
for (Element link : links) {
           
print(" * a: <%s>  (%s)", link.attr("abs:href"), trim(link.text(), 35));
       
}
   
}

   
private static void print(String msg, Object... args) {
       
System.out.println(String.format(msg, args));
   
}

   
private static String trim(String s, int width) {
       
if (s.length() > width)
           
return s.substring(0, width-1) + ".";
       
else
           
return s;
   
}

}


3. 결과

Fetching http://www.google.com...


Media: (2)

 * img: <http://www.google.co.kr/images/icons/product/chrome-48.png> x ()

 * img: <http://www.google.co.kr/textinputassistant/tia.png> 27x23 ()


Imports: (0)


Links: (21)

 * a: <http://www.google.co.kr/imghp?hl=ko&tab=wi>  (이미지)

 * a: <http://maps.google.co.kr/maps?hl=ko&tab=wl>  (지도)

 * a: <https://play.google.com/?hl=ko&tab=w8>  (Play)

 * a: <http://www.youtube.com/?gl=KR&tab=w1>  (YouTube)

 * a: <http://news.google.co.kr/nwshp?hl=ko&tab=wn>  (뉴스)

 * a: <https://mail.google.com/mail/?tab=wm>  (Gmail)

 * a: <https://drive.google.com/?tab=wo>  (드라이브)

 * a: <http://www.google.co.kr/intl/ko/options/>  (더보기 »)

 * a: <http://www.google.co.kr/history/optout?hl=ko>  (웹 기록)

 * a: <http://www.google.co.kr/preferences?hl=ko>  (설정)

 * a: <https://accounts.google.com/ServiceLogin?hl=ko&continue=http://www.google.co.kr/%3Fgfe_rd%3Dcr%26ei%3DtvutVPb5NsG6kAXVy4CwDA>  (로그인)

 * a: <http://www.google.co.kr/chrome/index.html?hl=ko&brand=CHNG&utm_source=ko-hpp&utm_medium=hpp&utm_campaign=ko>  (Chrome 다운로드)

 * a: <http://www.google.co.kr/advanced_search?hl=ko&authuser=0>  (고급검색)

 * a: <http://www.google.co.kr/language_tools?hl=ko&authuser=0>  (언어도구)

 * a: <http://www.google.co.kr/intl/ko/ads/>  (광고 프로그램)

 * a: <http://www.google.co.kr/intl/ko/services/>  (비즈니스 솔루션)

 * a: <https://plus.google.com/102197601262446632410>  (+Google)

 * a: <http://www.google.co.kr/intl/ko/about.html>  (Google 정보)

 * a: <http://www.google.co.kr/setprefdomain?prefdom=US&sig=0_zqOlB8Ip0P4chzkeavWzxYifIMQ%3D>  (Google.com)

 * a: <http://www.google.co.kr/intl/ko/policies/privacy/>  (개인정보 보호)

 * a: <http://www.google.co.kr/intl/ko/policies/terms/>  (약관)



4. jsoup api document

http://jsoup.org/apidocs/


5. cookbook

http://jsoup.org/cookbook/

'학습자료 > Java' 카테고리의 다른 글

[java] timetask  (0) 2015.01.08
[java] 파일 실행  (0) 2015.01.08
[java] proxy setting  (0) 2014.04.05
Installing software' has encountered a problem. 이클립스 문제  (0) 2013.05.23
[java] java.library.path - linux, eclipse  (0) 2013.03.19
posted by cozyboy
:
학습자료/이론 2014. 11. 25. 15:03

웹(WWW)이 대중화되고 많은 프로그램들이 웹으로 넘어오면서 웹 보안의 중요성은 날이 갈수록 강조되고 있습니다. 웹은 타 인터넷 네트워크 프로토콜에 비해 상대적으로 안전하다고 인식되기 때문에 일반적으로 서비스 포트(80)가 열려있으며 다양한 웹 어플리케이션이 동작하고 서비스됩니다. 그러다보니 웹을 통한 네트워크 취약점 또한 많이 연구되고 있으며, 악의적인 목적을 가진 임의의 공격자 역시 예전의 다양한 네트워크 프로토콜에 관련된 것보다는 직접 웹 어플리케이션의 취약점을 노리는 경우가 많습니다. 

따라서, 웹어플리케이션을 구현할 때는 보안에 보다 더 주의해야 합니다. 국제 웹 보안 표준기구인 OWASP에서는 주기적으로 보안 10대 취약점을 발표하는데, 이 내용을 기준으로 자신의 웹 어플리케이션에 취약점이 없는가 점검하는 일은 매우 중요합니다.

OWASP 2007 Top 10 에 의하면 다양한 취약점들이 보고되고 있는데(조만간 2010년 Top 10이 발표될 듯 합니다), 그 가운데 매우 중요한 보안요소임에도 불구하고 많은 부분 신경쓰고 있지 못하는 취약점이 바로 CSRF 취약점입니다. 

CSRF(Cross-site Request Forgery, 크로스사이트 요청 위조) 공격은 원클릭 공격, 사이드 재킹, 세션 라이딩 등으로도 알려져 있고, 약어로는 XSRF로도 알려져 있습니다. 이 공격은 사이트가 신뢰하는 사용자를 통해 공격자가 원하는 명령을 사이트로 전송하는 기법을 사용합니다. 공격이 사용자를 통해 이루어지기 때문에 공격자의 IP는 추적 불가능한 특성이 있습니다. 

은행사이트를 예를 들자면, 공격자 A는 피해자 B가 접속하는 은행 사이트에 조작된 이미지 태그를 게시판에 남깁니다.

<img src="http://bank.example.com/withdraw?account=B&amount=100000&for=A" />

피해자 B 가 은행사이트에 접속하고 로그인하면 세션 정보가 남아있는 상태이고 이때 공격자 A가 게시판에 남겨놓은 글을 B 가 읽게 되면 해당 링크가 요청되면서 공격이 실행됩니다. 원래는 이미지를 불러오기 위해 지정된 이미지 링크롤 GET 메쏘드로 요청하게 되는데, 피해자 B가 인증되어 있는 상태인점을 이용하여 이렇게 우회공격을 할 수 있게 된 것입니다. 특히 대부분의 게시판들이 자바스크립트는 막아놓지만, 이미지 포스팅은 막지 않는 것도 공격에 유리한 상황을 만들어줍니다. 

최근에 발생했던 옥션의 1800만명 개인 정보 유출 사고는 CSRF 공격을 당한 것으로 밝혀졌다고 합니다. 중국 해커는 직접 서버를 공격하는 대신, 옥션 운영진을 대상으로 악성 코드를 첨부한 메일을 대량으로 유포했습니다. 운영자가 메일을 확인한 순간 ID를 얻을 수 있었고, 해커는 이 ID를 이용하여 옥션 서버에 로그인할 수 있었다고 합니다. (용어사전 CSRF의 내용을 일부 인용했습니다.)

이러한 취약점을 막는 가장 기본적인 방법은 서버의 상태를 변경하는 요청에 대해 GET 을 쓰지 않는 것입니다. 하지만 만일의 경우 공격자가 스크립트를 이용하여 POST로 보낼 수 도 있으므로 POST 메쏘드인 경우에도 대비를 해야합니다. 따라서 가장 일반적인 해결 방법은,
 1. 서버의 상태를 변경하는 요청은 GET 을 쓰지 않고,
 2. POST 의 경우에도 hidden 필드에 임의의 키값을 전달하고 그 키값이 맞는가를 매번 확인하는 것입니다.

하지만, 실제 보통의 웹 어플리케이션은 2번의 방비가 되어있지 않습니다. 이는 불특정 사용자가 서버의 상태를 임의로 변경할 수 있는 약점을 가지고 있게 합니다. 

장고(Django)에서는 1.2 버전부터 이러한 CSRF 취약점을 막는 기능을 기본으로 제공합니다. 모든 POST 방식의 폼 전송에는 hidden 필드로 세션에 따른 임의 키값을 전송하며, 해당 키 값이 유효한지를 매번 확인합니다.

이를 위해서는
 1. 설정파일(settings.py)에 미들웨어에 django.middleware.csrf.CsrfViewMiddleware를 추가하고,
 2. POST 가 사용된 폼 템플릿에 {% csrf_token %} 을 직접 삽입해야 합니다. 

<form action="" method="post">{% csrf_token %}

만일 미들웨어를 쓸 수 없는 경우라면, django.views.decorators.csrf 의 csrf_protect 장식자(decorator)를 쓸 수 도 있습니다.

from django.views.decorators.csrf import csrf_protect
from django.template import RequestContext

@csrf_protect
def my_view(request):
    c = {}
    # ...
    return render_to_response("a_template.html", c,
                               context_instance=RequestContext(request))

특정 뷰에 대해 csrf를 적용하고 싶지 않다면 csrf_exampt 장식자를 사용합니다.

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')

장고 뿐 아니라 최신의 웹 프레임워크 (Ruby on rails, Spring 등)은 모두 CSRF를 위한 별도의 방어 방법들을 제공합니다. 하지만 장고는 별도의 설정없이도 CSRF 대응이 가능하도록 구현되어 웹 초보개발자도 취약점이 존재하는 사이트를 만들 수 있는 여지를 사전에 차단한다는 점이 특징이라고 할 수 있습니다. 

인실리코젠 KM팀에서 구현하는 대부분의 웹 어플리케이션은 최신 버전의 장고를 사용하고 있으며, 중요한 보안위험요소들을 주기적으로 검토하고 있습니다.


펌 : http://www.insilicogen.com/blog/55

'학습자료 > 이론' 카테고리의 다른 글

씬프로비저닝  (0) 2013.11.14
posted by cozyboy
:
학습자료/리눅스 2014. 11. 18. 16:42

apt-get install terminator

 


ctrl + shift + e 세로분할
ctrl + shift + o 가로분할
ctrl + shift + w 닫기
ctrl + shift + q 종료


posted by cozyboy
:
학습자료/tools 2014. 6. 30. 18:06

CTDB.docx

요약 : 클러스터 게이트 웨이. arp를 이용하여 fail over/fail back 수행을 한다. 



목차

환경   4

네트워크 설정   5

  Udev rule 변경, 적용... 5

  인터페이스(private, public) 설정... 5

스토리지 준비   7


  Ceph Fs 마운트

  Block Device 생성/맵핑... 7

설치   8

  ctdb. 8

  SAMBA.. 8

  NFS. 8

    서버... 8

    클라이언트... 8

  Iscsi 8

    서버

    클라이언트... 9

vsftpd. 9

설정   10

  ctdb. 10

  upstart 설정... 12

  onnode 스크립트 변경 (sudo 추가) 13

  samba. 13

  nfs-kernerl-server 14

  iSCSI 16

  Vsftpd. 17

서비스 점검   18

  ceph. 18

    마운트 포인트 확인... 18

    initctl 확인... 18

    ceph 상태 확인... 18

    로그 위치... 19

  CTDB. 19

    ping 확인... 19

    ctdb 상태 확인... 19

    ctdb 서비스 처리 노드 확인... 19

    Log 위치... 20

  SAMBA.. 20

    설정 체크... 20

  NFS. 22

    rpcinfo 체크(리모트 nfs 서버) 22

    리모트 nfs 서버의 서비스 체크... 23

    rcpbind 체크... 23

  iSCSI 24

    rbd 지원 확인... 24

    target 체크... 24

    bind 체크... 26

    Remote iSCSI 타겟 찾기... 26

체크 리스트   27

참고사이트   29

  ctdb. 29

  samba. 29

  nfs. 29

  Stgt 30

 

 

 

 

 

 

 

 

 


 

 

OS : Ubuntu 14.04 LTS

Kernel : Linux version 3.14.0

smbd : Version 4.1.6-Ubuntu

 


 

 

 

$ sudo vim /etc/udev/rules.d/70-persistent-net.rules

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1b:21:d7:73:19", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="p1p2"

 

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1b:21:d7:73:19", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="eth2"

 

$ sudo vim /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="biosdevname=0"

 

$sudo update-grub

$ sudo reboot

 

udev rule을 변경하지 않으면, interface를 인식하지 못한다.

 

$ sudo vim /etc/network/interface

auto lo

iface lo inet loopback

 

 

auto eth0                    # private network

iface eth0 inet static

address 11.0.0.11

netmask 255.255.255.0

 

auto p1p1                   

iface p1p1 inet static

address 192.168.3.11

netmask 255.255.252.0

gateway 192.168.0.1

dns-nameserver 8.8.8.8

 

auto eth2                     # public network

iface eth2 inet manual

 

 


 

<!--[if !supportLists]-->1.     <!--[endif]-->CephFS 마운트

$ sudo mount -t ceph 192.168.2.18:6789:/ /mnt/storage/ -o name=admin,secretfile=/etc/ceph/ceph.client.admin.keyfile

<!--[if !supportLists]-->2.     <!--[endif]-->Fstab 등록

$ sudo vim /etc/fstab

192.168.2.18:6789:/          /mnt/storage     ceph           name=admin,secretfile=/etc/ceph/ceph.client.admin.keyfile,noatime       0       2

 

<!--[if !supportLists]-->1.     <!--[endif]-->블럭 생성

$ sudo rbd create block1 --size 1024

Rbd를 지원하는 stgt를 사용한다면 블록 생성만 해도 된다

 

<!--[if !supportLists]-->2.     <!--[endif]-->블럭 매핑

$ sudo rbd map block1

 

<!--[if !supportLists]-->3.     <!--[endif]-->블럭 매핑 유지

$ sudo vim /etc/ceph/rbdmap

rbd/block1      id=admin,keyring=/etc/ceph/ceph.client.admin.keyring

 

 

$ sudo apt-get install ctdb libctdb-dev

 

$ sudo apt-get install samba samba-common samba-dev

 

서버

$ sudo apt-get install nfs-common nfs-kernel-server rpcbind quota

클라이언트

$ sudo apt-get install nfs-common

 

서버

$ sudo apt-get install tgt

 

클라이언트

$ sudo apt-get install open-iscsi

 

$ sudo apt-get install vsftpd


 

 

ctdb

Ctdb 설정

sudo vim /etc/default/ctdb

 

CTDB_RECOVERY_LOCK=/mnt/storage/ctdb/.ctdb.lock

CTDB_NODES=/etc/ctdb/nodes  

CTDB_PUBLIC_ADDRESSES=/etc/ctdb/public_addresses

CTDB_MANAGES_SAMBA=yes

CTDB_MANAGES_NFS=yes

CTDB_MANAGES_ISCSI=yes

CTDB_MANAGES_VSFTPD=yes

CTDB_DEBUGLEVEL=NOTICE

 

CTDB_SOCKET=/var/lib/run/ctdb/ctdbd.socket

CTDB_INIT_STYLE=debian

CTDB_DBDIR=/var/ctdb

CTDB_DBDIR_PERSISTENT=/var/ctdb/persistent

 

sudo mkdir /var/lib/run/ctdb/ -p

sudo ln -s /usr/sbin/service /sbin/service

sudo mkdir /mnt/storage/ctdb

 

Ctdb 네트워크 설정

<!--[if !supportLists]-->1.     <!--[endif]-->Private 주소

sudo vim /etc/ctdb/nodes

11.0.0.11

11.0.0.12

11.0.0.13

 

<!--[if !supportLists]-->2.     <!--[endif]-->Public 주소

sudo vim /etc/ctdb/public_addresses

12.0.0.11/24 eth2

12.0.0.12/24 eth2

12.0.0.13/24 eth2

 

samba 이벤트 스크립트 수정

sudo vim /etc/ctdb/events.d/50.samba  수정

debian)

                CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-samba}

                CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-""}

 

debian)

                CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smbd}

                CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-nmbd}

 

nfs 이벤트 스크립트 수정

$ sudo vim /etc/ctdb/functions  (730 라인정도의 startstop_nfs()에 삽입)

.........

unknown)

                case $1 in

                start)

                        service nfs-kernel-server start

                        ;;

                stop)

                        service nfs-kernel-server stop

                        ;;

                restart)

                        set_proc "fs/nfsd/threads" 0

                        service nfs-kernel-server stop > /dev/null 2>$1

                        pkill -9 nfsd

                        nfs_dump_some_threads

                        service nfs-kernel-server start

                        ;;

                esac

                ;;

        *)

                exit 1

                ;;

        esac

........

 

functions이 아닌 이벤트 스크립트로 수정해도 되는지 확인 하자. Restart는 불안한 것 같음(테스트 1번밖에 안해봄)

 

iSCSI 이벤트 스크립트 수정

$ sudo vim /etc/ctdb/events.d/70.iscsi

………..

# start the iscsi daemon

        tgtd >/dev/null 2>/dev/null

        tgt-admin –e              #재 시작할 때 타겟 정보가 항상 사라져서 삽입

………..

 

upstart 설정

<!--[if !supportLists]-->l  <!--[endif]-->만약 disable이 실패하면 sudo update-rc.d {service name} defaults을 먼저 해준다.

sudo update-rc.d ctdb enable

sudo update-rc.d {smbd | nmbd | nfsd rpcbind | tgt} disable

sudo sh -c "echo 'manual' > /etc/init/{ smbd | nmbd | nfs-kernel-server rpcbind | tgt}.override"

ctdb가 실행되기 전에 위의 서비스들이 미리 실행되고 있으면 ctdb 상태가 불안정 할 수 있다.

 

onnode 스크립트 변경 (sudo 추가)

$ sudo vim /usr/bin/onnode

for n in $nodes ; do

    set -o pipefail 2>/dev/null

    if $parallel ; then

        { exec 3>&1 ; { $SSH $ssh_opts $EXTRA_SSH_OPTS $n "sudo $command" | stdout_filter >&3 ; } 2>&1 | stderr_filter ; } &

        pids="${pids} $!"

    else

        if $verbose ; then

            echo >&2 ; echo ">> NODE: $n <<" >&2

        fi 

 

        { exec 3>&1 ; { $SSH $ssh_opts $EXTRA_SSH_OPTS $n "sudo $command" | stdout_filter >&3 ; } 2>&1 | stderr_filter ; }

        [ $? = 0 ] || retcode=$?

    fi 

done

Root 사용자 생성하지 않고 하려면 위와 같이 변경.

 

samba

smb 설정

$ sudo vim /etc/samba/smb.conf    (global 섹션 삽입, anycloud 섹션 생성)

[global]

clustering = yes

   idmap backend = tdb2

   cluster addresses = 12.0.0.11 12.0.0.12 12.0.0.13

   ctdbd socket = /var/lib/run/ctdb/ctdbd.socket

   private dir = /mnt/storage/ctdb

   security = user

   groupdb:backend = tdb

   smb passwd file = /etc/samba/smbpasswd

 

 

[anycloud]

path = /mnt/storage

browseable=yes

public=no

writeable=yes

 

nfs-kernerl-server

export 설정

$ sudo vim /etc/export

/mnt/storage *(rw,fsid=1235,subtree_check,no_root_squash)

 

nfs-kernel-server 설정

$ sudo vim /etc/default/nfs-kernel-server

 

 

Nfs port 설정

 

$ sudo vim /etc/default/nfs-kernel-server

RPCMOUNTDOPTS="-p 597"

 

$ sudo vim /etc/services

status          595/tcp

status          595/udp

rquotad         598/tcp

rqoutad         598/udp

 

$ sudo vim /etc/modprobe.d/options.conf

options lockd nlm_udpport=599 nlm_tcpport=599

 

$ sudo vim /etc/modules

lockd

 

$ sudo reboot

$ rpcinfo –p

storage@s1:~$ rpcinfo -p

   program vers proto   port  service

    100000    4   tcp    111  portmapper

    100000    3   tcp    111  portmapper

    100000    2   tcp    111  portmapper

    100000    4   udp    111  portmapper

    100000    3   udp    111  portmapper

    100000    2   udp    111  portmapper

    100024    1   udp    595  status

    100024    1   tcp    595  status

    100011    1   udp    895  rquotad

    100011    2   udp    895  rquotad

    100011    1   tcp    598  rquotad

    100011    2   tcp    598  rquotad

    100003    2   tcp   2049  nfs

    100003    3   tcp   2049  nfs

    100003    4   tcp   2049  nfs

    100227    2   tcp   2049

    100227    3   tcp   2049

    100003    2   udp   2049  nfs

    100003    3   udp   2049  nfs

    100003    4   udp   2049  nfs

    100227    2   udp   2049

    100227    3   udp   2049

    100021    1   udp    599  nlockmgr

    100021    3   udp    599  nlockmgr

    100021    4   udp    599  nlockmgr

    100021    1   tcp    599  nlockmgr

    100021    3   tcp    599  nlockmgr

    100021    4   tcp    599  nlockmgr

    100005    1   udp    597  mountd

    100005    1   tcp    597  mountd

    100005    2   udp    597  mountd

    100005    2   tcp    597  mountd

    100005    3   udp    597  mountd

    100005    3   tcp    597  mountd

 

iSCSI

타겟 설정

$ sudo vim /etc/tgt/targets.conf

include /etc/tgt/conf.d/*.conf

default-driver iscsi

<target iqn.2014.6.anycloud:iscsi.target.storage1.block1>

 backing-store  /dev/rbd/rbd/block1

</target>

 

타겟 설정(with rbd)

$ sudo vim /etc/tgt/targets.conf

include /etc/tgt/conf.d/*.conf

<target iqn.2014-06.anycloud:rbd>

    driver iscsi

    bs-type rbd

    backing-store rbd/block1   #pool_name/image_name  

</target>

 

타겟 커맨드 설정(수동)

$ sudo tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2014.6.anycloud:iscsi.target.storage1.block1

$ sudo tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/rbd/rbd/block1

$ sudo tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL

 

 

$ adduser ftp1

$ sudo usermod -d /mnt/storage ftp1   (각 게이트웨이 노드에 ftp 유저 생성 후 사용)

 

Active directory 연동은 추후 update


 

 

ceph

마운트 포인트 확인

$ mount

……………

192.168.2.18:6789:/ on /mnt/storage type ceph (name=admin,key=client.admin)

 

initctl 확인

initctl list | grep ceph

ceph-mds-all start/running

ceph-osd-all start/running

ceph-mds-all-starter stop/waiting

ceph-osd-all-starter stop/waiting

ceph-all start/running

ceph-mon-all start/running

ceph-mon-all-starter stop/waiting

ceph-mon (ceph/s1) start/running, process 1188      

ceph-create-keys stop/waiting

ceph-osd stop/waiting

ceph-mds (ceph/s1) start/running, process 27502

 

ceph 상태 확인

$ ceph health

HEALTH_OK

로그 위치

/var/log/ceph/

 

 

ping 확인

$ sudo ctdb ping –n all

response from 0 time=0.000826 sec  (1 clients)

response from 1 time=0.000318 sec  (2 clients)

response from 2 time= 0.000092sec  (2 clients)

 

ctdb 상태 확인

$ sudo ctdb status

Number of nodes:3

pnn:0 11.0.0.11     OK (THIS NODE)

pnn:1 11.0.0.12     OK

pnn:1 11.0.0.13     OK

Generation:619257139

Size:3

hash:0 lmaster:0

hash:1 lmaster:1

hash:2 lmaster:2

Recovery mode:NORMAL (0)

Recovery master:1

 

ctdb 서비스 처리 노드 확인

$ sudo ctdb ip

Public IPs on node 0

12.0.0.11 0

12.0.0.12 1

12.0.0.13 2

 

12.0.0.12가 꺼졌을 때 )

Public IPs on node 0

12.0.0.11 0

12.0.0.12 0

12.0.0.13 2

12.0.0.11 (서비스가 가능한 다른 노드)에서 12.0.0.12 대신 서비스 중이란 것을 확인 할 수 있다

 

Log 위치

/var/log/ctdb/

 

 

설정 체크

$ testparm

Load smb config files from /etc/samba/smb.conf

rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)

WARNING: The "idmap backend" option is deprecated

Processing section "[printers]"

Processing section "[print$]"

Processing section "[anycloud]"

Loaded services file OK.

Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

 

[global]

           server string = %h server (Samba, Ubuntu)

           server role = standalone server

           map to guest = Bad User

           obey pam restrictions = Yes

           private dir = /mnt/storage/ctdb

           pam password change = Yes

           passwd program = /usr/bin/passwd %u

           passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .

           unix password sync = Yes

           syslog = 0

           log file = /var/log/samba/log.%m

           max log size = 1000

           ctdbd socket = /var/lib/run/ctdb/ctdbd.socket

           cluster addresses = 12.0.0.11, 12.0.0.12, 12.0.0.13

           clustering = Yes

           dns proxy = No

           usershare allow guests = Yes

           panic action = /usr/share/samba/panic-action %d

           groupdb:backend = tdb

           idmap config * : backend = tdb2

 

[printers]

           comment = All Printers

           path = /var/spool/samba

           create mask = 0700

           printable = Yes

           print ok = Yes

           browseable = No

 

[print$]

           comment = Printer Drivers

           path = /var/lib/samba/printers

 

[anycloud]

           path = /mnt/storage

           read only = No

ctdb를 위해 Smb 설정에 추가한 부분이 존재하는지 확인

 

 

 

rpcinfo 체크(리모트 nfs 서버)

$ rpcinfo -s anycloud-ds-1

program version(s) netid(s)                            service     owner

    100000  2,3,4     local,udp,tcp,udp6,tcp6          portmapper  superuser

    100024  1         tcp6,udp6,tcp,udp                status      105

    100011  2,1       tcp,udp                          rquotad     superuser

    100003  4,3,2     udp6,tcp6,udp,tcp                nfs         superuser

    100227  3,2       udp6,tcp6,udp,tcp                -           superuser

    100021  4,3,1     tcp6,udp6,tcp,udp                nlockmgr    superuser

    100005  3,2,1     tcp6,udp6,tcp,udp                mountd      superuser

 

$ rpcinfo –p anycloud-ds-2

program vers proto   port  service

    100000    4   tcp    111  portmapper

    100000    3   tcp    111  portmapper

    100000    2   tcp    111  portmapper

    100000    4   udp    111  portmapper

    100000    3   udp    111  portmapper

    100000    2   udp    111  portmapper

    100024    1   udp    595  status

    100024    1   tcp    595  status

    100011    1   udp    895  rquotad

    100011    2   udp    895  rquotad

    100011    1   tcp    598  rquotad

    100011    2   tcp    598  rquotad

    100003    2   tcp   2049  nfs

    100003    3   tcp   2049  nfs

    100003    4   tcp   2049  nfs

    100227    2   tcp   2049

    100227    3   tcp   2049

    100003    2   udp   2049  nfs

    100003    3   udp   2049  nfs

    100003    4   udp   2049  nfs

    100227    2   udp   2049

    100227    3   udp   2049

    100021    1   udp    599  nlockmgr

    100021    3   udp    599  nlockmgr

    100021    4   udp    599  nlockmgr

    100021    1   tcp    599  nlockmgr

    100021    3   tcp    599  nlockmgr

    100021    4   tcp    599  nlockmgr

    100005    1   udp    597  mountd

    100005    1   tcp    597  mountd

    100005    2   udp    597  mountd

    100005    2   tcp    597  mountd

    100005    3   udp    597  mountd

    100005    3   tcp    597  mountd

 

리모트 nfs 서버의 서비스 체크

$ showmount -e anycloud-ds-1

Export list for anycloud-ds-1:

/mnt/storage          *

 

rcpbind 체크

$ ps -ef |grep rpcbind

root       569     1  0 09:33 ?        00:00:00 rpcbind

storage  29825  1404  0 17:02 pts/0    00:00:00 grep --color=auto rpcbind

 

 

rbd 지원 확인

$ sudo tgtadm --lld iscsi --mode system --op show

System:

    State: ready

    debug: off

LLDs:

    iscsi: ready

Backing stores:

    rbd (bsoflags sync:direct)

    sheepdog

    bsg

    sg

    null

    ssc

    rdwr (bsoflags sync:direct)

Device types:

    disk

    cd/dvd

    osd

    controller

    changer

    tape

    passthrough

iSNS:

    iSNS=Off

    iSNSServerIP=

    iSNSServerPort=3205

    iSNSAccessControl=Off

 

 

target 체크

$ sudo tgt-admin –s  (or tgtadm --lld iscsi --mode target --op show)

Target 1: iqn.2014.6.anycloud:iscsi.target.storage1.block1

    System information:

        Driver: iscsi

        State: ready

    I_T nexus information:

    LUN information:

        LUN: 0

            Type: controller

            SCSI ID: IET     00010000

            SCSI SN: beaf10

            Size: 0 MB, Block size: 1

            Online: Yes

            Removable media: No

            Prevent removal: No

            Readonly: No

            SWP: No

            Thin-provisioning: No

            Backing store type: null

            Backing store path: None

            Backing store flags:

        LUN: 1

            Type: disk

            SCSI ID: IET     00010001

            SCSI SN: beaf11

            Size: 1074 MB, Block size: 512

            Online: Yes

            Removable media: No

            Prevent removal: No

            Readonly: No

            SWP: No

            Thin-provisioning: No

            Backing store type: rdwr

            Backing store path: /dev/rbd/rbd/block1

            Backing store flags:

    Account information:

    ACL information:

        ALL

 

bind 체크

$ sudo netstat -atnp | grep 3260

tcp        0      0 0.0.0.0:3260            0.0.0.0:*               LISTEN      10881/tgtd     

tcp6       0      0 :::3260                 :::*                    LISTEN      10881/tgtd

 

Remote iSCSI 타겟 찾기

$ sudo iscsiadm --mode discovery --type sendtargets --portal 12.0.0.11

12.0.0.11:3260,1 iqn.2014.6.anycloud:iscsi.target.storage1.block1

 

 


 

 

 

구분

체크 사항

비고

파일시스템

서버 재가동시 ceph 데몬들은 자동 실행 되는가?

ceph의 상태는 정상 상태인가?

fstab은 작성되어 있는가?

ceph는 마운트 되어 있는가?

 

 

 

블록시스템

블록은 존재하는가

서비스 블록은 매핑되어 있는가?

rbdmap은 작성되어 있는가?

 

네트워크

private 네트워크는 동작중인가?

private 네트워크를 통해 서로 ping이 갈 수 있는 상황인가?

public 네트워크는 준비되어 있는가?

 

CTDB

설정파일은 제대로 작성 되어 있는가?

프로세스는 존재하는가?

CTDB가 동작한 후 에 공유서비스 데몬들이 동작하는가?

CTDB 동작 후 public 네트워크 주소가 제대로 할당 되는가?

노드 모두 OK 상태인가?

Recovery master가 할당되어 있는가?

Recovery mode NOMAL 상태 인가?

ctdb가 구성된 모든 노드에게 ping이 가는가?

장애 발생 시 정상인 다른노드가 대신 서비스 처리를 해주는가?

 

Samba

설정은 제대로 적용되었는가?

samba user 는 추가되어 있는가?

upstart disable 되어 있는가?

smbd, nmbd 프로세스가 존재하는가?

pair over, pair back는 제대로 동작하는가?

Global locking은 제대로 동작하는가?

 

Nfs

설정은 제대로 적용되었는가?

upstart disable 되어 있는가?

nfsd, rpc 프로세스들은 존재하는가?

pair over, pair back는 제대로 동작하는가?

 

iSCSI

설정은 제대로 적용되었는가?

target은 생성되어 있는가?

tgtd 프로세스는 존재하는가?

pair over, pair back는 제대로 동작하는가?

 

 


 

 

 

samba ctdb 사이트 - https://ctdb.samba.org/

samba ctdb 위키 - https://wiki.samba.org/index.php/CTDB_Setup

 

readhat ctdb 설정(한글) – https://access.redhat.com/site/documentation/ko-KR/Red_Hat_Enterprise_Linux/6/html/Cluster_Administration/s1-CTDB-Configuration-CA.html

 

ctdb 설명 ppt -

https://www.snia.org/sites/default/files2/sdc_archives/2010_presentations/monday/VolkerLendecke_Status_Clustered_CIFS.pdf

http://niranjanmr.wordpress.com/2011/12/05/ctdb/

http://www.samba.org/~obnox/presentations/sambaXP-2011/sambaxp-2011-tutorial-ctdb-handout.pdf

 

우분투 파일 서버 - http://developinghappiness.com/?p=82

우분투 nfs howto - https://help.ubuntu.com/community/SettingUpNFSHowTo

Nfs how to - http://chschneider.eu/linux/server/nfs.shtml

 

Nfs 포트 변경 :

Configuring NFS under Linux for Firewall control - http://www.lowth.com/LinWiz/nfs_help.html

http://rockball.tistory.com/entry/NFS-Port-%EA%B3%A0%EC%A0%95%EB%B0%A9%ED%99%94%EB%B2%BD-%EC%82%AC%EC%9A%A9

Lockd 변경 -http://ubuntuforums.org/showthread.php?t=1263114&page=2&p=7959294#post7959294

http://cdral.net/948

 

 

ceph rbd+stgt 설명 사이트 - http://ceph.com/dev-notes/adding-support-for-rbd-to-stgt/

Stgt 소스코드 주소 - https://github.com/fujita/tgt

Stgt+rbd 설정 - http://stuartl.longlandclan.yi.org/blog/2014/02/25/ceph-and-stgt/

Stgt 퀵 가이드 - https://fedoraproject.org/wiki/Scsi-target-utils_Quickstart_Guide

Tgt 페키지 - http://stgt.sourceforge.net/

 






'학습자료 > tools' 카테고리의 다른 글

[tools] 크로스브라우저 테스트  (0) 2015.02.03
linux cron 사용법  (0) 2014.02.11
xming 사용(putty gui)  (0) 2014.02.03
xshell 파일전송  (0) 2013.12.23
이클립스 단축키  (0) 2013.09.25
posted by cozyboy
:
학습자료/리눅스 2014. 6. 18. 14:31

리눅스 여러 파일 내 문자열 치환

1. 현재 경로로부터 하위 폴더까지의 파일들 내에 "lion"이란 문자열을 "tiger"로 변경하는 경우

find . -exec perl -pi -e 's/lion/tiger/g' {} \;


2. 현재 경로로부터 하위 폴더까지의 "cpp"파일들 내에 "lion"이란 문자열을 "tiger"로 변경하는 경우

find . -name "*.cpp" -exec perl -pi -e 's/lion/tiger/g' {} \;



3. 현재 경로로부터 하위 폴더까지의 파일들 내에 "//#define"이란 문자열을 "#define"(즉, "//"를 제거)으로 변경하는 경우 

find . -exec perl -pi -e 's/\/\/#define/#define/g' {} \;

비슷하게 큰따옴표(")와 같은 기호는 \" 와 같이 써서 검색어로 쓸 수 있다. 


[펌] http://soharang.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%97%AC%EB%9F%AC-%ED%8C%8C%EC%9D%BC-%EB%82%B4-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%B9%98%ED%99%98



'학습자료 > 리눅스' 카테고리의 다른 글

[linux] crontab 에러  (0) 2015.03.24
다중 터미널  (0) 2014.11.18
cifs mount/unmount  (0) 2014.05.30
[linux] Ubuntu nginx + php + php5-fpm + sqlite 설정 (+ pdo sqlite)  (0) 2014.04.10
ubuntu 인터페이스 ip없이 사용하기.  (0) 2013.11.06
posted by cozyboy
:
학습자료/리눅스 2014. 5. 30. 13:55


  • mount 

mount -t cifs -o user='사용자이름',password='패스워드' //서버주소/공유폴더 마운트경로

사용자 이름 : testuser
패스워드 : 1234
서버주소 : 192.168.0.2
공유폴더 : cifs-test
마운트 경로 : /mount-test

mount -t cifs -o user='testuser',password='1234' //192.168.0.2/cifs-test /mount-test


  • lazy unmount 

sudo umount -a -t cifs -l


posted by cozyboy
:
학습자료/네트워크 2014. 5. 21. 16:34

sudo ip route del 192.168.0.0/22 dev eth2

'학습자료 > 네트워크' 카테고리의 다른 글

스위치 콘솔 연결(시리얼 포트 연결)  (0) 2013.11.06
vlan 설정(ubuntu)  (0) 2013.11.06
MTU, MSS [펌]  (0) 2013.06.17
zero-copy[펌]  (0) 2013.02.27
netstat 명령어 사용법 - 펌  (0) 2013.02.13
posted by cozyboy
:
학습자료/리눅스 2014. 4. 10. 18:10
  • nginx 설정
  1. vim /etc/nginx/site-available/myweb

server {

        access_log /var/log/nginx/myweb.access.log;

        error_log  /var/log/nginx/myweb.error.log;

        listen 8800;

        root /var/www/myweb/;

        index info.php index.php index.html index.htm;


        ## PHP codeigniter(for rewrite)

        if (!-e $request_filename) {

                rewrite ^(.*)$ /index.php last;

        }


        location ~ \.php$ {

# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini


# With php5-cgi alone:

#               fastcgi_pass 127.0.0.1:8598;

# With php5-fpm:

                fastcgi_pass unix:/var/run/php5-fpm.sock;

                fastcgi_index index.php;

#       fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

                include fastcgi_params;

        }

}

위 설정에서

listen : 접속 포트

root : 웹 페이지 도큐먼트 루트

fastcgi_pass : php-fpm은 리눅스 소켓을 사용한다.

 



2. ln -s /etc/nginx/site-enabled/




  • 필요 패키지 설치 

sudo apt-get install php5 l php5-fpm php5-sqlite



  • nginx 재구동(설정을 바꿀 시엔 nginx를 재구동 해야한다)

sudo service nginx 




  • 테스트 운용 (php 설정 정보 페이지)

vim /var/www/info.php

<?php

phpinfo();

?>



  • 웹페이지 접속
접속 : http://serverip:port

만약 제데로 세팅이 되었다면 php 설정정보 페이지가 뜰것이다.




php5에선 pdo가 기본으로 설정이 되어있다. 하지만 pdo가 없는 경우가 생겼다.

그때는 pecl를 통해서 php extention을 해야 한다. 


과정은 다음과 같다.


sudo apt-get install php-pear

sudo pecl install pdo

sudo pecl install pdo_sqlite






[참고]

php, fpm 설치 연동 : http://blog.beany.co.kr/archives/2665


php codeigniter 란 http://gyuha.tistory.com/258


nginx codeigniter(rewrite) 설정 http://codeigniter-kr.org/qna/view/10076/page/2/q/


php5 에서 pdo가 기본이라는 문서 : http://www.php.net/manual/en/ref.pdo-sqlite.php


pecl 이란? : http://www.php.net/manual/kr/install.pecl.intro.php


우분투 sqlite pdo 설치 : http://gregk.me/2011/installing-pdo-sqlite3-support-on-ubuntu/







posted by cozyboy
:
학습자료/Java 2014. 4. 5. 23:27

Solution:

Following example shows how to find proxy settings & create a proxy connection on a system using put method of systemSetting & getResponse method of HttpURLConnection class.

import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Properties;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;

public class Main{
   public static void main(String s[]) 
   throws Exception{
      try {
         Properties systemSettings = 
         System.getProperties();
         systemSettings.put("proxySet", "true");
         systemSettings.put("http.proxyHost", 
         "proxy.mycompany1.local");
         systemSettings.put("http.proxyPort", "80");
         URL u = new URL("http://www.google.com");
         HttpURLConnection con = (HttpURLConnection)
         u.openConnection();
         System.out.println(con.getResponseCode() + 
         " : " + con.getResponseMessage());
         System.out.println(con.getResponseCode() == 
         HttpURLConnection.HTTP_OK);
      }
      catch (Exception e) {
         e.printStackTrace();
         System.out.println(false);
      }
      System.setProperty("java.net.useSystemProxies", 
      "true");
      Proxy proxy = (Proxy) ProxySelector.getDefault().
      select(new URI("http://www.yahoo.com/")).iterator().
      next();;
      System.out.println("proxy hostname : " + proxy.type());
      InetSocketAddress addr = (InetSocketAddress)
      proxy.address();
      if (addr == null) {
         System.out.println("No Proxy");
      }
      else {
         System.out.println("proxy hostname : " 
         + addr.getHostName());
         System.out.println("proxy port : "
         + addr.getPort());
      }
   }
}

Result:

The above code sample will produce the following result.

200 : OK
true
proxy hostname : HTTP
proxy hostname : proxy.mycompany1.local
proxy port : 80

 

펌 : http://www.tutorialspoint.com/javaexamples/net_poxy.htm

posted by cozyboy
:
학습자료/tools 2014. 2. 11. 14:15



crond 데몬 /etc/rec.d/init.d/crond 스크립트에 의해 시작, 종료,재시작될 수 있다

기본 명령의 위치 :/user/bin/crontab

 =>아무곳에서도 실행 가능 함 등록,수정, 보기



사용형식

crontab [ -u 사용자 id] 파일

crontab [-u 사용자 id] { -l | -r | -e}


crontab -l : 예약된 작업리스트

crontab -e : 예약된 작업 수정

crontab -r : 예약된 작업 삭제



crond 실행 확인

=> ps -ef | grep crond



crond 시작

=> /etc/rc.d/init.d/crond start{restart | stop}


일반사용자에게 crontab 명령어 사용하도록 설정 허가

=> /etc/cron.allow 여기에 ID 등록


일반사용자의 crontab 명령어사용을 제한하고자 한다면

=>/etc/cron.deny  에 ID를 등록

즉,

=> /etc/cron.allow : 허용할 사용자 ID 목록
=> /etc/cron.deny  : 거부할 사용자 ID 목록

cron.allow 파일이 있으면 이 파일에 들어있는 ID만 사용 가능
cron.deny  파일이 있으면 이 파일에 들어있는 ID는 사용 불가

따라서 cron.deny에 truefeel ID를 추가해주면 됩니다.



환경변수 영역   --->> 환경변수중에 PATH문제가 자주 발생. cron은 유저의 환경변수를 모두 가져오지 않는다.

(http://cozyboy.tistory.com/entry/linux-crontab-%EC%97%90%EB%9F%AC)


첫번째 영역에서는 몇가지 변수를 설정한다.

SHELL
등록된 프로그램을 실행시킬 쉘프로그램을 지정한다. 정의 하지 않을 경우 /bin/sh이 쉘 프로그램으로 지정된다.
PATH
cron은 별도로 쉘을 띄우귀 때문에, 쉘에서 프로그램을 찾기 위한 PATH도 지정해줄 필요가 있다. 왜냐하면 로그인을 해서 shell을 실행시키지 않으므로, 로그인과정에서의 PATH변수를 사용할 수 없기 때문이다.
MAILTO
cron이 수행한 작업의 결과를 mail로 보낼 수 있다. 위의 경우 root유저에게 메일을 전송한다. 만약 MAILTO를 설정하지 않으면 crontab의 실행유저에게 메일이 전송된다.
HOME
cront의 home 디렉토리(:12)경로를 설정한다. 기본적으로는 crontab의 실행유저의 홈디렉토리로 /etc/passwd에 설정된 경로를 따른다. 


등록 내용 설정

"분,시,일,월,요일, 실행명령" 순으로 설정

# min       hours       day       month       day      command
   34            2           *            *            *       sh /root/backup.sh

crontab 파일 형식
------    --------  ---------------------------------------------------
필  드    의  미    범  위
------    --------  ---------------------------------------------------
첫번째    분        0-59
두번째    시        0-23
세번째    일        0-31
네번째    월        1-12
다섯번째  요일      0-7 (0 또는 7=일요일, 1=월, 2=화,...)
여섯번째  명령어    실행할 명령을 한줄로 쓴다.
------    --------  ---------------------------------------------------

- 한 줄당 하나의 명령 (두줄로 나눠서 표시할 수 없음)
- # 으로 시작하는 줄은 실행하지 않는다 (주석)

 

 

crontab -e 을 하면 vi 에디터가 나온다.(환경변수 EDITOR에 따라 다른 에디터를 사용할 수 있다.)


  $ crontab -e
  # /home 디렉토리를 /BACKUP/home 으로 백업해둠
  # 30분, 새벽 4시와 낮 12시, 모든 일, 모든 월, 모든 요일
  30 4,12 * * *  /usr/bin/rsync -avxH --delete /home /BACKUP/home > /dev/null 2>&1

  # 파일/디렉토리 퍼미션 설정
  # 40분, 새벽 1시, 매주 일요일
  40 1    * * 0  /root/bin/perm_set.sh   > /dev/null 2>&1


  # 20분마다 실행

  */20 * * * * /shell/mrtg


위는 매일 4:30분과 12:30분에 rsync 명령을, 매주 일요일 1:40분에 perm_set.sh를 실행함을 의미한다.

vi 에디터를 통해 설정을 하므로 중요한 몇 가지 에디터 사용법은 익혀야 한다.

----  -----------------------------------------------------------------------------
키    의미
----  -----------------------------------------------------------------------------
i     현재 칸에 글을 넣는다.
o     다음줄에 글을 넣는다.
dd    한줄을 삭제한다.
:wq   저장하고 빠져나온다.
ESC   설정중에 명령어 모드(위의 i, o, dd 등을 사용할 수 있는 상태)로 빠져 나온다.
----  -----------------------------------------------------------------------------


설정 예

시간 설정에서 몇가지 의미있는 것들을 알아보자.

- '*'표시는 해당 필드의 모든 시간을 의미한다.
- 3,5,7 와 같이 콤마(,)로 구분하여 여러 시간대를 지정할 수 있다.
- 2-10와 같이 하이픈(-)으로 시간 범위도 지정할 수 있다.
- 2-10/3와 같이 하이픈(-)으로 시간 범위를 슬래쉬(/)로 시간 간격을 지정할 수 있다.
  (2~10까지 3간격으로. 즉, 3,6,9를 의미함)

=>  > /dev/null  2>&1 이 무슨 뜻입니까?
  지정한 명령어 처리 결과와 발생할지 모르는 에러메시지를 출력하지 않고 모두 버린다는(/dev/null)는
  뜻입니다. 만약 결과와 에러를 파일로 저장하려면 /dev/null 대신 파일명을 적어주면 됩니다.


예)

20  2     *  *  6  명령어 => 매주 토요일 새벽 2:20

0  4-6   *  *  *  명령어 => 매일 오후 4,5,6시

5  */2 *  *  * 명령어 => 매일 2시간간격으로 5분대에

15  1   1  *  *  명령어 => 매월 1일 새벽 1:15

30  0   1  1,7  *  명령어 => 1,7월 1일 새벽 0:30


10 2 * * * /app11/minsang/APP/ldap/run.sh > /app11/minsang/APP/ldap/cron_error.log
55 13 * * * /run.sh > /mail_cron_error.log
0,30 8-19 * * * /sendAdmin.sh > /cron_admin_error.log  


별표(*)는 all을 의미한다.

* * * * *  /bin/bash /usr/local/bin/myprog  # 매분 마다 myprog를 실행


시간을 특정할 수 있다.
30 * * * *  /bin/bash /usr/local/bin/myprog  # 매시 30분에 실행 
5,10 * * * *  /bin/bash /usr/local/bin/myprog  # 매시 5,10분에 실행 
5 1 * * 0  /bin/bash /usr/local/bin/myprog  # 매주 일요일 새벽 1시 5분에 실행 


/를 이용해서 실행 간격을 조정할 수 있다.
*/5 * * * *  /bin/bash /usr/local/bin/myprog  # 5분 간격으로 실행 
*/20 * * * *  /bin/bash /usr/local/bin/myprog  # 20분 간격으로 실행 


-를 이용해서 범위를 지정할 수도 있다.
5-30 * * * *  /bin/bash /usr/local/bin/myprog  # 매시 5-30분에 분간격으로 실행 
5 4-5 * * *  /bin/bash /usr/local/bin/myprog  # 새벽 4시5분, 5시 5분에 실행 


-와 /를 조합할 수도 있다.
5-30/5 * * * *  /bin/bash /usr/local/bin/myprog  # 매시 5-30분에 5분간격으로 실행 


Crontab file 위치

  1. Linux and Unix-like operating system may change the default from /var/spool/cron/ to something else. Use the following as a guideline for your OS (assuming that user name is vivek):
  2. Mac OS X - /usr/lib/cron/tabs/ (user cron location /usr/lib/cron/tabs/vivek)
  3. FreeBSD/OpenBSD/NetBSD - /var/cron/tabs/ (user cron location /var/cron/tabs/vivek)
  4. CentOS/Red Hat/RHEL/Fedora/Scientific Linux - /var/spool/cron/ (user cron location/var/spool/cron/vivek)
  5. Debian / Ubuntu Linux - /var/spool/cron/crontabs/ (user cron location/var/spool/cron/crontabs/vivek)
  6. HP-UX Unix - /var/spool/cron/crontabs/ (user cron location/var/spool/cron/crontabs/vivek)
  7. IBM AIX Unix - /var/spool/cron/ (user cron location /var/spool/cron/vivek)



[출처]

http://program.egloos.com/viewer/802690

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/System_management/Crontab

http://www.cyberciti.biz/faq/where-is-the-crontab-file/

'학습자료 > tools' 카테고리의 다른 글

[tools] 크로스브라우저 테스트  (0) 2015.02.03
CTDB(cifs/nfs/iSCSI/ftp with ceph) 구성 - 문서 첨부  (0) 2014.06.30
xming 사용(putty gui)  (0) 2014.02.03
xshell 파일전송  (0) 2013.12.23
이클립스 단축키  (0) 2013.09.25
posted by cozyboy
:
학습자료/tools 2014. 2. 3. 13:34

1. 다운로드

putty 다운로드 : http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html


xming 다운로드 : http://sourceforge.net/projects/xming/


2. xming 설정

XLanuch  실행 -> one window -> start no client -> 클립보드 체크 -> 설정파일 저장

 

저장한 Config  파일 실행

 

3. putty 설정


호스트명에 접속할 리눅스 서버의 ip 혹은 호스트명을 입력


좌측 메뉴에서 접속(Connection) > SSH > X11 선택


X11 포워딩 사용(Enable X11 forwarding) 체크 후 X 디스플레이 위치(X display location) 항목에 " localhost:0 " 입력


좌측 메뉴에서 세션(Session) 메뉴 선택 후 입력한 내용 저장 후 하단의 열기 버튼 선택


4. putty GUI 접속


'학습자료 > tools' 카테고리의 다른 글

CTDB(cifs/nfs/iSCSI/ftp with ceph) 구성 - 문서 첨부  (0) 2014.06.30
linux cron 사용법  (0) 2014.02.11
xshell 파일전송  (0) 2013.12.23
이클립스 단축키  (0) 2013.09.25
한글 iso-8859-1 변환  (0) 2013.07.10
posted by cozyboy
:
학습자료/tools 2013. 12. 23. 14:10


1. 파일전송 위한 패키지 설치

sudo apt-get install lrzsz


2. 리모트 -> 로컬 전송

sz filename


3. 로컬 ->리모트

파일을 xshell에 드래그

'학습자료 > tools' 카테고리의 다른 글

linux cron 사용법  (0) 2014.02.11
xming 사용(putty gui)  (0) 2014.02.03
이클립스 단축키  (0) 2013.09.25
한글 iso-8859-1 변환  (0) 2013.07.10
Nagios 구조요약 및 샘플 코드(모니터링)  (0) 2013.07.03
posted by cozyboy
:
학습자료/이론 2013. 11. 14. 19:49


요약 : 

한마디로 사용자에게 용량을 속이는 것과 같다. 
전체 용량이 10TB이지만  사용자1~4에게 모두 6TB씩 사용 가능 하다고 표기하여 종합적으로 24TB를 쓸 수 있는 것 처럼 알린다. 

이러한 씬프로비저닝이 나온 이유는, 데이터 사용량을 정확히 예측 하기 어렵기 때문이다. 

만약 한 사용자마다 실제로 6TB씩의 물리 저장소를 배정한다면 24TB의 저장공간이 필요하다.
하지만 사용자들이 각 1TB의 용량만을 사용했다면 총 4TB의 용량을 사용한 것이다. 이렇게 되면 20TB의 용량 낭비와 장비공간 낭비, 전력 낭비가 생기게 된다.

씬 프로비져닝으로 데이터를 저장하는 방법들은 각기 다르겠지만, 본질은 실제 물리 용량을 속여서 실제 자원/비용을 줄이는 것이다. 







씬 프로비저닝(Thin Provisioning)의 탄생 배경

전형적인 스토리지 관리 체계에서는 충분한 데이터 증가량을 고려하여 스토리지 용량을 미리 할당함으로써 용량 추가 할당에 따른 서비스 다운타임을 최소화하는 방식을 사용했다. 일명 Fat Provisioning 방식으로 처음부터 많은 용량의 스토리지를 도입함으로써 초기 도입 비용을 증가시키고, 데이터 증가량의 정확한 예측이 안될 경우 스토리지의 낭비를 초래하였으며, 향후 용량 추가 시에도 많은 시간과 비용을 필요로 한다.

결과적으로 비용은 비용대로 많이 소요되고 서비스 다운타임 또한 발생하는 문제점을 가지고 있다. 그러나 이제는 Thin Provisioning 기법을 사용하여 스토리지에 남아도는 용량 없이 꼭 필요한 만큼, 필요한 때 사용할 수 있도록 스토리지를 날씬(Thin)하게 만들 수 있게 되었다. 즉 스토리지 용량을 애플리케이션이 당장 필요로 하는 수준으로 제한(물리적 공간 할당)하되 마치 사용자는 많은 공간(가상 할당)을 사용 하고 있는 것처럼 보여준다. 그러다가 실질적인 용량 추가 요청이 있을 시 조금씩 용량을 늘려주게 됨으로써 스토리지 활용률을 높이는 것이다.

공통 스토리지 풀




netapp 씬 프로비저닝 기본원리 

대량의 스토리지를 할당하고 스토리지가 오랫동안 사용되지 않은 상태로 방치되는 여러 가지 상황이 있을 수 있습니다. 예를 들어 한 디자인 대학에서는 학생과 교직원용으로 27.5TB의 스토리지를 할당해야 한다고 예측했지만 대부분의 학생과 교직원은 스토리지를 조금만 사용하거나 전혀 사용하지 않았습니다.

하지만 이 학교는 NetApp 스토리지의 씬 프로비저닝을 사용하여 단 3.5TB의 물리적 스토리지(활용률 80%)를 통해 이러한 할당을 충족할 수 있었습니다(8:1 이상의 초과 할당률). 씬 프로비저닝을 사용하여 추가 스토리지 구입에 필요한 9만 달러 이상의 추가 비용이 절감된 것입니다.

NetApp 씬 프로비저닝은 물리적 스토리지 풀에 실제 존재하는 것보다 더 많은 논리적 스토리지를 호스트 또는 사용자에게 제공할 수 있도록 설계되었습니다. 공간을 미리 할당하는 대신 데이터가 기록될 때 각 볼륨 또는 LUN에 동적으로 스토리지 공간이 할당됩니다. 대부분의 구성에서는 볼륨 또는 LUN의 데이터가 삭제되고 Snapshot 복사본에서 이를 사용하지 않는 경우에도 공통 스토리지 풀에 여유 공간이 다시 생기게 됩니다.

스토리지 프로비저닝에 대한 이러한 접근 방식에는 다음과 같은 여러 가지 이점이 있습니다.

  • 위의 예에서 제안한 것처럼 할당되었지만 사용되지 않는 많은 양의 스토리지를 절약할 수 있습니다.
  • 높은 활용률로 인해 필요로 하는 스토리지 용량이 줄어들게 되므로 직접 자본 비용(capex)이 절감됩니다.
  • 데이터 센터에서 스토리지가 차지하는 공간이 줄어들고 필요한 전력 및 냉각 수요가 감소되므로 운영 비용(opex)이 절감됩니다.
  • 스토리지 가격은 지속적으로 하락하므로 추가 용량이 필요한 경우 해당 용량을 미리 구입하는 경우에 비해 더 저렴하게 구입할 수 있습니다.
  • 단일 여유 스토리지 풀을 관리할 수 있기 때문에 용량 계획이 단순합니다. 여러 애플리케이션 또는 사용자가 동일한 여유 공간 풀에서 스토리지를 할당할 수 있으므로 일부 볼륨에서는 용량이 제한되고 다른 볼륨에서는 용량이 남는 상황이 발생하지 않습니다.
  • 스토리지 환경이 더욱 민첩해지며 변화에 더 쉽게 대응할 수 있게 됩니다.

기존 프로비저닝과 NetApp 씬 프로비저닝 비교

그림 1) 기존 프로비저닝과 NetApp 씬 프로비저닝 비교.

기본 원리 장에서는 NetApp 씬 프로비저닝 구현 방법, 가장 일반적인 사용 사례, SAN 및 NAS 환경 모두에서 씬 프로비저닝을 구현하는 사례 등에 대해 알아봅니다.


                                        ................

http://www.netapp.com/kr/communities/tech-ontap/tot-btb-thin-provisioning-1011-ko.aspx





NetApp에서 발표한 씬프로지비저닝에 관한 소개 자료입니다.

 

본문 내용 중 :

 

3. 씬 프로비저닝
3.1 정의
씬 프로비저닝이란 스토리지 시스템에서 실제로 사용할 수 있는 것보다 많은 스토리지 공간을 스토리지
시스템과 연결된 호스트 또는 서버에 제공하는 것입니다. NetApp 스토리지 시스템은 항상 이렇게 정교한 FC
및 iSCSI 프로비저닝 기능을 제공해 왔으며, Data ONTAP 7.0과 함께 출시된 FlexVol 기술은 이러한
유연성을 더욱 증가시켰습니다. 스토리지 시스템에 5,000GB의 가용 스토리지 용량이 있지만 스토리지
관리자가 15개의 호스트에 각각 500GB의 LUN을 매핑하는 것도 씬 프로비저닝의 한 가지 예입니다. 이
예에서 스토리지 관리자는 스토리지 시스템의 가용 공간이 5,000GB밖에 되지 않음에도 불구하고 호스트가
7,500GB의 스토리지 공간이 있는 것처럼 인식하게 만든 것입니다. 15개의 호스트가 제공된 500GB를 모두
한꺼번에 사용한다면 분명 문제가 발생할 것입니다. 스토리지 관리자는 시스템을 모니터링하여 필요에 따라
스토리지를 추가해야 합니다.
이러한 사례는 다른 산업 분야에서도 쉽게 찾아볼 수 있습니다. 예를 들어, 모든 사람이 동시에 수도꼭지를
튼다면 수자원관리공사와 같은 기관에서는 적절한 수압으로 물을 공급할 수 없을 것입니다. 이러한 기관은
특정 퍼센트의 사람만이 동시에 물을 사용한다는 사실을 전제하고 계획을 세웁니다. 마찬가지로, 은행도 모든
고객이 계좌에 있는 돈을 동시에 전부 인출할 수 있게 할 만큼 많은 현금을 보유하고 있지 않습니다. 은행은
특정 시기에 일정 퍼센트의 고객만이 돈을 인출할 것이라고 가정하고 계획을 세웁니다. 이 두 가지 사례는 씬
프로비저닝이 스토리지 분야를 비롯한 대규모 환경에 더 적절하다는 것을 보여줍니다. 스토리지 시스템의
규모가 크고 스토리지를 활용하는 사용자나 어플리케이션이 많을수록 씬 프로비저닝으로부터 얻을 수 있는
장점도 많아집니다.


'학습자료 > 이론' 카테고리의 다른 글

장고(Django)의 CSRF 웹 취약점 대응[펌]  (0) 2014.11.25
posted by cozyboy
: