Ubuntuの自動プレインストール:isolinuxおよびpreseed

ご存じのように、 Ubuntu Linuxは、ほとんどのオフィスワーカーの作業に必要なツールの完全なセットでした。 含まれていないものは、たとえばFreeRDPとRemminaを使用して、サーバーから再インストールまたは実行できます。 その結果、コストが削減され、顧客管理が大幅に簡素化されます。 多くの企業はすでに、フリートをシンクライアントと、Linuxを備えた本格的なコンピューターに徐々に置き換え始めています。 また、いくつかの部門をUbuntuに移行したい場合は、時間を節約できるかもしれません。

この記事では、 Ubuntu (およびUbuntu Severを含むその修正)またはDebianに基づいて、事前に構成され、自動的にインストールされるシステムを作成する方法を説明します。 以下で説明するかなり単純な資料を理解したら、必要なアプリケーションと設定を使用して独自のUbuntuアセンブリを作成できます。これは、ディスクとネットワークの両方で完全自動モードでインストールできます。 その結果、必要に応じて、コンピューターの電源を入れてお茶を飲むだけで十分であることを達成できます。そのため、戻ってくると、インストールして完全にカスタマイズされたシステムと作業に必要なすべてのソフトウェアが表示されます。

最初に、この記事にはUbuntu固有の事項がいくつか含まれていますが、 Debain Installerのインストールに使用できるディストリビューションについては、一般的なポイントが当てはまります。 また、ネットワーク経由でコンピューターの読み込みを構成する方法については説明しません(これにはTFTPサーバーが必要で、通常2分で展開できます)。ディスクからの起動に焦点を当てます。 ただし、最後に、説明したすべての方法を使用してコンピューターのネットワークを開始する方法を説明します。

そのため、最初にDebain Installerを使用してシステムの初期イメージを取得する必要があります。 Ubuntu Desktop LiveCDは別のインストーラーを使用するため、動作しません。 UbuntuファミリーのLiveCD以外のディスクは、非常に静かに使用できます。 以降のすべての手順はUbuntu Alternate向けに書かれていますが、システムの他のバージョンでは少なくとも多少異なることはほとんどありません。

isoを使用する


目的のisoイメージをダウンロードしたら、それを解凍する必要があります。 このためにこのスクリプトを使用します。

#!/bin/bash BUILD=iso IMAGE=ubuntu-10.04-alternate-i386.iso #     rm -rf $BUILD/ mkdir $BUILD/ echo "** Mounting image..." sudo mount -o loop $IMAGE /mnt/ echo "** Syncing..." rsync -av /mnt/ $BUILD/ chmod -R u+w $BUILD/ 

実行後、イメージのコンテンツ全体がisoディレクトリに格納されます。 その後、必要な変更を加えて、イメージを圧縮して戻すことができます。 すぐにパッキングスクリプトを提供します。

 #!/bin/bash IMAGE=ubuntu-custom.iso BUILD=iso #   iso/   ubuntu-custom.iso echo ">>> Calculating MD5 sums..." rm $BUILD/md5sum.txt (cd $BUILD/ && find . -type f -print0 | xargs -0 md5sum | grep -v "boot.cat" | grep -v "md5sum.txt" > md5sum.txt) echo ">>> Building iso image..." mkisofs -r -V "Ubuntu OEM install" \ -cache-inodes \ -J -l -b isolinux/isolinux.bin \ -c isolinux/boot.cat -no-emul-boot \ -boot-load-size 4 -boot-info-table \ -o $IMAGE $BUILD/ 

組み込みのディスク整合性チェックを機能させるには、すべてのファイルのMD5合計を再計算する必要があります。

インストールプロセスの自動化


ここで、インストールプロセスを自動化する必要があります。 isolinuxブートローダーは、ディスクからインストーラーを起動するために使用され、このセクションではその構成に専念します。 記事の最後で、ネットワーク経由でダウンロードする機能について説明します。

それまでの間、順番に行きましょう。 まず、Ubuntu CDからコンピューターを起動すると、言語を選択するように求められます。 このリクエストが表示されないようにするには、 isolinux /フォルダーにlangという名前のファイルを作成する必要があります。このファイルの内容全体が、目的の言語のアルファベットコードを表します。 たとえば、私はlangファイルでロシア語を選択しました:

 ru 

利用可能なすべての言語オプションは、 isolinux / langlistファイルにあります

