기존 Raspbian 설치를 더 작은 SD 카드로 복사


25

기존 및 구성된 Raspbian 설치를 더 작은 SD 카드로 복사 할 수 있습니까?

Raspbian을 처음 설치했을 때 32GB 카드 만 있으면되었고 분명히 필요한 것보다 큽니다.


시스템이 더 잘 작동하고 기본 파티션에 여유 공간이 더 있으면 카드 수명이 더 길어 지므로 너무 많이 축소하지 마십시오. 사용량을 두 배 이상 유지하십시오 (예 : 시스템이 2-3GB 인 경우 8GB 카드를 넣고 파티션을 늘려 사용 가능한 모든 공간을 채 웁니다). 시작하기 위해 파티션을 늘리지 않은 경우 32GB가 아니므로 축소하지 않아도됩니다.
— goldilocks

이것을 지적 해 주셔서 감사하지만 Raspberry는 현재 기본 설치이기 때문에 현재 1.8GB 만 사용하고 있습니다. 4GB면 충분할 것 같습니다.
— mwld

데비안 Wheezy를 처음 설치할 때 전체 크기로 자랐습니다. 이제 2.5GB로 줄 였지만 여전히 성공하지 못했습니다. 아래 내 의견을 참조하십시오.
— mwld


1
아래 답변 중 하나가 귀하의 질문을 충족시키는 경우 답변을 확인하십시오.
— 웨스 모드

답변:


12

이 답변에서는 사람들이 솔루션의 논리를 이해하고 다른 문제에 단계를 적용 할 수 있도록 단계별로 수행 할 작업을 보여줍니다.

그러나 첫째, 파일 시스템을 SD 카드에서 더 작은 (하지만 데이터에는 충분할 수있는) SD 카드로 마이그레이션하는 것은 일반적인 (급 성적이지 않은) 문제라는 점을 언급해야합니다.

요구 사항

마이크로 SD 카드 리더기가 장착 된 랩톱과 Linux (우분투 선호)가 실행됩니다.

약어

PIBOX      : Raspberry Pi which is used
SD_CARD_A  : 8GB micro SD card which is used on PIBOX and on which Raspbian-lite (the OS) is installed
SD_CARD_B  : 2GB micro SD card which will be used on PIBOX and on which Raspbian-lite (the OS) will be installed

SD_CARD_A의 파티션

PIBOX가 실행되는 동안 파티션이 나열됩니다 (필요하지 않은 시스템 파티션은 여기에 표시되지 않음).

root@pibox:~# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/root      ext4      7.3G  1.1G  5.9G  16% /
/dev/mmcblk0p1 vfat       63M   21M   43M  33% /boot

SD_CARD_A에는 /및 로 2 개의 파티션이 있습니다 /boot. 총 2GB도 사용되지 않습니다.

SD_CARD_A 백업

PIBOX를 종료하고 정지 한 후, PIBOX 보드에서 SD_CARD_A를 꺼내 랩톱의 카드 리더기에 넣습니다.

SD_CARD_A의 파티션이 자동으로 우리와 같은 시스템에 장착 /dev/sdc1하고 /dev/sdc2.

root@mylaptop:~# df -Th
Filesystem                    Type      Size  Used Avail Use% Mounted on
/dev/sdb2                     ext4       22G   13G  7.9G  63% /
/dev/sdb1                     vfat      197M  2.6M  195M   2% /boot/efi
/dev/sda8                     ext4       66G   11G   52G  17% /home
/dev/sdc1                     vfat       63M   21M   43M  33% /media/some_user_name/boot
/dev/sdc2                     ext4      7.3G  1.1G  5.9G  16% /media/some_user_name/some_uuid_serial

시스템에서 해당 파티션을 마운트 해제하여 성공적으로 작동합니다.

root@mylaptop:~# umount /dev/sdc1
root@mylaptop:~# umount /dev/sdc2

다음 단계에서 확인을 위해 SD_CARD_A의 장치 정보를 자세히 표시합니다.

