기존 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.