次に、しばらくしてからブートローダーが自動的に目的のメニュー項目を選択する必要があります。 私たちの場合、このアイテムは自動インストールになります。 デフォルトでは、Ubuntuはユーザーの選択を待機し、アクションを実行しません。 この動作を変更するには、 isolinux / isolinux.cfgファイルのタイムアウトパラメーターの値をゼロ以外の値に変更する必要があります。 時間はそれぞれ10分の1秒単位で測定され、2秒のタイムアウトを設定するには、このファイルに次のレコードが含まれている必要があります。

 timeout 20 

デフォルトで起動されるメニュー項目を選択するだけです。 すべてのメニュー項目はisolinux / text.cfgファイルで設定されていますが 、ここで変更します。 自動インストールの場合、「OEM Install」という独自のメニュー項目を作成して、通常のインストールオプションを引き続き使用できるようにします。 インストールプロセス自体は、ディスク上の対応するディレクトリにあるいわゆるpreseedファイルによって制御されることをすぐに言わなければなりません。 それらについては、しばらくしてから、標準メニュー項目の説明をコピーし、その名前とそのpreseedファイルの名前を変更し、デフォルトで実行することもできます。 ここに私が終わったものがあります:

 default oem label oem menu label ^OEM install kernel /install/vmlinuz append file=/cdrom/preseed/oem.seed initrd=/install/initrd.gz quiet -- 

これで準備フェーズが終了しますが、今はpreseedテクノロジーに直接対処する必要があります。

種子


Preseedテクノロジーを使用すると、インストール中に尋ねられる質問への回答を事前に指定できるため、手動で回答する必要がなくなります。 これにより、必要なすべての設定を備えた完全自動スクリプトを作成できます。

もう少し掘り下げると、 Debian Installerdebconfシステムを使用してインストールプロセスを制御し、 preseedテクノロジーは必要な答えをdebconfデータベースに事前に追加するだけであることがわかります。 したがって、 preseedを使用すると 、インストーラーだけでなく、 debconfを使用する他のアプリケーションも構成できますが、この機能は役に立たない可能性があります。

preseedステートメントは、通常 、所有者、パラメーター名、パラメーターのタイプと値の4つの部分で構成されます。 パーツ間には正確に1つのスペースが必要です。 インストーラーの名前はdiで 、ほとんどの指示の最初のフィールドに表示されるのはこの値です。 preseedステートメントを指定するには、次の3つの方法があります。
  1. カーネル起動オプションを通じて。
  2. ネットワーク経由でダウンロードされた指示を含むファイルを指定する。
  3. 手順付きのローカルファイルを使用。
最初の2つの方法は汎用であり、どのブートにも適していますが、3番目の方法はisolinuxを使用してディスクからインストールする場合にのみ機能します

もう1つの重要な違いがあります:カーネルパラメーターを介して送信される指示は、インストーラーの起動前にデータベースに追加され、言語および地域オプションを設定した後のローカルファイルからの指示、およびネットワークのセットアップ後のネットワークファイルからの指示です したがって、完全自動インストーラーを作成するには、いずれの場合でも、カーネルのパラメーターを指定する必要があります。 それらから始めましょう。

isolinux / text.cfgファイルを少し変更して、OEMインストール項目にいくつかのブートオプションを追加する必要があります。 結果は次のようになります。

 default oem label oem menu label ^OEM install kernel /install/vmlinuz append file=/cdrom/preseed/oem.seed debian-installer/locale=ru_RU.UTF-8 console-setup/layoutcode=ru localechooser/translation/warn-light=true localechooser/translation/warn-severe=true console-setup/toggle=Alt+Shift initrd=/install/initrd.gz quiet -- 

一般に、これらのパラメーターが何であり、ここで何を変更できるかは明らかです。 今残っているのは、 preseedの指示を含むメインファイルを作成することです。おそらく既に推測されているように、私の場合はpreseed / oem.seedと呼ばれます。 ファイル名をインストーラーに転送するためにfileパラメーターが使用されていることにすぐに注意します 。 このオプションはisolinuxを使用してディスクから起動する場合にのみ機能し、その中の/ cdromパスを使用してディスクの内容を参照できます。

