Chienomi

Linuxインストール前、新規PCでまず行うべきこと

Live With Linux::newbie

これは、「WindowsがプレインストールされているPCへのLinuxの導入」を想定して、Windowsをバックアップする作業の(pre-Linuxer, あるいは初級Linuxerへの)説明である。

どこに書いたか覚えていないので、改めて書くことにする。

この目的は、

  • 修理などの場合に、工場出荷時の状態に戻す手段を用意する
  • Windowsのディスク移設を可能にする
  • Linuxを廃止してWindowsに戻す手段を用意する
  • あとからWindowsを追加する手段を用意する

といったものである。

また、これが唯一の方法というわけではないのだが、最も安全で確実な方法である。 mondo rescueを使ってバックアップするとか、Clonezillaを使うとかやったこともあるのだが、うまく復元できなかったことがある。 その代わり、時間的負担、空間的負担は割と大きい。

重要な注意点

最も重要な注意点

この作業はPCを初回起動する前に行わなくてはならない。

事前に準備する必要があるという意味でもあるし、ファームウェアセットアップ画面への入り方を事前に調べなければならないという意味でもある。

なお、LenovoのThinkシリーズはセットアップはF2, ブートメニューはF12である。

前提となっていること

これはモダンで一般的なPCで行うことを想定している。

少なくとも、UEFIシステムであり、UEFIネイティブに構成されていること、伴ってパーティションテーブルにGPTを使用していることである。

中古で買ったProDesk 600 G2はUEFIシステムであったが、MBRテーブルを持つディスクのWindowsをレガシーブートする構造であったため、この条件には当てはまらない、ということになる。

事前準備

Linuxメディア用USBドライブ

まず、Linuxメディアを用意しなくてはならない。

これは、一般的には8GB以上のUSBペンドライブを使用する。 ブータブルなUSBマスストレージであればなんでも良いのでペンドライブでなくとも、例えばSDカードとUSBのSDカードリーダーなどでも構わない場合もある。

このディスクは非永続的であり、インストール時にのみ使用する。

代えてDVD-Rメディア及びドライブを用意する、という方法もあるが、結構ストレスなのでお勧めはしない。 USB 3.0以上のUSBペンドライブ(それもできれば高速なもの)を使用すべきだ。

バックアップメディア

最も簡単なのはUSB接続の、プレインストールディスクよりも大きな空き容量を持つディスクである。

できればNTFSでないほうが良い。ExFATは許容される。

これは、他のPC上の空き容量でも構わない。 ただし、その場合どのようにして圧縮するかを考えなくてはならないので注意が必要だ(特にWindowsの場合)。 ネットワークを経由する場合、相手のファイルシステムは関係ないが、ネットワーク上で疎通できる必要がある。

この用意が困難である場合、圧縮することで10GBを下回るサイズのイメージになることが多いため、16GB程度のディスクで代用しても良い。 ただし、圧縮にはかなりの時間がかかり、 作業は数日程度かかる。この間、バックアップに関わるコンピュータは停止することができない。

圧縮する場合はインターネット経由のストレージも選択肢になるだろう。 光回線であれば、圧縮にかかる時間のほうが長いからだ。 ただ、普通のクラウドストレージは数十GBにも及ぶストリームを想定していないため、お勧めはしない。

Linuxメディアの用意

少し古いが、Mimir Yokohamaの記事を参考にしてほしい。 インストール、及びインストール前作業に必要な情報が一通り記載されている。

私は最近はずっと、Manjaro Linux Community Edition Cinnamonを使用している。 使っていく上でManjaroが使いやすいのはもちろんだが、Cinnamon自体が使いやすく、さらにCinnamon版は必要なソフトウェアが厳選されており、最小構成にしようと思ってもこれ以上抜きようがない、という非常に適切な構成になっている。 このあたりは防音室用のProDeskに導入した話を参考にしてほしい。

もっとも、バックアップだけを言えばBashが動作し、かつネットワークに接続できれば良いため、ハードルは低い。 (USBディスクならネットワーク接続もいらない。NTFSサポートはいるかもしれないが。)

といっても、これはそこまで簡単でもない。 なんといってもLinux上でネットワークデバイスを動かすためのハードルがあるし、ものによっては動かすのにかなり困難を伴う。 また、新しいB550マザーボードのサポートは当然ながら最近入ったものであり、2.5GbEのドライバはLinux 5.10以降、それも5.10の途中からしかない。

Logicool LAN-W150N/U2のような、動作が安定しているUSB WLANカードを用意しておくのはひとつ良い方法だ。

