하드 디스크라면 일반적으로 마더보드에서 정보를 가져올 수 있다. 특히나 S.M.A.R.T 기능을 지원하면 모니터링을 위해서 꼭 필요한 다양한 정보 수집이 가능하다. 그런데 임베디드 시스템에서는 그러한 정보를 취득하는게 쉬운일은 아니다.  본 게시글에서는 emmc의 상태를 체크하는 방법에 대해서 확인하고 초기화하는 방법을 다룬다. 

     

      초기화 이후에 다시 부트이미지나 시스템이미지를 dd 또는 각 장치의 설치방법을 통해서 재설치하여 시스템을 준비해야 하므로 각 장치들에 대한 내용은 생략하고, 어떻게 상태를 확인하는지에 대한 정보를 정리하도록 하겠다. 

     

      우선은 이 작업을 위해서는 다른 부팅 방법이 제공되어야 한다. 예를들면 SD카드 또는 USB를 통해서 부트해야 된다. 그래야 시스템이 emmc를 사용하지 않는 환경이 될 것이며 그 상태에서 포맷을 하던지 어떻게 하던지는 본인이 해야할 몫이다. 

     

    필자는 SD메모리를 이요하여 부팅을 하고 아래의 절차를 진행하였다. 

     

     

    1. 테스트 대상 확인

      fdisk 명령을 이용하여 장치 정보를 수집한다. 우선 mmcblk1과 2가 확인이 되며, 필자는 16기가 SD 카드를 이용하였으므로, 간단하게 확인할 수 있다. 여기서 확인이 되지 않으면 dmesg를 통해 확인한다. 

     

    root@imx8mm:~# fdisk -l
    Disk /dev/mmcblk2: 7.3 GiB, 7818182656 bytes, 15269888 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
    Disklabel type: dos
    Disk identifier: 0xdd006814

    Device         Boot Start      End  Sectors  Size Id Type
    /dev/mmcblk2p1      20480 15269887 15249408  7.3G 83 Linux


    Disk /dev/mmcblk1: 14.9 GiB, 15931539456 bytes, 31116288 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
    Disklabel type: dos
    Disk identifier: 0x60018f50

    Device         Boot Start     End Sectors  Size Id Type
    /dev/mmcblk1p1      16384 7610367 7593984  3.6G 83 Linux
    root@imx8mm:~#

     

     

      여기서 확인이 불가능하다면 아래와 같이 확인이 가능하다.  녹색 부분을 보면 mmc1은 SDHC, mmc2는 MMC 임을 확인할 수 있다.  따라서 mmcblk1은 SD카드, mmcblk2는 EMMC가 된다.

     

    root@imx8mm:~# dmesg | grep mmc
    --------------------------------------------------
    mmcblk1 : 16GB SD / mmcblk2 : 8GB EMMC

    [    0.000000] Kernel command line: console=ttymxc0,115200 earlycon=ec_imx6q,0x30860000,115200 root=/dev/mmcblk1p1 rootwait rw cma=640M@1376M
    [    1.353038] mmc0: CQHCI version 5.10
    [    1.356769] sdhci-esdhc-imx 30b40000.mmc: Linked as a consumer to regulator.3
    [    1.400063] mmc0: SDHCI controller on 30b40000.mmc [30b40000.mmc] using ADMA
    [    1.408669] mmc1: CQHCI version 5.10
    [    1.412320] sdhci-esdhc-imx 30b50000.mmc: Got CD GPIO
    [    1.417521] sdhci-esdhc-imx 30b50000.mmc: Linked as a consumer to regulator.1
    [    1.459630] mmc1: SDHCI controller on 30b50000.mmc [30b50000.mmc] using ADMA
    [    1.467866] mmc2: CQHCI version 5.10
    [    1.506835] mmc2: SDHCI controller on 30b60000.mmc [30b60000.mmc] using ADMA
    [    1.674086] mmc1: host does not support reading read-only switch, assuming write-enable
    [    1.693530] mmc1: new high speed SDHC card at address aaaa
    [    1.696607] mmc2: Command Queue Engine enabled
    [    1.696626] mmc2: new HS400 Enhanced strobe MMC card at address 0001
    [    1.697174] mmcblk2: mmc2:0001 8GTF4R 7.28 GiB
    [    1.697331] mmcblk2boot0: mmc2:0001 8GTF4R partition 1 4.00 MiB
    [    1.697481] mmcblk2boot1: mmc2:0001 8GTF4R partition 2 4.00 MiB
    [    1.697608] mmcblk2rpmb: mmc2:0001 8GTF4R partition 3 512 KiB, chardev (243:0)
    [    1.701957] mmcblk1: mmc1:aaaa SU16G 14.8 GiB
    [    1.702357]  mmcblk2: p1
    [    1.716559]  mmcblk1: p1
    [    6.040038] EXT4-fs (mmcblk1p1): recovery complete
    [    6.261756] EXT4-fs (mmcblk1p1): mounted filesystem with ordered data mode. Opts: (null)
    [    9.680318] EXT4-fs (mmcblk2p1): warning: mounting fs with errors, running e2fsck is recommended
    [    9.701023] EXT4-fs (mmcblk2p1): recovery complete
    [    9.713118] EXT4-fs (mmcblk2p1): mounted filesystem with ordered data mode. Opts: errors=remount-ro
    [   10.549858] sdhci-esdhc-imx 30b40000.mmc: Dropping the link to regulator.3
    [   10.960526] mmc0: CQHCI version 5.10
    [   10.964280] sdhci-esdhc-imx 30b40000.mmc: Linked as a consumer to regulator.3
    [   11.006272] mmc0: SDHCI controller on 30b40000.mmc [30b40000.mmc] using ADMA
    [   11.113352] mmc0: queuing unknown CIS tuple 0x80 (2 bytes)
    [   11.120843] mmc0: queuing unknown CIS tuple 0x80 (3 bytes)
    [   11.133492] mmc0: queuing unknown CIS tuple 0x80 (3 bytes)
    [   11.142004] mmc0: queuing unknown CIS tuple 0x80 (7 bytes)

     

     

    2. 대상의 세부 정보 확인

       우선 시스템에서 동작하는 장치인지 확인을 위해서 인터럽트와 동작설정 정보를 확인한다. 

     

    (1) 인터럽트 정보 확인

    root@imx8mm:~# cat /proc/interrupts | grep mmc
     39:      10279          0          0          0     GICv3  54 Level     mmc0
     40:      10033          0          0          0     GICv3  55 Level     mmc1
     41:        492          0          0          0     GICv3  56 Level     mmc2
    108:          0          0          0          0  gpio-mxc  12 Edge      30b50000.mmc cd

     

     

    (2) 동작설정 확인

    root@imx8mm:~# cat /sys/kernel/debug/mmc2/ios
    clock:          200000000 Hz
    actual clock:   200000000 Hz
    vdd:            21 (3.3 ~ 3.4 V)
    bus mode:       2 (push-pull)
    chip select:    0 (don't care)
    power mode:     2 (on)
    bus width:      3 (8 bits)
    timing spec:    10 (mmc HS400 enhanced strobe)
    signal voltage: 1 (1.80 V)
    driver type:    0 (driver type B)
    root@imx8mm:~#

     

     

    3. 상세 정보를 확인한다. 

      얻을수 잇는 상세 정보중 일반적으로 필요한 내용인 ID, 제품명, 시리얼, 생산일자, 사용수명등이 있다.  아래의 결과를 보니, 뭐 대략 블라블라블라에 제작년도가 2019년 05월이다. 

     

    3.1. 장치(EMMC) 정보확인

    root@imx8mm:/sys/class/mmc_host/mmc2/mmc2:0001# cat cid
    150100384754463452069c6a95ed5600
    root@imx8mm:/sys/class/mmc_host/mmc2/mmc2:0001# cat manfid
    0x000015
    root@imx8mm:/sys/class/mmc_host/mmc2/mmc2:0001# cat oemid
    0x0100
    root@imx8mm:/sys/class/mmc_host/mmc2/mmc2:0001# cat name
    8GTF4R
    root@imx8mm:/sys/class/mmc_host/mmc2/mmc2:0001# cat serial
    0x9c6a95ed
    root@imx8mm:/sys/class/mmc_host/mmc2/mmc2:0001# cat date
    05/2019

     

    3.2. 장치 수명(Life Cycle) 확인

      쉘스크립트를 하나 만들어서 테스트를 진행한다. 이건 인터넷에서 확인한 내용인데 A와 B의 차이에 대한 설명이 없다.  그래서 이부분은 나중에 찾아보는 것으로...하고, 아래의 결과를 보니, 대략 10% 수명을 사용했다고 한다. 

    root@imx8mm:~# cat > ~/test.sh
    RES=`cat /sys/kernel/debug/mmc2/mmc2:0001/ext_csd`
    typea="${RES:536:2}" ;
    typeb="${RES:538:2}" ;
    typead=`echo "ibase=16; $typea"|bc`
    typebd=`echo "ibase=16; $typeb"|bc`
    echo "Type A percent: $((typead * 10)) %"
    echo "Type B percent: $((typebd * 10)) %"

    root@imx8mm:~# chmod 755 ~/test.sh
    root@imx8mm:~# ./test.sh
    Type A percent: 10 %
    Type B percent: 10 %

     

     

     

    4. 장치 초기화 및 배드섹터 검사

      이제 emmc를 초기화 하던지, 덤프를 이용해서 시스템 이미지를 복제하던지 해야되는데.. 그런 부분은 독자께서 사용하는 장치에 따라 다를 것이니 생략하고, 초기화 하면서 배드섹터가 있는지 검사해보도록 하자. 초기화하기 이전의 mmc는 ext4등으로 파일이 존재하고 ubuntu나 debian의 경우 이를 자동으로 마운트 한다 따라서, 포맷을 위해서는 파티션을 삭제 해 주어야 한다. 

     

    4.1. 장치초기화 

    1) EMMC 파티션 삭제

      "fdisk /dev/mmcblk2"를 실행 emmc에 있는 파티션을 삭제한다.  삭제 후에는 리부팅해주자.

    Command (m for help): p
    Disk /dev/mmcblk2: 7.3 GiB, 7818182656 bytes, 15269888 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
    Disklabel type: dos
    Disk identifier: 0x6f0a7df3

    Device         Boot Start      End  Sectors  Size Id Type
    /dev/mmcblk2p1      20480 15269887 15249408  7.3G 83 Linux

    Command (m for help): d
    Selected partition 1
    Partition 1 has been deleted.

    Command (m for help): w
    The partition table has been altered.
    Failed to remove partition 1 from system: Device or resource busy

    The kernel still uses the old partitions. The new table will be used at the next reboot.
    Syncing disks.

    root@imx8mm:~# reboot

     

     

    2) EMMC 파티션 생성

      이제 포맷을 위해서 파티션을 생성해주어야 한다. "fdisk /dev/mmcblk2"를 실행 후 파티션을 생성한다.

    Command (m for help): p
    Disk /dev/mmcblk2: 7.3 GiB, 7818182656 bytes, 15269888 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
    Disklabel type: dos
    Disk identifier: 0x6f0a7df3

    Command (m for help): n
    Partition type
       p   primary (0 primary, 0 extended, 4 free)
       e   extended (container for logical partitions)
    Select (default p): p
    Partition number (1-4, default 1):
    First sector (2048-15269887, default 2048):
    Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-15269887, default 15269887):

    Created a new partition 1 of type 'Linux' and of size 7.3 GiB.

    Command (m for help): w
    The partition table has been altered.
    Calling ioctl() to re-read partition table.
    [   56.655764]  mmcblk2: p1
    Syncing disks.

     

     

    3) 포맷하면서 배드블록 검사

      mkfs를 이용하여 파일시스템을 포맷하는데 -c 옵션을 사용하면 배드블록을 검사한다. 오류가 있으면 에러 카운트가 표시된다. 없다면 체크메시지가 사라지고 완료된다. 

    root@imx8mm:~# mkfs.ext4 -c /dev/mmcblk2p1
    mke2fs 1.44.5 (15-Dec-2018)
    Discarding device blocks: done
    Creating filesystem with 1908480 4k blocks and 477664 inodes
    Filesystem UUID: ed4e5a59-ea7f-4154-83e0-bf7e5db2e699
    Superblock backups stored on blocks:
            32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

    Checking for bad blocks (read-only test):   93.3% done, 0:23 elapsed. (0/0/0 errors)

    Checking for bad blocks (read-only test): done
    Allocating group tables: done
    Writing inode tables: done
    Creating journal (16384 blocks): done
    Writing superblocks and filesystem accounting information: done

    root@imx8mm:~#

     

     이번에는 emmc의 상태를 체크하고 초기화를 하면서 배드블럭 체크하는 방법을 정리해봤는데, 뭐 딱히 도움될지는 모르겠고, 아마 시스템 관리쪽 프로그램을 개발하는(특히 웹기반) 독자들께는 아주 조금의 도움이 될거라 생각된다. 

     

    아무튼. 끝.

     

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기