root@mylaptop:~# fdisk -l /dev/sdc
Disk /dev/sdc: 7969 MB, 7969177600 bytes
246 heads, 62 sectors/track, 1020 cylinders, total 15564800 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: 0x2019f6d8

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            8192      137215       64512    c  W95 FAT32 (LBA)
/dev/sdc2          137216    15564799     7713792   83  Linux

위에서 SD_CARD_A의 용량이 8GB임을 알 수 있습니다.

SD_CARD_A를 pibox.img 파일로 복제합니다.

root@mylaptop:~# dd bs=4MB if=/dev/sdc of=pibox.img
1992+1 records in
1992+1 records out
7969177600 bytes (8.0 GB) copied, 416.582 s, 19.1 MB/s

복사 한 바이트의 크기를 확인하십시오 fdisk -l /dev/sdc. 명령으로 얻은 값과 같습니다 .

리눅스 루프백 모듈

Linux에는 루프백이라는 모듈이있어 파일을 블록 장치로 처리 할 수 ​​있습니다.

루프백 모듈을로드합니다.

root@mylaptop:~# modprobe loop

사용되지 않은 루프백 장치 경로를 찾습니다.

root@mylaptop:~# losetup -f /dev/loop0

이제 pibox.img 파일에 대한 루프백 장치를 만듭니다.

root@mylaptop:~# losetup /dev/loop0 pibox.img

파티션 변경에 대해 커널을 트리거합니다.

root@mylaptop:~# partprobe /dev/loop0

이전 작업이 성공했는지 확인합니다.

root@mylaptop:~# losetup /dev/loop0
/dev/loop0: [0806]:69 (/root/pibox.img)

SD_CARD_A와 비교하기 위해 루프백 장치 정보를 자세히 표시합니다.

root@mylaptop:~# fdisk -l /dev/loop0
Disk /dev/loop0: 7969 MB, 7969177600 bytes
255 heads, 63 sectors/track, 968 cylinders, total 15564800 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: 0x2019f6d8

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      137215       64512    c  W95 FAT32 (LBA)
/dev/loop0p2          137216    15564799     7713792   83  Linux

위에서 루프백 장치 크기 (= 7969177600 바이트)와 파티션이 SD_CARD_A와 동일하다는 것을 알 수 있습니다.

기본 수학

이제부터는 파티션에 중점을 둘 것 /dev/loop0p2입니다. 이름을 THE_PARTITION으로 지정하십시오 .

블록 크기는 512 바이트입니다 (Units = sectors .....로 시작하는 행에 인쇄 됨)

THE_PARTITION은 블록 137216에서 시작하여 블록 15564799에서 끝납니다. 이는 크기가 15427584 blocks(= 15564799-137216 + 1) 임을 의미합니다 .

따라서 바이트 단위의 THE_PARTITION의 크기는 7898923008 bytes(= 512 * 15427584)입니다.

SD_CARD_B에 THE_PARTITION을 맞추기 위해 새로운 크기 3710940 blocks 또는 다른 말로 1900001280 bytes(= 512 * 3710940) 원합니다.

따라서 새로운 끝 블록 번호는 (= 137216) + (= 3710940)- 로 3848155계산됩니다 .start block numbersize in blocks1

파일 시스템과 파티션

서로 오해해서는 안되는 2 가지 작업이 있습니다.

  • 파일 시스템 크기 조정 THE_PARTITION에서 파일 시스템의 크기를로 설정하여 축소합니다 3710940 blocks.
  • 파티션 크기 조정 종료 블록 번호를로 설정하여 THE_PARTITION을 축소합니다 3848155.

파일 시스템 축소

파일 시스템을 축소하기 전에 파일 시스템을 클린으로 표시해야합니다 e2fsck.

root@mylaptop:~# e2fsck -f /dev/loop0p2
e2fsck 1.42.9 (4-Feb-2014)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop0p2: 41175/475776 files (0.2% non-contiguous), 309183/1928448 blocks

