12/23/2013

Virtual Box의 저장소(VDI) 관리방법

1. VDI 기본 관리방법 

Virtual Box에서 VDI는 Virtual Disk Image로 가상의 Hard Disk Image로 생각을 하면되겠다.

대부분 사람들이 하나만을 크게 사용하여 OS와 DATA영역을 같이 사용을 한다.
이렇게 사용을 하면 불편함을 많이 느껴서를 이를 분리하고, 필요할때만 사용하는 것이다.

본인도 이렇게 사용을 하다보니, 이제 편하게 느껴져 아래와 같이 나누어 사용한다.
기본 OS용 VDI를 사용하고, 데이타용 VDI를 사용하여 확장하는 방식으로 사용하는 것이다.
필요할 경우에만 데이타용 VDI를 사용하고 백업하는 것이다.

기본적 Virtual Box의 저장소->SATA를 아래와 같이 구성을 하고, 개발용 DATA VDI는 본인 결정에 따라,
설정을 변경하고, 백업하고 별도로 관리를 하는 것이다.

  1. OS용 VDI  설정  (Ubuntu 설치)
  2. 개발용 DATA1 관리용 VDI 설정 
  3. 개발용 DATA2 관리용 VDI 설정 
  4. SD DISK IMAGE 용 VDI 설정

예를 들면, 본인 가상머신->저장소->SATA, 에 기본 VDI는 리눅스를 설치용사용

1.1 VDI 기본동적관리방법  
VDI는 Virtual Box에서 제공하는 가상저장장소이며, 기본적으로 이것을 이용을 한다.
이것을 사용자가 용도에 맞게 분리해서 사용하면 백업과 관리가 편해질 뿐더러, 
DATA만 저장될 경우, 이것을 다른 사람에게 전달해줘도 크게 문제가 없다. 

  • 기본관리는 Linux의 /etc/fstab 과 UUID로 관리한다. 
  1. OS용(UBUNTU) VDI는 기본적으로 설치 후 OS관련부분만 기록
  2. DATA VDI는 개발이 진행이 되면, 관련 개발부분을 추가하고 연결하고 /etc/fstab 수정
  3. DATA VDI는 개발이 종료되거나, 쓸모가 없다면 이부분을 연결을 끊고, /etc/fstab 수정   
  4. SD-DISK VDI는 SD BOOT용 Image를 만들기 위해 만든다.  

