多くの人が知っているように、>>
演算子はコマンドの後に入力する内容にコマンドの出力を追加します。
ファイルを上書きしたり、ファイルにデータを追加したりすることができることを知っていますが、悪意のある方法で使用される可能性があることもわかっています。ドライブまたはパーティションを出力として使用すると、コマンドの出力は次の場所に直接書き込まれます。そのドライブまたはパーティションが破損する可能性があります。
たとえば、>> /dev/sda
コマンドに追加すると、コマンドの出力が/dev/sda
。
好奇心にUbuntu VMを設定して楽しく使ってみました。コンピュータの仮想ドライブは/dev/vda
、/dev/vda1
ブートパーティションは、/dev/vda2
ルートパーティションはであり、別のパーティションがありません/home
。
今楽しい部分が出てきます。
echo "Hello world" >> /dev/vda
仮想マシンで(ルートとして)実行してから再起動しても、何も破損しているようには見えません。再起動後は正常に起動し、それ以降はすべて大丈夫に見えました。- ただし、
echo "Hello world" >> /dev/vda1
同じ仮想マシン(ルート)でも実行して再起動すると、起動に失敗します。
だから私は出力書き込みがvda1
悪い理由をすでに知っています(ブートパーティションが壊れています)。私の質問は:出力を追加すると/dev/vda
何も起こらないようですが、出力を追加すると問題が発生するのはなぜですか/dev/vda1
?結果を渡すと、コマンド出力は「/dev/vda2
以降」なので記録されますか?/dev/vda1
vda
vda2
答え1
UEFIモードで起動したようです。これは、ブートプロセスがドライブのヘッドエンドを確認しないことを意味します。
BIOSモード(エイリアスCSMレガシーモード)から起動する場合は、ドライブの最初のバイトにマスターブートレコードMBRを含める必要があります。パーティションテーブルもディスクヘッドに非常に近い場所に保存されます。
ブロックデバイスで使用されている場合は、追加せずに>>
ドライブヘッドに書き込みます。/dev/sdc
USBフラッシュドライブを含む以下のデモを参照してください。
$ sudo bash -c 'echo "Hello world" >> /dev/sdc'
$ sudo dd if=/dev/sdc bs=12 count=1
Hello world
1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00127171 s, 9,4 kB/s
説明が正しい場合、ヘッドエンドに長いデータブロック(MBRだけでなくパーティションテーブルをカバーするのに十分長い)を書き込むと、プロセスが破損します。
BIOSブート用に設定されたドライブからドライブヘッドに書き込むと、MBRが破損しているため、ブートプロセスが破損します。
編集1:
FAT32ファイルシステムのパーティションヘッダーを同じ方法で書き込むと、ファイルシステムが破損していることがわかります。
$ lsblk -o model,name,size,fstype,label,mountpoint /dev/sdc
MODEL NAME SIZE FSTYPE LABEL MOUNTPOINT
Voyager sdc 7,5G
├─sdc1 256M vfat
└─sdc2 512M vfat
$ sudo dd if=/dev/sdc1 bs=12 count=1
�X�mkfs.fat1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00118622 s, 10,1 kB/s
$ sudo bash -c 'echo "Hello world" >> /dev/sdc1'
$ lsblk -o model,name,size,fstype,label,mountpoint /dev/sdc
MODEL NAME SIZE FSTYPE LABEL MOUNTPOINT
Voyager sdc 7,5G
├─sdc1 256M
└─sdc2 512M vfat
$ sudo dd if=/dev/sdc1 bs=12 count=1
Hello world
1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00118594 s, 10,1 kB/s
編集2:
パーティション#2は影響を受けません。 ASCII以外の文字の見苦しい表現だけでなく、16進ダンプも調べることをお勧めします。
$ sudo dd if=/dev/sdc2 bs=12 count=1 | hexdump -C
1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00129779 s, 9,2 kB/s
00000000 eb 58 90 6d 6b 66 73 2e 66 61 74 00 |.X.mkfs.fat.|
0000000c