로 파일 시스템을 축소합니다 resize2fs.

root@mylaptop:~# resize2fs /dev/loop0p2 3710940s
resize2fs 1.42.9 (4-Feb-2014)
Resizing the filesystem on /dev/loop0p2 to 463867 (4k) blocks.
The filesystem on /dev/loop0p2 is now 463867 blocks long.

수축 파티션

THE_PARTITION 번호가 무엇인지 알아 봅니다 parted.

root@mylaptop:~# parted /dev/loop0
GNU Parted 2.3
Using /dev/loop0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print                                                            
Model: Loopback device (loop)
Disk /dev/loop0: 7969MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      4194kB  70.3MB  66.1MB  primary  fat16        lba
 2      70.3MB  7969MB  7899MB  primary  ext4

(parted) quit

THE_PARTITION을 (와) 축소 parted합니다.

root@mylaptop:~# parted /dev/loop0 unit s resizepart 2 3848155
Warning: Shrinking a partition can cause data loss, are you sure you want to continue?
Yes/No? Yes  

우리는 루프백 장치로 끝났습니다. 우리는 그것을 분리합니다.

root@mylaptop:~# losetup -d /dev/loop0

이미지 파일 잘라 내기

새로운 파티션 테이블을 확인합니다.

root@mylaptop:~# fdisk -l pibox.img 

Disk pibox.img: 7969 MB, 7969177600 bytes
255 heads, 63 sectors/track, 968 cylinders, total 15564800 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: 0x2019f6d8

    Device Boot      Start         End      Blocks   Id  System
pibox.img1            8192      137215       64512    c  W95 FAT32 (LBA)
pibox.img2          137216     3848155     1855470   83  Linux

출력에서 THE_PARTITION의 끝 블록 번호가 줄어든 것을 알 수 from 15564799 to 3848155있습니다.

우리가 사용하는 마지막 블록은 3848155입니다. 블록 번호는 0부터 시작합니다. 따라서 총 3848155 + 1 개의 블록이 있으며 pibox.img 파일의 새 크기는1970255872 bytes (= (3848155 + 1) * 512) 여야합니다 .

pibox.img 파일을 자릅니다.

root@mylaptop:~# truncate --size=1970255872 pibox.img

pibox.img 파일의 새로운 크기를 확인합니다.

root@mylaptop:~# ls -l pibox.img 
-rw-r--r-- 1 root root 1970255872 Oct 13 21:53 pibox.img

SD_CARD_B 생성

SD_CARD_B를 랩톱의 카드 리더기에 넣었습니다. SD_CARD_B의 파티션이 자동으로 우리와 같은 시스템에 장착 /dev/sdc1하고 /dev/sdc2.

root@mylaptop:~# df -Th
Filesystem                    Type      Size  Used Avail Use% Mounted on
/dev/sdb2                     ext4       22G   13G  7.9G  63% /
/dev/sdb1                     vfat      197M  2.6M  195M   2% /boot/efi
/dev/sda8                     ext4       66G   11G   52G  17% /home
/dev/sdc1                     vfat       63M   21M   43M  33% /media/some_user_name/boot
/dev/sdc2                     ext4      1.8G  1.6G   59M  97% /media/some_user_name/some_uuid_serial

위에서 SD_CARD_B의 용량이 2GB임을 알 수 있습니다.

SD_CARD_B에서 성공적으로 작동하기 위해 시스템에서 해당 파티션을 마운트 해제합니다.

root@mylaptop:~# umount /dev/sdc1
root@mylaptop:~# umount /dev/sdc2

pibox.img 파일을 SD_CARD_B에 복제합니다.

root@mylaptop:~# dd bs=4MB if=pibox.img of=/dev/sdc
492+1 records in
492+1 records out
1970255872 bytes (2.0 GB) copied, 646.967 s, 3.0 MB/s

복사 한 바이트의 크기를 확인하십시오 ls -l pibox.img. 명령으로 얻은 값과 같습니다 .

PIBOX 부팅

