既存のRaspbianインストールを小さなSDカードにコピーします


25

既存の構成済みのRaspbianインストールをより小さなSDカードにコピーすることはできますか?

Raspbianを最初にインストールしたとき、必要なサイズよりも明らかに大きい32 GBのカードしか手元にありませんでした。


システムのパフォーマンスは向上し、プライマリパーティションの空き容量が増えてカードの寿命が長くなります。そのため、圧縮しすぎないでください。使用量を少なくとも2倍にしてください(たとえば、システムが2〜3 GB 8GBカード、およびパーティションを拡張して使用可能なすべてのスペースを埋めます)。最初からパーティションを拡大しなかった場合、32 GBにならないため、縮小する必要はないことに注意してください。
goldilocks

これを指摘してくれてありがとう、しかし私のRaspberryは本当に基本的なインストールなので、たった1.8 GBを使用しています。4 GBで十分だと思います。
mwld

Debian Wheezyを最初にインストールしたとき、フルサイズまで成長したと思います。今では2.5 GBに縮小しましたが、まだ成功していません。以下の私のコメントを参照してください。
mwld


1
以下の回答のいずれかが質問を満たしている場合は、回答を確認してください。
ウェスモード

回答:


12

この回答では、ソリューションの背後にあるロジックを理解し、他の問題にステップを適用できるようにするために、ステップバイステップで何をすべきかを示します。

ただし、まず、ファイルシステムをSDカードからより小さな(ただしデータには十分な大きさの)SDカードに移行することは一般的な(Raspi固有ではない)問題であると述べておく必要があります。

必要条件

マイクロSDカードリーダーとLinux(私はUbuntuが好き)が実行されているラップトップ。

略語

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をシャットダウンして停止した後、SD_CARD_AをPIBOXボードから取り出し、ラップトップのカードリーダーに挿入します。

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ループバックモジュール

Linuxには、ファイルをブロックデバイスとして処理するloopbackというモジュールがあります。

ループバックモジュールをロードします。

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 = sector .....で始まる行に出力されます)

THE_PARTITIONはブロック137216から始まり、ブロック15564799で終わります。つまり、サイズは15427584 blocks(= 15564799-137216 + 1)になります。

したがって、バイト単位のTHE_PARTITIONのサイズは7898923008 bytes(= 512 * 15427584)です。

THE_PARTITIONをSD_CARD_Bに収めるために、新しいサイズ 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 (= + 1(3848155)* 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し、ループバックの使用は暗黙的です。私はそれが今のLinuxでは一般的だと思います-試してみてください。その後、仮想「ループバックデバイス」を介してパーティションがマウントされていると言うだけに減らすことができます。
goldilocks

5

を使用した場合dd if=/dev/sdx of=/path/to/image bs=1M/dev/sdx「ディスク」全体を指すため、画像は常にカード全体のサイズになります。

代わりに、パーティション番号のdd if=/dev/sdxn ...場所を使用する必要がありますn

これはおそらく2回行う必要があります。1回は/bootパーティション用、もう1回は/パーティション用です。

次に、新しいカードに、少なくとも2つの元のパーティションと同じ大きさのパーティションを作成して、コンテンツを元に戻す必要があります。


3

parted(パーティションエディター)のようなものを使用してプライマリパーティションを小さいサイズに縮小し、Clonezillaなどのツールを使用して、現在の小さいパーティションから新しいカードにコピーします。ただし、これは別のコンピューターで行う必要があります。


残念ながら、これは機能しませんでした。GPartedでパーティションを2.5 GBに縮小しました。しかし、それからUSBスティックにイメージを作成しようとすると、サイズが大きくなりました(4.3 GB-しかし、32 GB全体をコピーし、FATファイルサイズの制限のために4.3 GBで停止したいと思います)。
mwld

2
dd if=/dev/sdx of=/path/to/image bs=1Mこのスレッドのコマンドを使用しました:raspberrypi.stackexchange.com/questions/311/…–
mwld

2.5 GBのプライマリパーティションをイメージにコピーし、それからブート可能なRaspbianを使用してSDカードを作成する方法についてのアイデアはありますか?
mwld

返事が遅くなってごめん。私は4GBのSDカードから始め、画像を作成し、その画像を8GB以上のカードに書き込みました。私が取り組んだことのために、より大きなパーティションを使用する必要はまだありません。SDカードに個々のパーティションのイメージを作成するだけのツールは知りません。
ジェリーガニョン

3
  1. 既に説明した方法のいずれかを使用してカードの画像を作成します-Raspberry Piをバックアップするにはどうすればよいですか?

  2. http://sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/のスクリプトを使用して、画像を縮小します

  3. 縮小した画像を新しい小さなカードに復元します


私は私の目標を達成しようとしているので、このページに行きました。しかし、私はカード上の関連データのみをカード全体にしたくないのです。上記の提案に従って、私はここでスクリプトを探していましたsirlagz.net/2013/03/10/script-automatic-rpi-image-downsizerが見つかりませんでした。どこかで利用可能な場合、このリンクを更新できますか?
-hallyverma

私はまだリンクにアクセスでき、投稿自体はスクリプトです。スクリプトをファイルにコピーして名前を付けscript.sh、使用してファイルを実行可能にしchmod、実行します。
-Mihir

1

私はrsyncしばらくの間、あるディスクから別のディスクにファイルシステムをコピーするために使用してきました。rsyncを使用する利点は、デバイスのブロックレベルのコピーではなく、ファイルシステムのコンテンツをコピーすることです。その結果、ターゲットドライブにデータを保持するのに十分なスペースがある限り、ターゲットドライブとソースドライブのサイズは実際には関係ありません。

だからここに私がそれをする方法があります:

  1. ご希望の新しい小型のSDカードに新しいraspbianインストールを作成します。
  2. 新しいインストールを起動し、ファイルシステムを拡張してディスク全体を埋めます。piをシャットダウンします。
  3. 新しいカードと古いカードをマウントrsync -avx oldFilesystem newFilesystemし、新しいカードのファイルシステムを古いカードのファイルシステムでコピー/上書きするために使用します。
  4. 最後に、新しいシステムを起動し、実行rpi-updateしてファームウェアの一貫性と最新性を確認します。

この後、新しいカードには完全に機能するRaspbianシステムがインストールされているはずです。


この方法(ステップ3)では、2つのSDカードリーダーが必要ですか?
ビクターヴァンヒ

2つのSDカードリーダーまたは中間デバイス。リーダーをピックアップしたくない場合は、古いファイルシステムをハードドライブ上のフォルダーにrsyncし、そのフォルダーを2番目のSDカードにrsyncできます。
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
これは非常に危険なアドバイスです。サイズを超えるデータが実際にあったかどうかはわかりません。より信頼性が高く実績のあるソリューションを探しています。
レニック14年

私は危険に住んでいます、何と言えますか?)真剣にddやパーティションマップを操作した経験はあまりないので、ここでは未知の領域にいます。16GBのカードから8GBのカードに移行するデータが約800MBしかなかったので、おそらく幸運だったでしょう。しかし、好奇心から、おそらく最初にデータをデフラグして、パーティションの先頭ですべてがグループ化されていることを確認する方法はありますか?ハックらしいが、多分?
プーチ

デフラグについては知りませんが、パーティションのサイズを変更してそれらをSDカードの先頭に移動することは間違いなくあり、先頭のみを占有します。単純なddより少し時間がかかりますが、結果の信頼性ははるかに高くなります。
レニック14年

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.