いずれにせよ、これを読んでいる人はきっと素直にManjaro Linux Community Edition Cinnamonを使うことだろう。 前述した記事において同一のisoファイルをDVDに書き込んだり、USBディスクに書いたりしているが、これはManjaroが(Archも)ハイブリッドイメージだからできるだけの話だ。通常はそうではない。 また、USBディスクは確実に書き終わったことを確認する必要がある。syncすることはもちろん、USBディスクはディスクアクセスランプがあるものを選び、視覚的に確認できるようにしたほうが良いだろう。

ISOイメージを「ファイルとして」DVDに書き込む事故は初心者にはありがちなので注意してほしい。

Linuxのブート

前述の記事を確認してほしい。

ここからはManjaro Linux Community Edition Cinnamonを前提に説明する。

バックアップ

USBディスクに対して、生イメージで

USBディスクの場合、接続すればNemo(ファイルマネージャ)からアクセス可能になる。 これができない場合はそのディスクを使うのは諦めたほうが良いだろう。

また、巨大なファイルになるため、FAT32などでフォーマットされたディスクは使えない。 ファイルシステムは次のようなコマンドで確認可能だ。

sudo parted -l

Nemoによってバックアップするディスクの、バックアップしたい箇所に移動したら、右クリックから「端末で開く」。 一般的には/run/media/以下になるはずだ。

先程と同じコマンドでバックアップ元のディスクを確認する。 これは慎重に行わなくてはならない。モデルや容量、パーティション構成などを参考にしよう。

/dev/sdaのような名前がついていると思うが、判断しかねる場合は/dev/disk以下のファイルを使うこともできる。

そして、バックアップを行う。次の例ではバックアップ対象ディスクが/dev/sdaであると仮定している。

cat /dev/sda > windows-default.img; sync

/dev/sda1/dev/nvme0n1p1のようなパーティションデバイスではなく、ディスク全体のデバイスを指定することに注意すること。 また、このファイルはディスクサイズと等しいサイズになる。 非常に大きいので、後日圧縮することを忘れずに。この圧縮は何日もかかることがある。

Linuxにおいてファイルを圧縮する場合、次のようにする。

xz -T0 windows-default.img

xzは非常に並列性が高いため、コア数が多いプロセッサであればgzipよりも高速である。 (中古などでリソースが非常に限られている場合はgzipで妥協すべきだろう。)

これによって、例えば1TBあったファイルが10GBになる、というレベルの圧縮が可能である。

USBディスクに対して、圧縮で

USBディスクに元ディスクをファイルとして置くほどの余裕がない場合、次のようにして最初から圧縮する。これはcatコマンドに代えて使用する。

xz -T0 -z -c -v /dev/sda > windows-default.img.xz; sync

ネットワーク(LAN)経由で

他のPCに転送し、そのPC上で保存する場合である。

まず、受け取る側はなんらかの方法でTCPを待ち受ける。 ここでは10000番ポートで待ち受けるとしよう。

OpenBSD Netcatを使う場合

nc -l 10000 > windows-default.img

GNU Netcatを使う場合

nc -l -p 10000 > windows-default.img

Socatを使う場合

socat -u TCP-LISTEN:10000 CREATE:windows-default.img

Zshを使う場合 (%はZshのプロンプト)

% zmodload zsh/net/tcp
% autoload -U tcp_point
% tcp_point 10000 > windows-default.img

Netcat for Windowsを使う場合。 (Windows向け、コマンドプロンプトまたはPowershellで)

nc -l -p 10000 > windows-default.img

そして、Manjaro側から転送する。 ManjaroはイメージのバージョンによってはZshを標準とする場合があるが、ここではBashを使うため、bash -lとしてBashにしておくこと。

cat /dev/sda > /dev/tcp/192.168.0.100/10000

ここではバックアップ元のディスクが/dev/sdaであり、転送先のホストが192.168.0.100であると仮定している。ホスト名はbackuper.localのようにホスト名で解決できるのであれば、ホスト名でも良い。

これは生データの転送だが、圧縮して転送したい場合は次のようにする。

xz -T0 -z -c -v /dev/sda > /dev/tcp/192.168.0.100/10000

この場合、受け取る側でファイル名に.xzをつけたほうが良いだろう。

圧縮せずに転送した場合、USBディスク同様に後日圧縮を行うこと。

戻す方法

単純に逆にすれば良いのだが、圧縮してあるので伸長が必要である。 ファイルとして認識される状態であれば次の通り。

xzcat -T0 windows-default.img.xz > /dev/sda; sync

ネットワーク経由の場合も同じ要領だ。

xzcat -T0 - < /dev/tcp/192.168.0.100 > /dev/sda; sync

ただ、リモートホストでの待受は読みにしなくてはならないため、少し条件が複雑になり、できるのはsocatくらいになる。

socat -u OPEN:windows-default.img.xz TCP-LISTEN:10000

netcatは、OpenBSD Netcatはできる。

nc -N -l 10000 < windows-default.img.xz