랩톱에서 SD_CARD_B를 꺼내 PIBOX 보드에 넣은 후 시스템을 부팅하고 PIBOX 콘솔에 로그인합니다.

파티션을 나열합니다 (여기서 불필요한 다른 시스템 파티션은 여기에 표시되지 않습니다).

root@pibox:~# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/root      ext4      1.8G  1.1G  601M  64% /
/dev/mmcblk0p1 vfat       63M   21M   43M  33% /boot

좋아요 루프백을 설정하는 데 필요한 것들 중 일부가 오래 걸리고 불필요하다고 생각합니다. 확인하고 싶을 수도 있습니다. 매우 유사한 질문과 매우 유사한 것 : raspberrypi.stackexchange.com/a/29952/5538
— goldilocks

@ goldilocks는 테스트되지 않았지만 루프백을 사용해야한다고 생각합니다. parted가 이미지 파일에서 직접 작업 할 수 없다는 것을 알고있는 한 작업을 위해서는 장치 인터페이스가 필요합니다.
— vaha

하지만 그래, 난 당신이 귀찮게하지 않아도 찾을 생각 losetup하거나 -o loop=whatever. 다른 게시물에 따라 방금 사용 mount -o offset=123 /imagefilepath /mntpoint하고 루프백을 사용하는 것은 암시 적입니다. 나는 그것이 리눅스에서 일반적으로 사실이라고 가정합니다. 시도하십시오. 그런 다음 파티션이 가상 "루프백 장치"를 통해 마운트되었다고 말하는 것으로 줄일 수 있습니다.
— goldilocks

5

당신이 사용하는 경우 dd if=/dev/sdx of=/path/to/image bs=1M, /dev/sdx이미지가 항상 전체 카드의 크기가 될 것이다, 그래서 전체 "디스크"를 의미합니다.

대신, 파티션 번호는 dd if=/dev/sdxn ...어디에 있는지 사용해야 n합니다.

/boot파티션과 파티션에 대해 한 번씩 두 번 수행해야 할 것입니다 /.

그런 다음 새 카드에 최소한 두 개의 원래 파티션보다 큰 파티션을 작성하여 내용을 다시 작성해야합니다.


3

parted (파티션 편집기)와 같은 것을 사용하여 기본 파티션을 더 작은 크기로 줄인 다음 Clonezilla와 같은 도구를 사용하여 더 작은 파티션에서 새 카드로 복사하십시오. 그러나 다른 컴퓨터에서이 작업을 수행해야 할 수도 있습니다.


불행히도 이것은 작동하지 않았습니다. GParted를 사용하여 파티션을 2.5GB로 줄였습니다. 그러나 USB 스틱으로 이미지를 만들려고 할 때 이미지 크기가 커졌습니다 (4.3GB-FAT 파일 크기 제한으로 인해 전체 32GB를 복사하고 4.3GB로 중지했다고 생각합니다).
— mwld

2
dd if=/dev/sdx of=/path/to/image bs=1M이 스레드 의 명령 을 사용했습니다 : raspberrypi.stackexchange.com/questions/311/…
— mwld

2.5GB의 기본 파티션을 이미지에 복사하고 부팅 가능한 Raspbian을 사용하여 SD 카드를 만드는 방법에 대한 아이디어가 있습니까?
— mwld

답장을 늦게 보내서 미안해. 4GB SD 카드로 시작하여 이미지를 만든 다음 해당 이미지를 8GB 이상의 카드에 썼습니다. 나는 내가 한 일을 위해 더 큰 파티션을 사용할 필요가 없었습니다. SD 카드에 개별 파티션의 이미지를 만들 수있는 도구를 모르겠습니다.
— Jerry Gagnon

3
  1. 이미 언급 한 방법 중 하나를 사용하여 카드 이미지를 만듭니다. 내 Raspberry Pi를 어떻게 백업합니까?

  2. http://sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/ 의 스크립트를 사용하여 이미지 크기를 조정하십시오

  3. 작은 크기의 이미지를 새로운 작은 카드로 복원


