- 投稿日:2020-01-17T09:18:24+09:00
LinuxをWDSで起動してみる (iPXE for Boot a Linux via Network on Windows Server)
WindowsServerのWDSを使用し、LiveCD LinuxをPXEブートさせる
Windows Server 2019(2016でも可能)で、以下のサービスをインストール
・DHCP Server
・Web Server (IIS)
・Windows Deployment Services
undionly.kpxe と memdisk.bin ファイルを https://www.ipxe.org/download/ からダウンロードし、作成する。
menu.ipxeを作成(以下、例)
initrd http://10.0.0.1/Images/CentOSlivecd.iso
chain memdisk.bin iso rawboot.ipxeを作成(以下、例)
chain --replace --autofree http://10.0.0.1/Images/menu.ipxe ||スコープオプションで066 Boot Server Host Nameを追加、サーバーIPを入力する
新しいポリシー(iPXE Policy)を追加、User Class, Equals, iPXEおよび067で\Boot\x86\boot.ipxeを設定する
IISのVertial Directoryで、Default Web Siteで以下を追加する
以下のファイルを \RemoteInstall\Boot\x86 フォルダへコピー
・undionly.kpxe
・boot.ipxe以下のファイルを、 \RemoteInstall\Boot\x86\Images フォルダへコピー
・menu.ipxe
・memdisk.bin
・起動したいLinuxイメージ.isoWDS上のWDS serverのプロパティで、以下のように設定する
管理者権限のコマンドプロンプトで、以下を実行する
wdsutil /set-server /bootprogram:Boot\x86\undionly.kpxe /Architecture:x86
wdsutil /set-server /bootprogram:Boot\x86\undionly.kpxe /Architecture:x64
wdsutil /set-server /N12bootprogram:Boot\x86\undionly.kpxe /Architecture:x86
wdsutil /set-server /N12bootprogram:Boot\x86\undionly.kpxe /Architecture:x64
That's all :D
OMAKE
menu.ipxeと同じフォルダにpngファイルを入れ、menu.ipxe内に
console --picture background.png
と指定しておくと、iso読込中に、画像表示できる
他には、iso複数指定したい場合は、
以下のようにmenu.ipxeを作成すればOKset server 10.0.0.1
console --picture background.png:start
menu === BOOT MENU ===
item --key a Linux1 Linux_1st_image
item --key b Linux2 Linux_2nd_image
choose --default Linux1 --timeout 10000 target && goto ${target}
goto ${selected}:cancel
echo canceled:failed
echo FAILED...
goto shell:back
set submenu-timeout 0
clear submenu-default
goto start:Linux1
initrd http://${server}/Images/Linux1.iso
chain memdisk.bin iso raw || goto failed
goto start:Linux2
initrd http://${server}/Images/Linux2.iso
chain memdisk.bin iso stack=80000 || goto failed
goto start
- 投稿日:2020-01-17T07:41:41+09:00
SereneLinux(Ubuntu18.04 Desktop)でSoftwareRAID0
SereneLinuxをRAID0にインストールするという備忘録です。応用次第でRAID1とかもできると思います。
SereneLinuxについて
日本人が開発しているubuntu18.04ベースのLinuxです。
SereneLinuxのホームページRAID0の構築
RAID0の構築について。今回は、mdadmで作ったRAID0をルートパーティションとして使用します。
パーティションの作成
今回は128GBと120GBのSSD、2つでRAIDを構築します。
RAID0の場合、必要なパーティションは、下の3つです。(RAID1の方は別途調べてください。)
- EFIパーティション
- ブートパーティション
- RAID用パーティション
今回は128GBのSSDを、下のように分けます。
- EFIパーティション 128MiB
- ブートパーティション 700MiB
- RAID用 残り全部
120GBの方は全てRAID用パーティションとして使います。
今回はGpartedで作成しました。注意
- EFIパーティションを作るときは、FAT32で作成して、フラグをboot,espに設定してください。
- ブートパーティションは、EXT4で作成してください。
RAIDの作成
大抵のubuntuベースのLiveCDにはmdadmが入ってません。
そこでまず、mdadmをインストールします。$ sudo apt update && sudo apt install mdadm次にRAIDを構築します。
$ sudo mdadm -C /dev/md0 -l[RAIDのレベル] -n[デバイスの数] [RAID用パーティション1] [RAID用パーティション2]RAID0の場合は、"-l"の後ろの数字を"0"にしてください。
2つのディスクでRAIDを構築する場合は、"-n"の後ろの数字をディスクの数にしてください。
"-n"の後ろにRAIDで使用するパーティションを指定してください。
今回は作成したRAID0をXFSでフォーマットしました。
ファイルシステムはお好みのを使用してください。(分からなかったら、EXT4が無難です。)インストール
インストーラを起動して指示に従ってインストールしてください。
終わったら、"試用を続ける"を選択してください。インストール後の設定
このまま再起動すると起動しないので、再起動する前にシステムをいじる必要があります。
chrootでシステムをいじるれるよう準備します。$ sudo mount [作成したルートパーティション] /mnt $ sudo mount [作成したブートパーティション] /mnt/boot $ sudo mount [作成したEFIパーティション] /mnt/boot/efi $ sudo mount -t proc none /mnt/proc $ sudo mount --bind /dev /mnt/dev $ sudo mount --bind /sys /mnt/sys $ sudo mount --bind /run /mnt/runchrootでシステムに入ります。
$ sudo chroot /mntmdadmをインストールします。
# apt update && apt install mdadm
ここで、mdadmのインストールに失敗したら
chrootから出て、上のコマンドを実行すると成功するかもしれません。$ sudo cp /etc/resolv.conf /mnt/etc一旦、chrootから出て、/mnt/etc/mdadm/mdadm.confを編集します。
$ sudo mdadm -D --scan >> /mnt/etc/mdadm/mdadm.conf再び、chrootに入って
$ sudo chroot /mntinitramfsの更新とgrubのインストールを行います。
# update-initramfs -u && grub-install [EFIパーティション]これで再起動して、起動すれば成功です。
まとめ
正直、RAID0をルートパーティションとして使用する人いる?
Q:そもそもなんで、ubuntu serverとかFedoraとかArchとか使わないの?
A: 長いので、知りたい人だけ見てください。↓
なんでこんなことしようと思ったの?
要約するとintelとNECのせい。
自分の使っているノートパソコンにintelのwifiが乗っているのだが、これがNECのルーターと相性が最悪なのである。windowsのときはなぜか大丈夫だったのだが、Arch、Fedora、debianと試してみたのだが、インターネットを使うとwifiが切れる。これだけならまだ許容範囲。
しかし、何故かルーターを再起動しないとルーターがインターネットに繋がらなくなるという結構ヤバイ不具合を引き起こすのである。
(なぜかubuntuは大丈夫だったので今は、ubuntuベースのSereneLinuxを使ってます。)
(個人的にはカーネルが原因かなと思っている。)
Server版使えば?
まぁ、こういう話になるが、新しいのも古いのもインストーラーがwifiを認識しない。
なので、こういうことをすることになりました。みんなも気をつけよう相性問題。SereneLinuxの感想
- 軽い
- SetupとかStartdashとかがLinux初心者には良いと思った。
今まで、ubuntuとかzorinとかPop!_osとか色々つかってきましたが、gnomeじゃないので軽い。
zorin liteとかxubuntuとかのxfceデスクトップのディストロもありますが、zorin liteは目玉のzorin appearanceが使えないという不具合がありました。
(そもそも色が合わなかったでやめました。(ダーク+ブルーって見づらいね。))
スタイリッシュなxfceのディストロが増えたのは個人的には嬉しいです。(xubuntuはダサかったので論外)ただのわがまま
ubuntuにもFedoraみたいにデスクトップ版でもRAIDが簡単にできるといいなぁ
参考
http://blog.seishiono.net/entry/2014/05/03/223948
https://askubuntu.com/questions/469209/how-to-resolve-hostnames-in-chroot
https://wiki.archlinux.org/index.php/Chroot#Using_chroot
https://ankyo.blog.ss-blog.jp/2011-10-24
- 投稿日:2020-01-17T01:12:45+09:00
【C言語】Linuxでのcrypt関数の使用法【パスワードハッシュ化】
0.はじめに
使う機会があり調べたことをまとめる。
Linuxの機能を用いているらしいため、他の言語で使ったことがある人は多分同じ感覚で使えると思う。
筆者のテスト環境
Ubuntu 18.04.3 LTS
コンパイラ gcc 7.4.0
crypt()関数とcrypt_r()関数の二つがあるが、crypt_r()関数はcrypt()関数のリエントラント版、
つまりcrypt()関数はマルチスレッド安全でない一方、crypt_r()関数はマルチスレッド安全である。
2つの関数についてそれぞれ使用例を挙げた後、解説をしようと思う。注:crypt関数の仕様はOSによって異なるので、正確な内容を知りたい場合は
man 3 crypt
コマンドを使ってマニュアルを読んでください。
以下の内容はGNU/Linux(Ubuntu18.0.4)での話です。1.crypt()関数
プロトタイプ宣言は次の通り。
char *crypt(const char *key, const char *salt);
key はハッシュ化したい文字列、
saltはハッシュ化の際に使用する文字列。戻り値は、
idを指定しなかった場合はハッシュ化されたkey,
idを指定した場合、 (saltの文字列) + "$" + (ハッシュ化されたkey)。
(idについては後述。)1.1 crypt()関数の使用例
crypt_test.c#include<crypt.h> #include<stdio.h> #include<string.h> #define BUFSIZE 1024 int main(void){ char key[BUFSIZE] = "key"; // ハッシュ化したい文字列 char salt_origin[BUFSIZE] = "example"; //ソルトの文字列 char salt[BUFSIZE]; char encrypted[BUFSIZE]; // 結果格納用 sprintf(salt, "$6$%s", salt_origin); // ソルトの整形、id指定(後述) strcpy(encrypted, crypt(key, salt)); //encrypted変数には、 //文字列"$6$example$(ハッシュ化されたkey)"が格納される printf("%s\n", encrypted); }コンパイルの際には-lcryptオプションをつけること。
2.crypt_r()関数
プロトタイプ宣言は次の通り。
char *crypt_r(const char *key, const char *salt, struct crypt_data *data);
crypt_data構造体はcrypt.hヘッダファイル内で定義されており、ハッシュ結果保存のために使用される。
crypt_data構造体の定義
struct crypt_data
{
char keysched[16 * 8];
char sb0[32768];
char sb1[32768];
char sb2[32768];
char sb3[32768];
char crypt_3_buf[14];
char current_salt[2];
long int current_saltbits;
int direction, initialized;
};crypt_data構造体の変数は、1度目のcrypt_r()関数使用でその構造体変数を渡す前にinitializedメンバ変数を0にする必要がある。
keyschedメンバ変数にはハッシュ化した後のkeyが格納される。2.1.crypt_r()関数の使用例
crypt_r_test.c#define _GNU_SOURCE // crypt_r()関数を使用するためには、このマクロ定義を //どのファイルのインクルードよりも前に記述する必要がある #include<crypt.h> #include<stdio.h> #define BUFSIZE 1024 int main(void){ char key[BUFSIZE] = "key"; // ハッシュ化したい文字列 char salt_origin[BUFSIZE] = "example"; // ソルト。 char salt[BUFSIZE]; struct crypt_data data; // ハッシュ結果保存のために必要な構造体 data.initialized = 0; // crypt_r()関数使用の前に行う必要有り。 sprintf(salt, "$5$%s", salt_origin); // id指定(後述) crypt_r(key, salt, &data); printf("%s\n", data.keysched); //keyschedメンバ変数には、 //文字列"$5$example$(ハッシュ化されたkey)"が格納される }コンパイルの際には-lcryptオプションをつけること。
2.2._GNU_SOURCEについて
crypt_r()関数を使うには、マクロ定義
#define _GNU_SOURCE
をどのヘッダファイルのインクルードよりも前に行う必要がある。
ソースコードの最初に記述しておくのが無難である。
自分で定義したヘッダファイルを使用する際には、インクルードガードの直後に記述するのが無難である。
もしくは、
マクロ定義はコマンドラインからも行えるのでそちらで行ってもよい。
-D<マクロ名>[=値]
というオプションをコンパイル実行時に渡してやればよい。
例えば、コンパイル時に-DN=2というオプションを渡すのは、#define N 2
をソースコード内で記述するのと同じ意味になる。
今回の場合で言えば、#define _GNU_SOURCE
をソースコードの最初に記述する代わりに、コンパイル時に-D_GNU_SOURCEというオプションを付け加えてもよい。
Makefileを使うならばこちらでもよいのではないだろうか。
3.saltについて
仕様可能文字は[a-zA-Z0-9./]。小文字のアルファベット、大文字のアルファベット、数字、'.'と'/'である。
crypt関数に渡すsaltのフォーマットを整えることによって、ハッシュアルゴリズムを指定することができる。
saltを$(id)$(saltの文字列)$
という風にする。
idはハッシュアルゴリズムを指定するための番号である。(ハッシュアルゴリズムについては後述)
(ちなみにsaltの文字列の最後の$マークは省略可能である。)例.
salt = "$5$example";
この例では、ハッシュアルゴリズムをSHA-256で指定し、saltの文字列として"example"を指定している。idを指定せずに文字列だけ渡すとDES方式でハッシュ化される。
3.1.saltのidとハッシュアルゴリズム
- idとハッシュアルゴリズムの対応表
id ハッシュアルゴリズム 1 MD5 2a Blowfish(OSによっては使用できない可能性有) 5 SHA-256 6 SHA-512 無指定だとDESになる。DESはSaltを2文字しか使用せず、パスワードは8文字までしか認識しないため、とても脆弱であり、使用は推奨されない。
- ハッシュ化後の文字列の文字数
ハッシュアルゴリズム ハッシュ化後の文字列の文字数 MD5 22文字 SHA-256 43文字 SHA-512 86文字
- saltの文字数
DES:2文字固定 (saltの文字列の先頭二文字のみ見る、それ以降の文字は無視される )
MD5:8文字以内 (saltの文字列の先頭8文字のある分だけ見る、それ以降の文字は無視される)ハッシュアルゴリズムの安全性について、
DES<MD5<SHA-256<SHA-512
と、idの数字が大きくなるほど安全性は高くなる。4.終わりに
コンパイル時には-lcryptオプションを忘れないこと。
何か間違いなどございましたらご指摘ください。
5.参考
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/crypt.3.html
https://blog.amedama.jp/entry/unix-crypt-3