しかし、GNU Netcatについてはlistenしている側でEOFを受け取ったら閉じる、ということができないため、うまくいかない。

sshを使う、という方法もあるかもしれない。

ssh foouser@192.168.0.100 cat path/to/windows-default.img.xz | xzcat -T0 > /dev/sda

また、この場合、「/dev/sdaに対して書き込む」という動作であるから、こちらはrootで行う必要がある。BashのTCP機能はリダイレクトで行う必要があるため、sudoを使うなら

xzcat -T0 < /dev/tcp/192.168.0.100 | sudo dd bs=4M of=/dev/sda; sync

のような複雑なやり方が必要になる。

Windowsの移植

例えば、M.2 PCIe (NVMe)ディスクにWindowsが入っていて、M.2 PCIe NVMeスロットはひとつしかないが、こちらにLinuxを入れ、SATA SSDにWindowsを入れたい、といった場合の話である。 Windowsは無駄に容量を食いつぶすため、割とありがちな話でもある。 また、購入時は小さいディスクにして費用を抑え、大きいディスクを安く買ってそちらにWindowsを入れる、という場合もある。

まず、/dev/sdaにWindowsが入っていて、/dev/sdbのディスクにWindowsを移植したくて、Linuxでライブブートしている、という状況であればrootで次のようにすれば良い。

cat /dev/sda > /dev/sdb; sync

圧縮イメージでも大差ない。

xzcat windows-default.img.xz > /dev/sdb; sync

ネットワーク経由で受け取っても良い。

xzcat - < /dev/tcp/192.168.0.100/10000 > /dev/sdb; sync

ただし、注意すべきは、書き込まれるディスクは元々のディスクサイズと同じか、大きくなければならない、ということだ。 また、書き込まれるディスクがより大きい場合、パーティションテーブルの修正とNTFSファイルシステムの拡大が必要である。

単純にできる状況下であれば、Windows上で行うのが良い。NTFSを外部から操作するのはそれなりに難しい。Windows上でパーティションを拡大すれば良いのだ。 だが、多くの場合、元のディスクの 末尾に リカバリ領域が存在している。この場合手順は少しむずかしい。

この操作はGPartedによって行うのが良いだろう。 GPartedはそもそもそのようなディスクを開いた時点でパーティションテーブルにかかれている情報が正しくないことを検出し、修正するかを訪ねてくる。これを承諾することで、まずディスクサイズそのものは正しく認識され、リカバリ領域のうしろに未割り当ての領域ができる。

ここで選択肢としては、「リカバリ領域を移動する」か「リカバリ領域を削除する」かの2択となる。 まっさらな新品ディスクで、かつGPTパーティションテーブルを持つものであればリカバリ領域を後ろにずらすことにあまりリスクはないが、私は削除してしまっていることが多い。復元はイメージファイルを用いて行うことができるからだ。 パーティションの移動処理は計算が必要だったりするので、難易度が少し高い。

あとはパーティションを拡大して、NTFSをそれに合わせて拡大すれば良い。 この処理はやはりWindows上で行ったほうが良い。

おまけ: M.2 PCIe + SATA 2.5inch 構成の場合、どう配分すべきか

DM系やminiPCとかだとこういう構成になっていることが多い。

まず、前提として「両方にSSDを載せる」こと。

難しいことをしたくない、できない人なら、M.2側にLinuxを、SATA側にWindowsを載せれば良い。 Linuxのほうはディスク速度を非常に活かしやすいし、SATAのほうが容量単価が安いので容量を食うWindowsを載せやすい。

もう少し発展させると、Windowsのほうで1TBもいらない感じであれば、SATA側のディスクに余分なパーティションを(後ろに)切って余しておき、こちらをEXT4なりF2FSなりにしてLinuxで使うと、Linuxのパフォーマンスはかなり上がる。特に、~/.cacheを載せると目立ってパフォーマンスは良くなる。

しかし、これで話が終わらない事情がある。SanDiskのSSD PLUS(SATA 2.5inch)が2TBで2万円ほどでGB単価10円、ADATA XPG SX8100(M.2 PCIe, 3000MB/sクラス)が2TBで2.2万円でGB単価11円と、1TBとあまり変わらない製品が出てきているからだ。

2TBだとLinuxとWindowsの両方を載せてもまだ余裕という可能性がある。 そうすると、M.2 PCIeを両方のシステムディスクとして、SATA SSDをデータディスクにするという方法が効くようになる。

UEFI/GPTの場合、デュアルブートはそれほど複雑ではない。Legacy boot/MBRの場合、デュアルブートは破壊的変更が避けられなかったが、UEFI/GPTならばある程度の知識(これがかなり難しいが)があれば元に戻すのも容易だ。

この場合、重要なのは、

  • Windows環境を先に作っておくこと
  • Linuxの領域を最も後ろの未割り当て領域として用意しておくこと