내 raspbian 이미지를 백업하기 위해 동일한 대상을 달성하려고 시도 하면서이 페이지에 부딪 쳤지 만 카드의 전체 데이터 만 관련 데이터를 원하지 않습니다. 위의 제안에 따라 sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer 에서 스크립트를 찾고 있었지만 찾을 수 없었습니다. 어딘가에이 링크가 있으면 업데이트 할 수 있습니까?
— shallyverma

여전히 링크에 액세스 할 수 있으며 게시물 자체는 스크립트입니다. 스크립트를 파일에 복사하고 이름을 지정하고 script.sh파일을 사용하여 실행 가능하게 chmod만들고 실행하십시오.
— Mihir

1

지금은 rsync딸꾹질없이 한 디스크에서 다른 디스크로 파일 시스템을 복사 하는 데 사용 했습니다. rsync를 사용하면 디바이스의 블록 레벨 사본을 수행하지 않고 파일 시스템의 컨텐츠를 복사한다는 장점이 있습니다. 결과적으로 대상 드라이브에 데이터를 저장할 수있는 충분한 공간이있는 한 대상 및 소스 드라이브의 크기는 중요하지 않습니다.

그래서 내가하는 방법은 다음과 같습니다.

  1. 원하는 새 작은 SD 카드에 새 라즈 비안 설치를 만듭니다.
  2. 새 설치로 부팅하고 파일 시스템을 확장하여 전체 디스크를 채 웁니다. 파이를 종료하십시오.
  3. 이제 새 카드와 기존 카드를 마운트하고 이전 카드 rsync -avx oldFilesystem newFilesystem의 파일 시스템으로 새 카드의 파일 시스템을 복사 / 덮어 쓰는 데 사용하십시오.
  4. 마지막으로 새 시스템으로 부팅하고 rpi-update펌웨어가 일관되고 최신 상태인지 확인하십시오.

그런 다음 새 카드에는 완벽하게 작동하는 Raspbian 시스템이 설치되어 있어야합니다.


따라서이 방법 (3 단계)에 2 개의 SD 카드 리더가 필요합니까?
— Victor Van Hee

두 개의 SD 카드 리더기 또는 중간 장치. 이전 파일 시스템을 하드 드라이브의 폴더로 재 동기화 한 다음 리더를 선택하지 않으려면 해당 폴더를 두 번째 SD 카드로 재 동기화하십시오.
— sdenton4

1

SD 카드의 모든 데이터를 백업하고 복원하기 위해 쉘 스크립트를 만들었습니다. 먼저 내 프로젝트에 해당하는 일부 데이터를 삭제하고 파티션을 최소 크기로 축소하여 이미지가 SD 카드의 데이터만큼 커집니다. 또한 스크립트는 이미지의 * .zip 파일을 만듭니다. 생성 된 이미지를 다른 SD 카드로 복원하면 파티션이 최대 크기로 확대됩니다. 스크립트는 다른 답변에서 언급 된 명령을 사용합니다. 이것은이 크기의 내 주먹 껍질 스크립트이므로 그것을 만드는 데 몇 시간이 걸렸으며 완벽한 제트기가 아닙니다. 특히 resize2fs 및 fdisk의 반환 값을 처리하는 방법을 모르므로 사용자가 필요한 값을 입력해야합니다. 그 문제를 해결할 아이디어가 있습니까? 이 스크립트가 다른 사람을 돕기를 바랍니다. 자유롭게 편집하고 개선하십시오.

"Usage:
    <skriptname> -b <path>                  create backup of SC Card (dev/mmcblk0) to file <path>/JJJJ-MM-DD_HHMM.img
    <skriptname> -r <path>/FILENAME.img     restore an exitsting image (<path>/FILENAME.img) to the SD Card (dev/mmcblk0) 
    <skriptname> -r <path>/FILENAME.zip     unzip and restore an exitsting image (<path>/FILENAME.zip) to the SD Card (dev/mmcblk0)
    <skriptname> -h                         show this hlep

