목적 : Original VG의 lvcb가 존재하는 lv => BIG VG의 lvcb가 없는 lv로 dd copy 수행
첫번째 쉘입니다.
#cat dd_raw_device_1.sh
timex dd if=/dev/rsystem01 of=/dev/rsystem01_new bs=4k skip=1 count=255
아래 그림에서 보듯이
1번의 4k에 lvcb정보(512byte)가 들어가 있습니다. (오라클에서는 raw device 사용시 4k(4096byte) 부분을 사용하지 않습니다.)
그러하여 bs=4k 단위로 준 겁니다.(이 경우 bs=ibs=obs 가 동일하게 적용됩니다. 즉 읽는 크기와 쓰는 크기가 동일함.)
skip=1 은 "1번의 4k" 부분에 lvcb 정보가 있으므로 , 이 정보를 copy 하지 않기 위함입니다.
(신규 LV 는 zero-offset이 적용된 LV임. "DEVICESUBTYPE : DS_LVZ" 으로 확인)
"count = 255" 는 bs=4k 단위로 255개를 copy 합니다.(즉 4K * 255 = 1020k 를 copy )
따라서 첫번째 쉘의 결과는 lvcb를 복제하지 않고 1020k 만큼 새로운 lv에 복제를 합니다.
두번째 쉘입니다.
#cat dd_raw_device_2.sh
timex dd if=/dev/rsystem01 of=/dev/rsystem01_new ibs=1024k obs=1020k skip=1 seek=1
여기서는 옵션에서 읽기(ibs=1024k)와 쓰기(obs=1020k) 부분의 사이즈가 다릅니다.
ibs=1024k 만큼 read하여, obs=1020k 만큼씩 write 합니다.
왜냐면, 첫번째 쉘에서 이미 신규 LV에 1020k 만큼을 copy 하였기 때문입니다.
그러하여 1020k 단위로 write가 수행됩니다.
skip=1 은, 1024k 단위로 두번째 블록을 읽습니다. (원본 LV를 읽을때이므로 lvcb가 포함된 1024k입니다.)
seek = 1은 신규LV에 1020k 단위가 이미 복제되었으므로, 1020k 단위로 두번째 블록에다 write 합니다.
(단위를 변경하고자 한다면 첫번째 쉘에서 count 를 원하는 사이즈 만큼 증가시키고, 두번째 쉘에서 증가시킨만큼 write하면됩니다.)
예: 10M 단위로 dd copy를 하고자 한다면
첫번째 쉘
count = 2550
두번째 쉘
ibs=10240k , obs=10200k
Note : read는 1024K씩 읽는데 write를 1020K씩 하므로 계속 4K가 남게 되는데, 이것은 다음 read분 write시 먼저 Write됨.
그래서 obs count가 ibs count 보다 큰 이유가 위와 같은 사유임.
[옵션설명]
bs = bytes : 한번에 지정된 단위로 read/write한다. (즉,ibs,obs 무시됨.)
ibs = bytes : 한번에 지정된 단위로 read한다.
obs = bytes : 한번에 지정된 단위로 write한다.
skip = blocks : 입력 시작에서 blocks 단위만큼 ibs 크기를 건너뛴다.
( 가령 skip=5 , ibs=10이면 50byte를 건너뛰어 read를 한다.)
seek = blocks : 출력 시작에서 blocks 단위만큼 obs 크기를 건너뛴다.
count = blocks : 복사할 회수 또는 블록의 개수 ( 생략시 모든 데이터 복사)