以下に、私のpreseedファイルのコメント付きコンテンツを示します。

 # Locales di debian-installer/locale string ru_RU.UTF-8 # Keyboard di localechooser/shortlist select RU di console-setup/ask_detect boolean false di console-setup/layoutcode string ru di console-setup/variant select  di console-setup/toggle select Alt+Shift # Network di netcfg/choose_interface select auto di netcfg/get_hostname string ubuntu di netcfg/dhcp_failed note di netcfg/dhcp_options select Do not configure the network at this time # Clock di clock-setup/utc boolean true di time/zone string Europe/Moscow di clock-setup/ntp boolean true # Users di passwd/root-login boolean true di passwd/make-user boolean true di passwd/root-password-crypted password $1$fbh0yv5L$qlugJUXOjNhiakQUYiJ7x0 di passwd/user-fullname string Ubuntu user di passwd/username string ubuntu di passwd/user-password-crypted password $1$fbh0yv5L$qlugJUXOjNhiakQUYiJ7x0 di user-setup/allow-password-weak boolean true di user-setup/encrypt-home boolean false # Partitioning di partman-auto/disk string /dev/sda di partman-auto/method string regular partman-auto partman-auto/init_automatically_partition select Guided - use entire disk partman-auto partman-auto/automatically_partition select di partman-auto/purge_lvm_from_device boolean true di partman/confirm_write_new_label boolean true di partman/choose_partition select finish di partman/confirm boolean true di partman/confirm_nooverwrite boolean true # GRUB di grub-installer/only_debian boolean true di grub-installer/with_other_os boolean true # APT di apt-setup/restricted boolean true di apt-setup/universe boolean true di apt-setup/multiverse boolean true di apt-setup/non-free boolean true di mirror/ftp/proxy string di mirror/http/proxy string # At last di finish-install/reboot_in_progress note tasksel tasksel/first multiselect ubuntu-desktop di preseed/late_command string mkdir /target/install/; cp -R /cdrom/extra/* /target/install/; chroot /target chmod +x /install/postinstall.sh; chroot /target bash /install/postinstall.sh 

一般的に、オプションの名前によって、オプションの責任を理解できますが、いくつかの興味深い点についてはまだコメントします。

最初に、自動インストール用のスクリプトを記述するために、手動モードでのインストール、特にどの質問、いつ、どのような場合に回答する必要があるかを明確に想像する必要があることに留意してください。 preseedを使用すると、手動モードとまったく同じ方法でシステムを配置できます。 唯一の制限は、自動モードではコンピューターの既存のパーティションにインストールできないことです。 私のシナリオでは、最も単純なアプローチを使用してスペースを割り当てます。つまり、システムの最初のハードディスク全体をクリーニングして自動的にマークアップします。

さらに、自動インストールでは、手動モードでは利用できない多くの機能を使用できます。 たとえば、rootのパスワードを設定してシステムの非特権ユーザーを作成することもできますし、デフォルトの動作を使用して最初のユーザーを管理者にして、 sudoを介してシステム設定にアクセスすることもできます。 前者の場合、 passwd / root-loginパラメーターをtrueに設定し、rootのパスワードを指定する必要があります。 後者の場合、このパラメーターをpreseedファイルに追加しないでください。 ちなみに、パスワードは明示的に(非常に推奨されません)、および/ etc / shadowファイルのハッシュと同様のハッシュとして指定できます。 2番目のケースでは、実行中のシステムのユーザーに必要なパスワードを設定し、そのパスワードのハッシュ値を/ etc / shadowファイルからpreseedファイルにコピーできます。 私のファイルで使用されるハッシュは、 Passw0rdパスワードに対応してます。

有用なpreseedオプションのほとんどは、 Ubuntu公式ドキュメントに記載されています 。 ところで、注意してください:いくつかの項目の1つを選択する必要がある質問にpreseedスクリプトで回答を示すには、目的の項目のテキストを英語で書くだけです(実際、開始することはできますが、英語ではできません。でも)。 したがって、目的のオプションの名前がわかっている場合は、システムを手動モードにして、このオプションに必要な値のテキストを書き込み、その自動構成をpreseedファイルに追加できます。 たとえば、私のシナリオでは、パラメータnetcfg / dhcp_optionsに値が設定されています。 この値は、ネットワークを自動的に構成できない場合のアクションを担当します。

ドキュメントに必要なオプションが見つからなかった場合は、システムを手動でインストールし、インストール後すぐに新しいシステムで次の2つのコマンドを実行できます。

 sudo apt-get install debconf-utils sudo debconf-get-selections --installer > seedlog.txt 

その結果、 seedlog.txtファイルには、インストール中に使用されたdebconfデータベースのすべての値が含まれます。 その中で、必要なパラメーターを見つけることはかなり可能です。

インストールプロセスを自動化する方法がわかったようですが、インストールされたシステム自体をどのように構成できるかについて少し説明しました。

システムのセットアップ