여기있어:

#!/bin/bash 

# check if the user is root
if (( $EUID != 0 )); then
  echo "This script requires root privileges please run as root"
  exit
fi


while getopts ":b:r:h" opt; do
  case $opt in
    b)
      mode="backup"
      OUTPATH=$OPTARG
      ;;
    r)
      mode="restore"
      DIRFILENAME=$OPTARG
      ;;
    h)
      mode="help"
      ;;
    \?)
      echo "Invalid option: -$OPTARG. Use -h for help" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument. Use -h for help" >&2
      exit 1
      ;;
  esac
done
# no option
if [ $OPTIND == 1 ]
then
  echo "$(basename "$0") needs an option! Use -h for help"
  exit 1
fi


myMount(){
  # create mountpoint if not existing
  if [ ! -d /tmp/sd2/ ] ; then
    mkdir /tmp/sd2
  fi

  # mount partition
  mount -v -t ext4 /dev/mmcblk0p2 /tmp/sd2
  err=$?
  if [ $err != 0 ]; then
    echo "mount failed error: $err"
    exit 1
  fi
}

myUmount(){
  cd /home/ # otherwise umount will fail
  # fuser -vm /tmp/sd2/

  # umount partition
  umount -v /tmp/sd2
  err=$?
  if [ $err != 0 ]; then
    echo "umount failed error: $err"
    exit 1
  fi
}

myEnlarge(){
  echo "enlarge partition..."
  # enlarge partition is not posible with fdisk -> delete and recreate it
  (
  echo d # delete partition
  echo 2 # patition number
  echo n # add a new partition
  echo p # primary partition
  echo 2 # partition number
  echo   # first sector (accept default: varies)
  echo   # last sector (accept default: varies)
  echo w # write changes
  ) | fdisk /dev/mmcblk0

  echo "\n check filesystem... "
  e2fsck -f -v -C 0 /dev/mmcblk0p2

  # enlarge filesystem to maxsize
  resize2fs -p /dev/mmcblk0p2
}

case "$mode" in
"help")
  echo "Usage:
    $(basename "$0") -b <path>                  create backup of SC Card (dev/mmcblk0) to file <path>/JJJJ-MM-DD_HHMM.img
    $(basename "$0") -r <path>/FILENAME.img     restore an exitsting image (<path>/FILENAME.img) to the SD Card (dev/mmcblk0) 
    $(basename "$0") -r <path>/FILENAME.zip     unzip and restore an exitsting image (<path>/FILENAME.zip) to the SD Card (dev/mmcblk0)
    $(basename "$0") -h                         show this hlep
--------------------------------
Adrian Zeitler, Germany 2017"
  ;;
