経緯

メイン機として使っているノートPCのメインディスプレイが壊れてから早半年,とりあえずポータブルのサブディスプレイをつないで使っていました. が,先日HDMI端子からの出力が一瞬出来なかったので本格的にやばくなってきました.

親からは夏休みに買ってほとんど使ってないPCを譲ってくれるとは言ってくれましたが,PCがいつ壊れるかわからないし夏休みまで持ったとして環境をプレーンなOSから1から構築するのも絶対にいやなのでひとまずddでディスクイメージをimg化することにします.

閲覧上の注意

この記事はとある合格発表の前日の記事となるため,テンションが異常です.ご閲覧時はご注意下さい.

やったこと

1. AWSアカウントの取得

省略.普通に登録してついでにS3のGracierバケットも作っておきました.

私はクレカを持っていないので,手持ちのKyashに1,000円以上のチャージがあるかも確認しておきます.

2021-06-16%2007.28.09%20ap-northeast-3.console.aws.amazon.com%200e1f6fbca5ba

2. 現在のディスクの使用状況

fdisk -lで確認.

┌──[~]
└(ノ≧∇≦)ノ $ sudo fdisk -l | grep sda
[sudo] kaniyama のパスワード:
ディスク /dev/sda: 447.13 GiB, 480103981056 バイト, 937703088 セクタ
/dev/sda1         34   1048575   1048542   512M EFI システム
/dev/sda2    1048576 667942911 666894336   318G Linux root (x86-64)
/dev/sda3  667942912 670040063   2097152     1G Linux ファイルシステム
/dev/sda4  670040064 670072831     32768    16M Microsoft 予約領域
/dev/sda5  670072832 937701375 267628544 127.6G Microsoft 基本データ

Windowsのパーティション飛ばして保存領域にすれば,3~4分割位でimg化出来ることを確認. 我がマシンのWindowsは我ながら不遇だとは思ってます(ゲーム用にしか使われてないので).

3. AWSへアップロードする準備

ddは無論archlinuxのインストールメディアあたりから行うので,AWSにアップロードする方法を確認します.

AWS-cliがpacmanにあるとは思わなんだ...これは楽勝っぽいぞ

試しにメイン機に入れてみます

エラー: python-botocore: "Jonathan Steel <mail@jsteel.org>" の署名は無効です
:: ファイル /var/cache/pacman/pkg/python-botocore-1.20.88-1-any.pkg.tar.zst は破損しています (無効または破損したパッケージ (PGP 鍵))。
ファイルを削除しますか? [Y/n] y
エラー: aws-cli: "Jonathan Steel <mail@jsteel.org>" の署名は無効です
:: ファイル /var/cache/pacman/pkg/aws-cli-1.19.88-1-any.pkg.tar.zst は破損しています (無効または破損したパッケージ (PGP 鍵))。
ファイルを削除しますか? [Y/n] y
エラー: 処理を完了できませんでした (無効または破損したパッケージ (PGP 鍵))
エラーが発生したため、パッケージは更新されませんでした。

あらぁ...正直私linuxにおけるパッケージの署名って概念がよくわかってないんですよね...

本家レポジトリによるとpipでのインストールが一番やぞと教えてくれたので,大人しくpipでインストールすることにします.

がなんかdocutilsがpip上でアンインストール出来ないと怒られる?

...ああなるほど,pacmanでインストールされてるんスね...

┌──[~]
└(ノ≧∇≦)ノ $ sudo pacman -Qs docutils
local/python-docutils 0.16-4
    Set of tools for processing plaintext docs into formats such as HTML, XML,
    or LaTeX
┌──[~]
└(ノ≧∇≦)ノ $ sudo pacman -R python-docutils
依存関係を確認しています...
エラー: 処理の準備に失敗しました (依存関係を解決できませんでした)
:: python-docutils を削除すると 'python-docutils' が破壊され python-sphinx の依存関係が壊れます
┌──[~]
└(ノ≧∇≦)ノ $ sudo pacman -R python-sphinx python-docutils
依存関係を確認しています...

パッケージ (1) python-sphinx-4.0.2-1 python-docutils-0.16-4

合計削除容量:  14.27 MiB

:: 以上のパッケージを削除しますか? [Y/n] 

消してからのインストール...お?

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
cephfs-shell 0.0.1 requires cmd2, which is not installed.
tmuxp 1.7.2 requires click<8,>=7, but you have click 8.0.1 which is incompatible.
Successfully installed awscli-1.19.95 colorama-0.4.3 docutils-0.15.2
┌──[~]
└(ノ≧∇≦)ノ $ aws
Note: AWS CLI version 2, the latest major version of the AWS CLI, is now stable and recommended for general use. For more information, see the AWS CLI version 2 installation instructions at: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
aws: error: the following arguments are required: command

まあなんか,入ったっぽいのでヨシ.と思ったけどaws cli v2を使えと申すか...