である。Manjaroのインストーラは未割り当て領域にインストールするというオプションがあり、これによって後方の未割り当て領域を使うことができる。 ただし、これは失敗することがある。

Windows環境を先に作っておく、というのは、初回起動まで終わらせておく、ということである。 特に、Windowsをあとからインストールすることはできない。Windowsのインストールは自分がインストールされるのとは異なるディスクをもWindows専用に破壊的に変更する。

また、Windowsはシステムを破壊的に変更しうるため、同一ディスクに入れておくとLinuxがブートできなくなるということがないでもない。この修復は容易だが、それを行うためにはかなりの知識を必要とする。

この場合、デフォルトで入っているディスクの存在は無視して(なにかに流用したりすれば良いだろう)、1TB、ないし2TBのM.2 PCIeディスクを用意する。 Linuxの領域はユーザーデータを考えなければ256GBでかなり余裕がある。私が使っている中には128GBのマシンもいる(メインで使っているものではないが)。ログやキャッシュのクリアをすれば256GBは余裕だと思うし、練習段階で色々と入れまくるのだとしても512GBは余裕がありすぎるくらいだ。 だから、Linux領域を256〜512GB程度と考えて、残りWindowsにどれだけ必要かで1TBか2TBか、というのを決めることになる。 ご存知かとは思うが、現在のWindowsは使い続けていると200GBを越えるシステム領域を要求するようになるため、Windowsは256GBでは足りない。

そして、分散とデータ置きにSATA 2.5inch SSDを用意する。 cache専用であれば256GBもあれば余裕である。ユーザーデータを置く場合は、ユーザーデータ置きとして必要なサイズによるが、私としては2TBでは全く足りないので、マシンキャッシュでしかなく(本データは自宅内のクラスタストレージに置いている)、よって2TBもいらない。

基本的にこちらのディスクはLinux専用と考えて良いと思う。 Windowsは本当にユーザーデータ置きくらいしか別パーティションを扱えない。ジャンクションやリンクを使用して別ディスクに分散しようとしても、うまく動作しないことが多く、結局1つのディスクに収めることを強いられる面がある。 一方、Linuxならどのように配置するかは自由でとても柔軟だ。

また、基本的には常時Linuxを使う、と考えると、Windowsにユーザーデータを置きっぱなしにすることもあまり考えられない。そうなると、Windows上で発生したユーザーデータを、Linux側で吸い上げてSATA SSDに置く、ということが可能なので、Windowsでユーザーデータ置きにSATA SSDに領域をもたせることはあまり意味がない。

また、Windowsで扱えるファイルシステムはどれも決定的に機能が不足しており、十分な情報を与えることができない。さらにNTFSは他のシステムから扱うのに問題がある。そして、NTFSもExFATも優れたファイルシステムではない。かといって、Linuxのファイルシステムを共有するのも難がある。 (逆に言えば、ポータブルディスクではいらん機能がいっぱい入っているせいでLinuxファイルシステムが面倒だったりするが。)

SSDのユーザーデータ置きであれば、圧倒的にF2FSが優れたファイルシステムであり、Linux的にはSATA SSDをスーパーディスクとしてF2FSにしてしまっても良いくらいだ。

おまけ2 Windows/Linux共存システムにおけるブート分け

基本的にブートメニューから行う(Thinkシリーズの場合はF12)。

たいていのPCにはブートメニューに入る方法がある(Let’s Noteにはないらしい)。 レガシーブート時代は「内臓ディスクからのブート」でひとまとめで、何をブートするか選択できないシステムもあったが、UEFIはそもそもUEFIソフトウェアを選択する構造であるため、ブートする対象はほとんどの場合選べるだろう。(ごく初期のものを除けば。)

ブートメニューに入らない場合に何をブートするかは、以前はUEFI Shellから操作していた(Windowsからやるほうが簡単)のだが、現在はUEFI設定の中にUEFIソフトウェアの優先順位を選択できるようになっていることが多い。

ひとことコメント

Linuxの習得、あるいはLinuxを利用できるようにしたり、それによってなんらかのアドバンスを得ようというのであれば、最初からWindowsも使える状態にすべきでない。

なぜならば、Windowsに慣れている状態であればWindowsを起動してしまう可能性が高いし、Linuxを日常的に使っていればほどなくしてWindowsを起動するなんてバカバカしいと感じるようになって、ほとんど起動しなくなる1ので、その日まで選択の余地なくLinuxを起動する週間をつけるべきだ。

ついでに宣伝

どうしても不安、あるいはレスキューやサポートが必要という場合、Mimir Yokohamaのサポートサービスを利用すると良い。

割と安価で強力なサポートを得ることができる。使いこなせばMimir Yokohamaの中でもお得感の高いサービスだ。