"backup")  ####################################### backup ####################################### 
  echo "an image of the SD Card (/dev/mmcblk0) whitch is as smal as possible will be created to $OUTPATH."
  # ------------------  delete some data --------------------

  echo "Do you want to delete tempfiles? [y/n]" 
  read delfiles

  if [ "$delfiles" = "y" ]
    then
      echo "Delete tempfiles..."

      myMount

      # remove some data
      cd /tmp/sd2/home/alarm/
      rm -v -f hagelbeere.db
      rm -v -f HAILcam.log
      rm -v -f HAILcam.log.1
      rm -v -f test.jpg

      myUmount

    elif [ "$delfiles" = "n" ]
      then
    echo "I don't delete anything."
    else
    echo "Sorry, I didn't understand."
    exit 1
  fi


  # --------------------------------------------------------------
  # shrink partition 2 to minimum size

  echo "check file system... "
  e2fsck -f -v -C 0 /dev/mmcblk0p2
  err=$?
  if [ $err != 0 ]; then
    echo "file system check failed, error: $err"
    exit 1
  fi

  echo "shrink filesystem of partition 2 to minimum size..."
  resize2fs -p -M /dev/mmcblk0p2
  err=$?
  if [ $err != 0 ]; then
    echo "resize2fs failed, error: $err"
    exit 1
  fi
  # --> Das Dateisystem auf /dev/mmcblk0p2 ist nun 692365 Blöcke groß.

  echo "Please tell me the new filesystem size displayed above:"
  read size
  # from resize2fs blocksize, fdisk wants sector: sector = block * 8
  size=$(( $size*8 ))

  # shrink partition is not posible with fdisk -> delete and recreate it
  (
  echo d # delete partition
  echo 2 # patition number
  echo n # add a new partition
  echo p # primary partition
  echo 2 # partition number
  echo   # first sector (accept default: varies)
  echo +$size  # last sector
  echo w # write changes
  ) | fdisk /dev/mmcblk0
  err=$?
  if [ $err != 0 ]; then
    echo "fdisk failed, error: $err"
    exit 1
  fi


  # --------------------------------------------------------------

  # fill unused space with zeros
  echo "Do you want to fill unused space with zeros? [y/n]" 
  read fillzeros


  if [ "$fillzeros" = "y" ]
    then
      echo "Copy zeros. This will end up with an error. But this is ok."

      myMount    

      dd if=/dev/zero | pv | dd of=/tmp/sd2/nullen.datei conv=noerror,notrunc,sync bs=10240
      # exits with error -> this is normal

      # dlelete zeros
      rm -v -f /tmp/sd2/nullen.datei
      sync

      myUmount

    elif [ "$fillzeros" = "n" ]
      then
    echo "I don't delete anything."
    else
    echo "Sorry, I didn't understand."
    exit 1
  fi

  # --------------------------------------------------------------

  # find out end of partition
  fdisk -l /dev/mmcblk0
  echo "Please tell me the end of mmcblk0p2 displayed above."
  read count



  DATE=$(date +"%Y-%m-%d_%H%M")
  IMGFILENAME=$DATE.img 
  echo "Do you want to create image with filename $OUTPATH$IMGFILENAME? [y/n]"
  read answer
  if [ "$answer" = "y" ]
  then
    echo "Do you want to create a *.zip file of the created image? [y/n]"
    read zip
    echo "Do you want to enlarge partition 2 to maxsize after image creation? [y/n]"
    read enlarge

    echo "create image..."
    cd $OUTPATH
    # create image with dd, stop at and of partition
    # count=N   copy only N input blocks
    # bs=BYTES  read and write up to BYTES bytes at a time = block size
    # pv    show status
    dd if=/dev/mmcblk0 | pv -s $(( $count*512 )) | dd of=$IMGFILENAME bs=512 count=$count
    err=$?
    if [ $err != 0 ]; then
      echo "dd failed error: $err"
      exit 1
    fi

    # --------------------------------------------------------------
    # create zip file
    # or like this:
    # sudo dd if=/dev/sdX | pv |gzip > /pfad/zur/datei.img.gz
    if [ "$zip" = "y" ]
    then
      echo "create zip file..."
      zip $DATE.zip $IMGFILENAME
    fi
    # --------------------------------------------------------------
  fi

  # --------------------------------------------------------------
  # enlarge partition 2

  if [ "$enlarge" = "y" ]
  then
    myEnlarge
  fi

  ;; #end case mode backup