最初に、基本システムの上にインストールするパッケージのセットをインストーラーに伝えるために、 taskselタスクが使用されることに注意してください。 上記のシナリオでは、 ubuntu-desktopジョブ、つまり Ubuntuのベースデスクトップシステム。 次の記事では、インストール済みパッケージのリストを変更し、 taskselタスクを管理する方法について説明します。 それまでの間、私たちは基本的なUbuntuに非常に満足しており、私たちがする必要があるのは私たちのニーズに合わせて設定することだけだと仮定しています。 ところで、Ubuntuのさまざまなバリエーションの代替ディスクには、1つの特定のtaskelタスクのみのパッケージのセットが含まれています。 つまり、たとえば、Xubuntu代替ディスクには、 xubuntu-desktopタスクをインストールするためのパッケージのみがあります。したがって、CDのpreseed /ディレクトリにある標準ファイルからpreseedスクリプトのタスク名をコピーして、変更しないでください。

しかし、インストールされたシステムを構成する方法は? これらの目的のために、 preseedはシステムのインストール完了後に任意のコマンドを実行する機能を提供します。 このコマンドはpreseed / late_commandパラメータで指定され、すべての基本的なユーティリティへの呼び出しが含まれる場合があります。 この場合、2つの特別なディレクトリが利用可能です: / cdromは 、ご想像のとおり、インストールディスクの内容を参照し、 / targetは 、ハードディスクに既にインストールされているシステムのルートを参照します。

インストールされたシステム内の何かを変更するには、簡単なトリックを使用できます。chrootを使用してこのシステムに入り、事前に準備されたスクリプトを実行します。 chrootを介して入力する場合、サービスは開始されないことに注意してください。 したがって、たとえば、インストールプロセス中にMySQLサーバーへのアクセスを必要とするパッケージをこの方法でインストールしないでください。

私のスクリプトには次のコマンドが含まれています。

 mkdir /target/install/; cp -R /cdrom/extra/* /target/install/; chroot /target chmod +x /install/postinstall.sh; chroot /target bash /install/postinstall.sh 

ご覧のとおり、 インストールされたシステムのルートにinstall /ディレクトリを作成し、 extra /フォルダーの内容全体をディスクからコピーして、 chrootを使用して新しいシステムにログインした後、 postinstall.shスクリプトを実行します。

postinstall.shスクリプトには、必要なものをすべて含めることができますが、上記の制限があります。 例:

 #!/bin/bash #  APT.         . unset DEBCONF_REDIR unset DEBCONF_FRONTEND unset DEBIAN_HAS_FRONTEND unset DEBIAN_FRONTEND #     dpkg -i /install/debs/*.deb #       ubuntu cp -R /install/home/* /home/ubuntu/ cp -R /install/home/.config /home/ubuntu/ cp -R /install/home/.local /home/ubuntu/ cp -R /install/home/.gconf /home/ubuntu/ chown -R ubuntu:ubuntu /home/ubuntu chmod -R u+w /home/ubuntu 

合計で、ディスクから無人インストール用のスクリプトを作成し、インストールされたシステムを構成する方法を学びました。 ほとんどの場合、これは企業のニーズに合わせて独自のディストリビューションを作成するには十分です。 次の記事では、標準のtaskselタスクを変更して必要なものだけをインストールする方法と、システムに追加のパッケージを正しく追加する方法を説明します。

pxelinuxを使用したネットワークインストール


上記の手順はすべて、 pxelinuxブートローダーを使用してネットワーク経由でインストールを整理するためにも使用できます。 ただし、いくつかの重要な違いがあります。
  1. 言語とキーボードのパラメーターに加えて、preseedネットワーク構成オプションも明示的なカーネルパラメーターとして渡す必要があります。
  2. カーネルオプションでfileパラメーターを使用してpreseedファイルをロードすることはできません。代わりにurlパラメーターを使用する必要があります。 さらに、DHCPを介してファイル名を取得できます。詳細については、公式ドキュメントを参照してください。
  3. preseedパラメータ、特にpreseed / late_commandで / cdromディレクトリを使用することはできません。 したがって、構成スクリプトとそれに必要なすべてのデータもネットワーク経由でダウンロードする必要があります。
それ以外の場合、すべては上記とまったく同じになります。 幸いなことに、 pxelinuxisolinuxの兄弟であり、ディスクからではなくネットワーク経由で起動するように設計されています。

PSすべてがメモリから書き込まれた、多分私は何かを言及するのを忘れて、十分にはっきりしない何かを説明した。 したがって、追加やコメントを強くお勧めします。
PPS CDのリポジトリを変更し、ニーズに合わせてtaskelタスクを変更することに関する2番目の記事があります。

Source: https://habr.com/ru/post/J104029/


All Articles