결론적으로
개별 Virtual Machine에서 불필요하다면 각각의 VDI를 동적으로 연결을 하고 제거 하는 것이다.

  1. 기본설치용:  ubuntu 12.01  20G
  2. 확장용:   data 확장용 vdi-1 , vdi-2   

    저의 경우는 아래와 같이 결정을 하여 사용하고 있다.
    기본설치용은 크게 용량이 증가될 이유가 없으며, 속도가 중요하다고 판단이 되기때문이다
    • 기본설치용 VDI : 고정크기 저장소 설정 (가급적 고정, SSD 사용유저는 동적사용)
    • 확장용:      VDI:  동적크기 저장소 결정 (개발용 VDI)

    확장용도 기본적으로 고정크기를 하는 것이 좋으나, 용량문제로 동적크기 설정한다.

    ** 확장용 VDI, 개발용 VDI를 ubuntu 12.01 or ubuntu 14.04 아무곳이나 연결하여 사용한다.

    1.2 DATA VDI  Vs SD-DISK VDI  
    DATA VDI 위에서 언급했듯이 , 개발용도로 사용하며, SD-DISK는 SD Boot를 위해 사용한다.
    1. DATA VDI는 개발하면 해당 SOC의 SDK or RDK을 저장장소며, 가능하면 동적할당으로 만든다. 
    2. SD-DISK VDI는 SOC에서 SD BOOT를 위해 4G (추천) or 8G 고정할당으로 만든다. 


    1.3 SD-DISK VDI 와 SD-DISK VMDK 차이 

    둘다 SOC의 SD BOOT의 Image를 만들기 위해서 사용을 한다. 하지만 만드는 방법이 서로 다른다. 
    VDI는 저장장소이지만, VMDK는 링크로 개념으로 봐야하며,
    Guest OS에서 Host OS의 SD DISK를 직접 접근하기 위해서 VMDK를 사용한다.
    VDI를 이용할 경우, Image를 가지고 와서 Window에서 다시 이 Image를 SD Disk에 Write한다.


    1.4 SD DISK VDI 관리 및 Image 만드는 방법 

    1. SD용 VDI IMAGE (e.g 4G, 8G 16G) 고정or 동적크키로 만든다. ( SD 크기에 따라 ) 
    2. Linux에서 이곳에 접근하여 이곳에 Image를 만든다. 
    3. Image를 Window로 가져와서 Win32DiskImager.exe Program을 이용하여 SD Write 한다.
    가급적 크기를 적게만들어 시간일 만들고, Write하는 시간을 줄이자.
    SD Card 16G사용하더라도, 4G 기준으로 만들고 사용하면 된다.


    • Linux에서 SD Image 법

      http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_create_SD_card_script


    • Download Win32DiskImager 
    사용방법은 간단하며, 아래와 같이 Read와 Write를 이용하여, Backup과 Write를 하자.


    1. Read를 할 경우 SD Image를 Backup 하여 다른 곳에 적용가능 
    2. Write 할 경우 위에서 만든 Image를 적용 

      http://www.npackd.org/p/win32-disk-imager/0.9.5
    • Win32DiskImager 사용하는 예 
      http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Creating_a_SD_Card_with_Windows


    2. 기본 VDI 추가방법

    위에서 언급했듯이 DATA or SD Image VDI를 추가하는 방법이다.
    이는 소스관리 목적이며, 편의성으로 주로 이용하기 위해서 이다.
    다른목적으로 사용을 해도 상관은 없다.

    •    머신->설정
    1. 저장소->컨트롤러:SATA 선택  우측의 포트개수 수정
    2. 컨트롤러:SATA->하드디스크 추가 
    3. VDI 새로 생성 및 추가 

    주의사항
      1. 기존 VDI를 추가 도중 UUID 오류가 발생할수 있음
         UUID 중복문제 부분참조.

      2. 반드시 우측의 포트개수와 하드디스크 숫자를 맞추어 주시기 바랍니다.
      추가했다가 뺄경우, 이 숫자가 맞지 않는다면 에러가 발생합니다.



       위에서 설명했듯이 하드디스크 추가로 하면

    1. 새디스크 만들기   : 아래로  진행 
    2. 기존디스 선택하기 : 기존에 만들어진  VDI or VMDK 선택 




         새 디스크로 만들기 로 선택 할 경우 아래와 같이 진행



    • 일반적 데이타 VDI는 동적할당 설정
    • SD IMAGE를 만들고자 한다면 고정크기로 만들자 




    • 일반데이타 이미지는  VDI 이름과 SIZE를 설정한다.
    • SD DISK IMAGE를 만들고자 한다면, 8G or 16G 이런식으로 만들자. 




    2.1 SD-DISK Link VMDK 추가  

    Virtual Box는 직접 Host의 Driver Interface를 직접 접근을 할수 없다.
    예를들면, Host의 HDD or SDD or SD Card 및 USB Interface를  
    Virtual Box에서 직접 연결할 수 없기에 VMDK Link 만들어 Host와 Guest OS를 연결을 해주는 것이다.  
    나의 경우는 USB와 SD Card의 접근이 중요했으며, 이를 직접 접근하려고 VMDK를 이용했다. .


    • 사용목적 

    1. Host의 SD Card Reader 와 Guest OS와 연결 
    2. Host의 USB or SSD Drive 및 Interface 와 Guest OS와 연결

       위에서 생성한 Link vmdk를 추가하면
    1. Linux에서 이 Link vmdk를 이용하여 SD Card reader 직접 접근이 가능 
    2. 다른 Drive에직접 Access가 가능해진다.

    이 부분은 필요할 때만 Link를 생성해서 확인하고 사용하는것이 좋으며, 사용할 경우,
    매번 Window에서 현재의 Disk의 연결상태는 USB의 연결상태 때문에 변경이 된다.
    그러므로 반드시 명령어로 wmic diskdrive list brief  로 확인해야한다.
    • SD Card Reader Link VMDK 생성 (반드시 administrator 실행)
    1. 윈도우에서 cmd Command를 실행
    2. SD Disk 를 삽입을 반드시 삽입을 한다. (Plug in 되어야 인식되는 제품이 있음)
    3. wmic diskdrive list brief 이용하여 SD Disk Physical Drive를 알아낸다.
    4. Virtual Box Command로 SD Disk Link vmdk 생성한다. 

    **주의사항-1 
        SD Card Reader는 수시로 \\.\PHYSICALDRIVE1 or 2 로 변경이 될 수 있다.
        왜냐하면 USB Hard가 연결이 될 경우, USB Hard가 먼저 인식이 되어 SD-Card는 2로 설정이 되기 때문이다.
        그러므로, SD-DISK Link VMDK는 사용시에 주의해서 사용해야한다.

    **주의사항-2
        본인 SD Card Reader 가 Hotplug 기능을 지원을 하여, SD Card가 사용 중일때만,
        이 링크가 동작이 되어 VDI 관리자 문제가 발생한다.
        그러므로 이 VMDK는 필요시에만 사용을 하는 것이 좋을 것 같다.





    문제가 발생한다면, 관리자 모드로 실행하자
    • CMD 실행 이용하여  *. VMDK 생성 (필요할때마다 삭제하고, 생성)
    아래와 같이 USB의 특성상 매번 PHYSICALDRIVEx 번호가 변동이 될 것이므로, 필요할때 생성하여, 사용하자. (상위 주의사항 참고)

    C:\Users\JHLEE> wmic diskdrive list brief
    Caption                                    DeviceID            Model
          Partitions  Size
    Samsung SSD 850 PRO 512G SCSI Disk Device  \\.\PHYSICALDRIVE0  Samsung SSD 850 PRO 512G SCSI Disk Device  4           512105932800
    SDHC Card                                  \\.\PHYSICALDRIVE1  SDHC Card      2           15924142080
    
    
    C:\Users\JHLEE> cd C:\Program Files\Oracle\VirtualBox
    
    C:\Program Files\Oracle\VirtualBox> VBoxManage internalcommands createrawvmdk -filename "D:\DEVELS\LINUX\VMINFO\VDI-DISK\sdcard-real.vmdk" -rawdisk "\\.\PHYSICALDRIVE1"
    
    

    • 윈도우 탐색기에서 VMDK 생성확인



    • Virtual Box 연결 (관리자 모드로 다시 실행하자)
    1. 설정->저장소->컨트롤러:SATA  선택 및 우측의 포트갯수 확인 (현재 6개사용)
    2. 하드디스크 SATA 추가 연결 (새로생성된 VMDK 파일추가) 
    3. 최신 Version 부터는 핫플러그 기능제공 선택

    최신버전부터 핫플러그가 지원이 되기에, 리눅스에서도 별다른 설정없이
    자동마운트가 됩니다.




    • 에러사항-1 
    아래와 같이 에러가 발생하는 원인은 일반유저 모드로 VMDK를 생성을 하며,
    접근에 문제가 생긴다.



    저장소->컨트롤러:SATA-> 호스트 I/O 캐시 사용하기를 사용
    위를 설정하면 해결이 된다.
    VERR_ACCESS_DENIED 때문에, 관리자모드로 아무리 해결을 할려고 해도
    해결이 되지 않았다.
    관리자모드와 별관계가 없는거 같다.






    WINDOW-PATH설정
         https://www.java.com/ko/download/help/path.xml

    SD-DISK 설정
         http://www.sandyscott.net/2013/08/14/virtualbox-direct-drive-access/
         https://romaimperator.com/?p=29
         https://www.virtualbox.org/manual/ch09.html#rawdisk       (9.9.1.1)


    2.2 이미 생성된 VDI SIZE 변경   

    VDI의 처음 생성시 동적크기 했을 경우에만 해당되며, 권장을 하지 않아서 자세히 다루지 않고 소개만 하겠다.
    다시한번 언급하겠지만, 권장사항은 아니다.

    VDI 사이즈 조절하는 방법은 동일하다 아래의 Command를 이용한다.


    • VBoxManage Modifyhd         (기존 )
    • VboxManage Modifiymedium (현재)


         http://leechwin.tistory.com/17
         http://blog.daum.net/yangjp1190/6613406


    3. VDI 관련 Linux 환경설정 

    Virtual Box의 Virtual Machine의 저장소가 변경이 되었으니,
    이 변경사항 or 새로운 VDI를 추가 리눅스에서 필요한 환경설정 살펴보겠다.


    **문제사항-기본에 확장된 VDI를 제거할 경우 
    /etc/fstab에 UUID 정보가 존재하여 mount 정보로 인하여, 부팅시 문제가 발생하지만,
    SKIP으로 넘어가고, 추후 이 변경사항을 현재 상황에 맞게 변경을 해주자.

    3.5 참조 

    3.1. 본인환경확인 

    VDI를 추가 하기전에 기존 사용하던 리눅스 환경에서 확인하는 작업이다.
    불필요하다면 생략하자.

    Ubuntu 설치 후 기본용량 확인
                * 20G 중 13G 사용가능, sda1만 사용
                  (update & upgrade 전혀 안하고, ssh server 만 설치)


    • mount 정보 및 파티션 정보확인  

    $ mount
    /dev/sda1 on / type ext4 (rw,errors=remount-ro)
    proc on /proc type proc (rw,noexec,nosuid,nodev)
    sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
    none on /sys/fs/fuse/connections type fusectl (rw)
    none on /sys/kernel/debug type debugfs (rw)
    none on /sys/kernel/security type securityfs (rw)
    udev on /dev type devtmpfs (rw,mode=0755)
    devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
    tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
    none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
    none on /run/shm type tmpfs (rw,nosuid,nodev)
    .......
    
    
    $ df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1        16G  3.1G   13G  21% /
    udev            2.0G  4.0K  2.0G   1% /dev
    tmpfs           792M  788K  791M   1% /run
    none            5.0M     0  5.0M   0% /run/lock
    none            2.0G  152K  2.0G   1% /run/shm
    SHARED          494G  366G  129G  74% /media/sf_SHARED
    
    $ cat /proc/partitions 
    major minor  #blocks  name
    
       8        0   20971520 sda
       8        1   16776192 sda1
       8        2          1 sda2
       8        5    4192256 sda5
       8       16   10485760 sdb
      11        0    1048575 sr0
      11        1    1048575 sr1
    
    $ sudo fdisk -l
    
    Disk /dev/sda: 21.5 GB, 21474836480 bytes
    255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00095854
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048    33554431    16776192   83  Linux
    /dev/sda2        33556478    41940991     4192257    5  Extended
    /dev/sda5        33556480    41940991     4192256   82  Linux swap / Solaris
    
    

    3.2 fdisk 설정 및 partition 결정

    새로 생성할 VDI가 DATA VDI 즉 개발목적이라면 File System이 필요하고, Partition이 필요하다.
    fdisk로 partition을 설정을 해야하며, file system format을 설정을 해야한다.

    현재 SD-DISK VDI는 TI에서 제공해주는 Script에서 자동으로 Partition을 잡고해주므로
    크게 걱정안해도 된다.

    1. ubuntu 부팅 후 Termianl 실행 or SSH 실행
    2. fdisk로 기본 파티션 설정
    3. cat /proc/partitions 으로 추가된 새로운 VDI 사이즈 확인 

    **주의사항 
        /dev/sdx :  여러 VDI 추가 할 경우 sdx의 이름은 순서대로 a,b,c,d,e 할당됨  
        이 부분은 virtual box의 설정->저장소에서 SATA 포트 번호를 확인 


    $ cat /proc/partitions  // 파티션 확인,두번째 DEV가 파티션이 없는 것을 확인(/dev/sdb) 
       8        0   20971520 sda
       8        1   16776192 sda1
       8        2          1 sda2
       8        5    4192256 sda5
       8       16   10485760 sdb
      11        0    1048575 sr0
      11        1    1048575 sr1
    
    $ sudo fdisk /dev/sdb
    Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
    Building a new DOS disklabel with disk identifier 0x6634dbfd.
    Changes will remain in memory only, until you decide to write them.
    After that, of course, the previous content won't be recoverable.
    
    Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
    
    Command (m for help): m
    Command action
       a   toggle a bootable flag
       b   edit bsd disklabel
       c   toggle the dos compatibility flag
       d   delete a partition
       l   list known partition types
       m   print this menu
       n   add a new partition
       o   create a new empty DOS partition table
       p   print the partition table
       q   quit without saving changes
       s   create a new empty Sun disklabel
       t   change a partition's system id
       u   change display/entry units
       v   verify the partition table
       w   write table to disk and exit
       x   extra functionality (experts only)
    
    Command (m for help): n
    Partition type:
       p   primary (0 primary, 0 extended, 4 free)
       e   extended
    Select (default p):  p 
    Partition number (1-4, default 1):  1  
    First sector (2048-20971519, default 2048): 
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): 
    Using default value 20971519
    
    Command (m for help): p
    
    Disk /dev/sdb: 10.7 GB, 10737418240 bytes
    255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x6634dbfd
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048    20971519    10484736   83  Linux
    
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    Syncing disks.
    
    

    3.3 File system Format 

    위에서 fdisk를 이용하여 partition 을 만들었고, 1st partition에 ext4를 적용합니다.

    $ sudo mkfs.ext4 /dev/sdb1 
    mke2fs 1.42 (29-Nov-2011)
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    655360 inodes, 2621184 blocks
    131059 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=2684354560
    80 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks: 
     32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
    
    Allocating group tables: done                            
    Writing inode tables: done                            
    Creating journal (32768 blocks): done
    Writing superblocks and filesystem accounting information: done 
    



    3.4  Auto Mount

    만약 위처럼 했다면 문제 없이 /dev/sdb1를 인식하여, ubuntu가 자동으로 아래와 같이 자동으로 mount 한다.
    만약 문제가 있다면 수동으로 mount를 설정하자.
    아래의 b771bdc7-e7f7-454b-a48a-df598833169d  VID의 UUID 정보이다.

    $ mount
    ......
    SHARED on /media/sf_SHARED type vboxsf (gid=999,rw)
    /dev/sdb1 on /media/jhlee/b771bdc7-e7f7-454b-a48a-df598833169d type ext4 (rw,nosuid,nodev,uhelper=udisks2)
    





    $ mkdir Works
    $ cd Works
    $ ln -s /media/jhlee/b771bdc7-e7f7-454b-a48a-df598833169d AM335x
    


    Reboot를 하게된다면, 인식을 잘못하는 경우가 발생한다.
    그래서, 아래와 같이 직접 Manual로 관리하기로 했다.


    3.5 Manual Auto Mount 설정 (fstab) 

    manual로 uuid 정보를 얻어 본인이 원하는 장소에 매번 mount를 설정이 가능하다.

    //아래와 같이 mount test 를 해보고 해보자. 
    
    $sudo mount /dev/sdb1   ~/work
    

    • /dev/disk/by-uuid에서 uuid 정보를 얻기
    Linux는 vdi를 추가할 때마다 disk를 sda, b, c 형식으로 증가되며,
    partion을 증가시킬때마다 sda1, sda2 씩 증가가 된다.
     
    예를 들면 sda는 첫번째이며, sdb일 경우는 두번째 vdi를 의미한다.

    $ ls -l /dev/disk/by-uuid/
    or 
    $  sudo blkid
    
    합계 0
    lrwxrwxrwx 1 root root 10  6월 30 14:14 16f0e1a8-5fe1-4d77-ad2b-52d3e27dcf75 -> ../../sda5
    lrwxrwxrwx 1 root root 10  6월 30 14:14 86a6d6e3-c9cd-4eff-bb0e-0e944cd0b31f -> ../../sdb1
    lrwxrwxrwx 1 root root 10  6월 30 14:14 b8bed244-c794-449b-97eb-434d6456ee85 -> ../../sda1
    
    
    

    1. UUID를 알아내는법은 위의 방법
    2. 파일->가상미디어관리자->하드디스크 방법 (Version 4.x는 안됨)

    • /etc/fstab 관련설정 
        options :  errors=remount-ro 변경사용중
                    ( default 사용하면 booting 중 문제발생)
        dump   :  사용안함
        pass     :  fsck 무결성 check   1    


    $ sudo vi /etc/fstab
    
    #
    # [file system="" ]   [ mount point=""]    [ type ]      [options]       [dump]   [pass]
    
    
    UUID=b8bed244-c794-449b-97eb-434d6456ee85 /                  ext4    errors=remount-ro 0       1
    
    
    ## 
    ## 새로 mount할 곳 ,뒤에 옵션 현재는 동일하게 사용 중, errors=remount-ro 0       1 
    ##    
    
    #AM437x 
    #UUID=35e74ae8-80c1-4832-bff6-674b4a93d6c2 /home/jhlee/am437x      ext4    errors=remount-ro     0       1
    
    
    ##DM8127                                                     
    UUID=86a6d6e3-c9cd-4eff-bb0e-0e944cd0b31f /home/jhlee/work   ext4    errors=remount-ro     0       1
    
    

    /etc/fstab 설정관련내용
         http://jikime.tistory.com/448
    • 아래 명령어로 TEST를 해보고 확인해보자


    $ sudo mount -a 
    $ mount     // 현재 마운트 된 디렉토리 확인 
    $ df -h      //  disk 용량 확인 
    


    3.6 File system 권한변경 

    기본으로 root 권한을 가지고 있으므로, user 권한으로 사용하기가 불편합니다.
    그래서 아래와 같이 사용할 directory 전체의 권한을 변경을 해줍니다.

    $sudo chown -R jhlee:jhlee work
    



    4. VDI 관리예제

    아래는 현재 제가 사용하고있는 방식이며 불필요하면 제거하고 빼는 방식을 사용합니다.
    기본적으로 다음과 같이 설정하고 사용을 합니다.


    • SATA0:  Ubunt_12.04 기본설치
    • SATA1:  AM437x BSP용 
    • SATA2:  DM8127-IPNC BSP용 및 APP 
    • SATA3:  DM368-IPNC BSP용 및 APP
    • SATA4:  Virtaul SD-DISK 용으로 SD BOOT를 하기위해서 가상 VDI입니다.




    • 파일->가상미디어관리자->하드디스크 

        위에서 VDI  UUID가 확인이 가능하지만, Linux에서는 파티션별로 UUID를 사용하기에 별로 의미가 없다.




    Ref.
         https://hasol.net/xe/index.php?document_srl=2266&mid=board_AVQK63



    댓글 없음 :