"restore")  ####################################### restore ####################################### 
  #chek if image exists
  if [[ -s "$DIRFILENAME" ]]
  then
    # check if file is an image or zip file
    if [[ $DIRFILENAME =~ \.img$ ]]
    then
      IMGFILENAME=$(basename "$DIRFILENAME")
    elif [[ $DIRFILENAME =~ \.zip$ ]]
    then
      ZIPFILENAME=$(basename "$DIRFILENAME")
    else
      echo "Not the right file format. I accept *.img and *.zip"
      exit 1
    fi
  else
    echo "Image file does not exist."
    exit 1
  fi
  echo "the file $DIRFILENAME will be restored to the SD Card /dev/mmcblk0"

  #change to the path of the imagefile
  SOURCEPATH=$(dirname "$DIRFILENAME")
  cd $SOURCEPATH


  if [ "$ZIPFILENAME" != "" ]
  then
    echo "unzip file"
    # change file extention form zip zu img
    l=$(( ${#ZIPFILENAME}-3 ))
    IMGFILENAME="${ZIPFILENAME:0:l}img"
    unzip $ZIPFILENAME
  fi

  echo "Do you realy want to restore $SOURCEPATH/$IMGFILENAME to the SD card /dev/mmcblk0? 
  Warning: all data on the device /dev/mmcblk0 will be lost! [y/n]"
  read answer
  if [ "$answer" = "y" ]
  then
    echo "Do you want to enlarge partition 2 to maxsize after restoring? [y/n]"
    read enlarge
    echo "restore image..."
    filesize=$(wc -c <"$IMGFILENAME")
    echo "Filesize = $filesize Byte"
    dd if=$IMGFILENAME | pv -s $filesize | dd of=/dev/mmcblk0 bs=512
    err=$?
    if [ $err != 0 ]; then
      echo "dd failed error: $err"
      exit 1
    fi
  fi

  # --------------------------------------------------------------
  # enlarge partition 2
  if [ "$enlarge" = "y" ]
  then
    myEnlarge
  fi

  ;; #end case mode restore
esac

0

내가 찾은 가장 쉬운 해결책은 위에서 설명한 dd 명령을 사용하여 원래의 큰 카드를 백업 한 다음 piwriter와 같은 것을 사용하여 작은 카드로 이미지를 복원하는 것입니다. dd도 잘 작동 할 수 있습니다 ... 잘 모르겠습니다. PiWriter는 공간이 부족하여 오류를 반환했지만 이미지에 작은 카드 크기를 초과하는 실제 데이터가 포함되어 있지 않기 때문에 빈 섹터가 잘 렸습니다. 이것이 의미하는 바가 확실하지 않습니다 ... 파티션을 확인하거나 복구해야 할 수도 있지만 Pi에 넣었을 때 작동했는지 확인할 수 있습니다.


1
이것은 매우 위험한 조언이므로 실제로 크기를 넘어서는 데이터가 있는지는 알 수 없습니다. 우리는보다 신뢰할 수 있고 입증 된 솔루션을 찾고 있습니다.
— lenik

나는 위험하게 살고, 내가 말할 수있는 것은 무엇이든;) 진지하게도 dd 또는 파티션 맵 작업에 대한 경험이 많지 않기 때문에 미지의 영역에 있습니다. 16GB 카드에서 8GB 카드로 이동하는 데이터는 약 800MB이기 때문에 운이 좋았습니다. 그러나 호기심으로, 파티션의 시작 부분에 모두 그룹화되도록 데이터를 먼저 조각 모음하는 방법이 있습니까? 해킹처럼 보이지만 어쩌면?
— Pooch

조각 모음에 대해 모르지만 파티션 크기를 조정하고 SD 카드의 시작 부분으로 옮길 수 있으므로 시작 부분 만 차지합니다. 단순한 dd보다 약간 오래 걸리지 만 결과는 훨씬 안정적입니다.
— lenik

0

이전 버전의 win32diskimager-RELEASE-0.1-r15-win32이미지를 사용 하여 이미지를 읽고 8GB SD 카드에서도 4GB의 이미지를 만든 다음 최신 버전의 win32diskimager로 이미지를 씁니다.

이전 버전은 모든 오류를 건너 뛰기 때문에 이전 버전을 사용합니다.


새 버전 0.95에는 옵션을 제공하지 않으므로 모든 오류를 건너 뛸 수 있습니다. 불행히도 sourceforge 페이지 는 사용 가능한 옵션을 나열하지 않습니다. 프리 베타 소프트웨어를 사용하는 것은 약간 위험합니다
— Greenonline

모든 오류를 건너 뛸 프로그램을 사용하여 따뜻하고 퍼지를 얻지 못합니다.
— RufusVS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.