レポジトリ見てみるとv2用ブランチがあるようですが,別にgit clone してビルドとか絶対に嫌なので見なかったことにします.

それよりもアップロードに必要な認証情報は...

AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYが必要なんですね.なるほど.

確かバケットのURLも必要だったはずなので,AWSのコンソールから取得すれば良いのは

  • ルートアカウントの
    • AWS_ACCESS_KEY_ID
    • AWS_SECRET_ACCESS_KEY
  • S3 Gracierの
    • ボールト ARN

かな.

おっけい,ひとまずコイツらメモりますか.

4. imgを4分割で取ってくるときの手順の確認

ddコマンド、最初中学生のころくらいは「めっちゃ取っつきにくいし怖いコマンド!」位の印象しかなかったんですが、よくよく調べたらシンプルで超簡単ですね...

今回はtmp用ディレクトリ(旧Windowsディレクトリ)が100GBしかないので、100GB単位での切り出しをします。

その場合、各ケースにてddによるファイル出力の開始位置をそれぞれ100GBずつずらす必要があるのですが...

dd if=/dev/sda2 of=/mnt/1.dump bs=100GB count=1
dd if=/dev/sda2 of=/mnt/2.dump bs=100GB count=1 skip=100GB
dd if=/dev/sda2 of=/mnt/3.dump bs=100GB count=1 skip=200GB
dd if=/dev/sda2 of=/mnt/4.dump bs=100GB count=1 skip=300GB

これでいい模様。マジか。

統合はseekでずらしながらマージすればOK。マジか。

というかなんかcatでくっ付けてもいいみたいですが。マジか。

これは流石に不安しか覚えないしコマンドおかしいしって感じではありますが、とりあえずddで分けても元のディスクイメージに戻ることは確認できたのでヨシ!

で、ddしながら圧縮することもできるみたいなので、圧縮する方針で頑張ります。

dd if=/dev/sda2 bs=100GB count=1 | gzip -c  > img-210616-1.gz
dd if=/dev/sda2 bs=100GB count=1 skip=100GB | gzip -c  > img-210616-2.gz
dd if=/dev/sda2 bs=100GB count=1 skip=200GB | gzip -c  > img-210616-3.gz
dd if=/dev/sda2 bs=100GB count=1 skip=300GB | gzip -c  > img-210616-4.gz

5. AWS S3 Gracierのアップロード手順の確認

なんか2つコマンドあるけど、確か前者でマルチパート勝手に切り分けてくれる的なことどこかに書いてあった気がする。ので前者のコマンドを使ってみることにします。

ドキュメントには自動で切り分けるよとは一言も書いてなかったけどなんとかなるやろ()

aws glacier upload-archive --account-id - --vault-name my-vault --body archive.zip

or

aws glacier upload-multipart-part --body part1 --account-id - --vault-name my-vault --upload-id 19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ

6. 実験データ等ヤバそうなやつだけ先にgitに飛ばす

このステップは大事.

┌──[~]
└(ノ≧∇≦)ノ $ cd d/kosen_engineeringExperience2/202004_VHDL/
┌──[~/d/kosen_engineeringExperience2/202004_VHDL]
└(ノ≧∇≦)ノ $ git add .
┌──[~/d/kosen_engineeringExperience2/202004_VHDL]
└(ノ≧∇≦)ノ $ git commit -m "現在までの進捗"
[master 53466ae] 現在までの進捗
 99 files changed, 3038 insertions(+), 2990 deletions(-)
 ---略---
┌──[~/d/kosen_engineeringExperience2/202004_VHDL]
└(ノ≧∇≦)ノ $ git push origin master
Enter passphrase for key '/home/kaniyama/.ssh/github_id_rsa': 
Enter passphrase for key '/home/kaniyama/.ssh/github_id_rsa': 
Enter passphrase for key '/home/kaniyama/.ssh/github_id_rsa': 
Enumerating objects: 210, done.
Counting objects: 100% (210/210), done.
Delta compression using up to 8 threads
Compressing objects: 100% (108/108), done.
Writing objects: 100% (110/110), 5.74 MiB | 335.00 KiB/s, done.
Total 110 (delta 45), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (45/45), completed with 43 local objects.
To github.com:Kaniyama-t/kosen_engineering-experience2.git
   d31bcdc..53466ae  master -> master

午後の授業で使うので,その間は学校のPCを使うため一旦アップロード.

...というかメイン機でずっと実験してたにしてもせめてもう少しこまめにgit commit するべきだったな...

99ファイルは色んな意味で笑えん,,,

6. 研究室でddスタート

archlinuxのインストールメディアを準備して、いざddします。

手順は

  1. loadkeys jp106する
  2. mkfs.ext4 /dev/sda4する
  3. mount /mnt /dev/sda4
  4. iwctlでネットにつなぐ
  5. pacman -S pythonする
  6. python -m pip install awscliする
  7. ddでファイル出力
  8. aws glacierコマンドでネットの海に飛ばす.
  9. 7-8を4回繰り返す
  10. 終わり!