【Bash】Windows Subsystem for Linux【WSL】6
■ このスレッドは過去ログ倉庫に格納されています
WSL2アーキテクチャ
https://www.atmarkit.co.jp/ait/articles/1906/14/news019.html
WSL 2では、仮想マシン環境が起動し、bashがコマンドを受け付けるまで2秒程度という速度で起動できる。
このため、コマンドプロンプトなどからwsl.exeなどを使ってbashコマンドを処理する時間は、
現在のWSL 1とほとんど変わらない。また、本物のLinux実行環境であるため、
これまで正しく動作できなかったアプリケーション、例えばコンテナシステム(Dockerなど)や
ユーザーファイルシステム(FUSEなど)も動作させることができる。その上で、現在のWSL 1と同等の機能と使い勝手を実現するという。
WSL 2はWSL 1を置き換えずに併存する
WSL 2が登場したからといって、WSL 1は廃止になるわけではなく、引き続き利用可能である。
ファイル共有プロトコル「9P」でWSL 1との互換性を確保
このように、WSL 2とWin32環境の間のファイル共有は、どちらも9Pを使うことになる。
また、WSLからWin32プログラムを起動する「Win32相互運用性」では、最初にWSL側で、
実行ファイルを判別する必要がある。具体的には、実行ファイル先頭のマジックナンバー
(Win32ではMZ)を見て、LinuxのELF64か、Win32の実行ファイルなのかを判断する。
【Bash】Windows Subsystem for Linux【WSL】5
https://mao.5ch.net/test/read.cgi/linux/1553100855/ BSD3〜4.2の時はBSDの方が高機能
だったけど、SYSVでほぼ取り込みされてるからね
当時最先端だった筈のマイクロカーネル
陣営で生き残っているにはWindowsぐらいか MacOSXは一応Machの末裔だから、マイクロカーネルじゃないんですかね
まあ商用マイクロカーネルOSで最も普及してるのは確かにNTだなここ20年くらい それを言うならNextだね
OMRONのLunaも無くなって悲しいね
カモメ時代のLinuxをフルボッコした奴ら
今頃どんな顔して生きて居るのでしょう? 昔からWindows(9x,NTすべて)はマイクロカーネルじゃないだろ。
どこにそんな情報があるんだ? NTはマイクロカーネル
95はキマイラ
ってのが定説だけど
NTのDDK本の最初の翻訳本を作ったWinProgDDKの中野一人です
なお、翻訳時に単位を間違えたのは別之一人あるね いやだからそのNeXT OSのカーネルがMachパクってたんだろ…
Machは元々BSDのマイクロカーネル実装実験
読みはマッハじゃなくてマーク 戦うプログラマーとか胃がキリキリしながら読んだなあ
NTも技術的にはVAXの系譜で由緒はわりとしっかりしてる
MSアンチにデタラメ垂れ流されてるけどNTは純然たるマイクロカーネル実装 アビー・テバニアンが盗人とな?
大学で学んだ事を産業化すると泥棒なのかね? 18975にしたらWSL2にしたUbuntuがアプリのアイコンから起動出来なくなった…(wsl、bashコマンドからはOK)
WSLのフィードバックは提供する内容がちょっと違うのね ストア経由で入れてないから、WSLのアイコンが一つもないわ 何をもってマイクロカーネルと定義するかにもよるけど、
特権モードで実行される部分をできるだけ少なくするという観点からはNTもMacOSも
全くマイクロカーネルではない
特にNTは3.1の時点でLinuxより特権モードで実行される部分が多い
NTはプロセス管理もメモリ管理もファイルシステムも全部Linuxと同様に特権モードで
動く単一バイナリのNTカーネルntoskrnl.exeで実行されている上に、レジストリ関係も
ntoskrnl.exeで実行されるので他のOSより特権モードで実行される部分が多い
さらに4.0でWIN32APIのグラフィック関係のGDI32.dllやUSER32.dllがユーザ
モードで動くCSRSS.exeへのメッセージ通信から、特権モードで動くwin32k.sysへの
システムコールになり、グラフィック関係が特権モードで動くようになった
Vista以降DirectX関係はユーザーモードで動くDWM.exeが関わるようになったけど、
10でもGDI関係はwin32k.sysへのステムコールのまま
NTのマイクロカーネル的な要素はサブシステムと呼ばれるユーザランドの側だけだよ 重箱の隅つついてケチつけるのが目的で、手段はどうでもいい類の。
アップル無罪。 >>311
特権モードで実行される部分を少なくするのと
マイクロカーネルは全く関係ないんだけど、
自分から何を持ってマイクロカーネルと定義するか?と言っておきながら
間違った定義で、マイクロカーネルではないとするのはなんで?w >>313
君こそ何いっているの?
OSの機能を独立性の高いモジュールに分割し、システムコールやサブルーチン
コールではなく、相互依存性の低いメッセージ通信で各モジュール間をつなぎ、
できるかぎり、何でもできるがゆえ問題が生じやすい特権モードではなく、ユーザ
モードで実行されるサーバープロセスでするようにするのがマイクロカーネルの思想
例えばMINIXだと、プロセス管理はpm,ファイルシステムがfs、仮想メモリ管理のmm、
サーバの起動やドライバの管理がrs等のユーザーモードで動作するサーバーによって
プロセス管理やメモリ管理、ファイルシステム等のOSの基本機能が実現している
GNU HURDやQNXなども同じ
これらのマイクロカーネルOSとLinuxやWindows NT、MacOSは全く構造が違う 嫌、少なくとも3.xの頃はマイクロカーネルを自称していたよ。
本来の NT4 の実装に失敗して以降グダグダで
マイクロカーネルじゃ無いじゃ無いって意見はありかもしれないが >>314
要件としては細かいモジュールに分けていればいいので
特権モードとかいうのは関係ない
例えばドライバが特権モードを使っていても、
カーネルとドライバが分離されていれば
マイクロカーネルになる >>315
当時を振り返ればわかると思うが、3.xからNT4で何を変えたかと言うと
GPUドライバをカーネル空間(特権モードとは関係ない)に持ってきただけだよ
当時の性能では真のマイクロカーネルではパフォーマンスが悪かったから
別に完全にマイクロカーネルを諦めたわけじゃない。一部妥協しただけ 当時のというか現在でも結局理念通りの実装ではコンテキストスイッチの実行コストがバカにならず性能がスポイルされまくって非現実的なので
実用性を求めるOSではメッセージや実装によってはネットコードやファイルシステムの一部もカーネルモジュールで実行させるようになっている
理念通りに分割したままの実装なんて、実証用や学習用くらいじゃねえの?
何十MBもキャッシュを積んだ数GHz動作のプロセッサと高速で大容量のメモリをジャブジャブ使える今現在でさえこうなんだし
数10MHzかそこらのCPUとメモリでやってた頃なんて、原理主義的なマイクロカーネル実装では到底使い物にならなかっただろう >>316
> カーネルとドライバが分離されていれば
> マイクロカーネルになる
ならLinuxはマイクロカーネルだねw
NTもLinuxもドライバはモジュールだよ NTでは*.sysがカーネルモードで動作するモジュールで
Linuxでは*.koがカーネルモードで動作するモジュール
どっちもカーネルは普通のcall&ret命令でモジュールを呼び出しているから
この辺の構造はLinuxもNTも全く同じ
これをマイクロカーネルと定義するならLinuxもNTもマイクロカーネルになりまつ だからLinuxもマイクロカーネル化してきてるんだよ。
もっともNTほど細かく別れてない。ドライバ以外は結合しちゃってるから >>323
64bit版はいつ出るんや
待ちくたびれたで 俺様が認証したものがマイクロカーネルである。エヘン!
そんな訳ねえだろうに >>321
> もっともNTほど細かく別れてない。ドライバ以外は結合しちゃってるから
いいえ
CentOS 7のカーネルだと*.ko.xzが約2500個、Windows 10のC:の*.sysが
約2400個だから同じぐらいだね >>327
Linuxはドライバ以外が結合してるって言ってるのに、
Linuxのドライバは結合されてないという証拠持ってきて
何をしたいの? >>328
分割度合いの違いに関する客観的な根拠が他にあるなら具体的に示してね
>>329
何が言いたいの?
あのLinuxのモジュールって、例えば、kernel/fs以下にはxfs.koとかfat.koとかvfat.koとか
普通にファイルシステム関係のコードが分割されて存在しているんだけど 何が言いたいの?
Linuxはモノリシックをすてマイクロカーネルになった
NTを真似たのです。ってことかなぁw 利便性と速度で結局どっちもハイブリッドにないましたちゃんちゃん
これだけのことだろ?何長々と揉めてんの? コンピュータの性能が十分に高ければ
マイクロカーネルの方が良いという話 サブシステム毎の固有ハンドルが返って
くるマイクロカーネルの方が不便だよ 特権モードで動作するOSの機能を分割してモジュール化するなんて50年以上前の
メインフレームの時代からある機能だしMSDOSだってそうだよ
> カーネルとドライバが分離されていれば
> マイクロカーネルになる
この定義だとNTだけでなくMSDOSもWindows 9xもFreeBSDもSolarisも全部マイクロ
カーネルになる
特にWindows 9xなんて単一のバイナリのカーネルがあるんじゃなくてvmouse.vxdや
vkb.vxd、vwin32.vxd等特権モードで動作する複数のvxdでカーネルが構成されているから、
この定義だとWindows 9xの方がNTよりマイクロカーネル的なOSになる
バカじゃないの 今となっては、ドライバー付与する度に
カーネルコンパイルするOS(ex.Solaris1)
とかの方がマイナーですね 自前でカーネルをビルドする前提の話だけど、組み込むのとモジュールにするのでパフォーマンスに差って出るのかな セグメント超えをする時にオーバーヘッド
はあるでしょうが、特権超えの方が大きいから
無視しても良いんじゃない? windowsのコマンドとパイプでつなぐときに改行コード変換するオプションとかあります?
sed噛ましたりじゃなく パイプというのはバイナリデータを含むデータを無変換で渡すものです。
そうじゃないと、curlで取ってきたtar.gzをローカルに保存せずに展開なんてできないでしょ >>342
だからパイプやリダイレクトは基本的な設計思想として
「変換は一切しないものなんです」ってこと
これはUnixの頃からそういう思想だから
変換したいなら何らかのコマンドをフィルタとして間に入れるだけでしょ >>343
間にwsl.exe入るじゃん
そいつに変換するオプションぐらいあったって罰は当たらないんじゃないの >>345
wsl.exeのオプションにしたら、常に変換する指定しかできないじゃん パイプでtrやsed噛ませて変換してからさらにパイプすればいいだけだよな
何を気にしてるのかよく分からん UNIXの思想をわかってない。
単純なコマンドを組み合わせって大きな仕事をするものだ これに関連して色々試してみたら変な現象見つけた。
/mnt/c/Windows/System32/PING.EXE
/mnt/c/Windows/System32/PING.EXE|cat
この2つで出力結果が違う。出力は対象指定してないってヘルプが出るんだけど、cat通すと英語になる。
パイプじゃなくてファイルにリダイレクトしても同じ。
これ既出?ググったけど、WSL環境を日本語化するってページがノイズになって情報が出てこない。
ついでに他に試した結果。
英 語: /mnt/c/Windows/System32/PING.EXE>test.txt
日本語: (/mnt/c/Windows/System32/PING.EXE)
英 語: (/mnt/c/Windows/System32/PING.EXE)|cat
英 語: echo "$(/mnt/c/Windows/System32/PING.EXE)"
日本語: while true;do /mnt/c/Windows/System32/PING.EXE;break;done
英 語: echo|while read dummy;do /mnt/c/Windows/System32/PING.EXE;done
英 語: echo|/mnt/c/Windows/System32/PING.EXE
英 語: /mnt/c/Windows/System32/PING.EXE</dev/null
日本語: echo;/mnt/c/Windows/System32/PING.EXE しらんけどコードページが変わってるとかじゃねーの? >>350
/mnt/c/Windows/System32/PING.EXE
そのままCP932で出力されるので、コンソールはchcp 932の状態になる→UI言語は日本語
/mnt/c/Windows/System32/PING.EXE|cat
パイプを挟むとUTF-8で出力されるので、コンソールはchcp 65001の状態になる→UI言語は英語
ということだと思う。 ちと違うな
通常はコンソールに表示する段階でUTF-8(CP65001)に変換される
PING.EXEはCP932の状態で実行→UI言語は日本語
パイプやリダイレクトを通す場合は変換されてはまずいので
PING.EXEを最初からUTF-8(CP65001)の状態で実行→UI言語は英語
こんな感じか? >>346
まじか
どうやんの?
>>349
それ誰か言ってくるだろうと思ってた
でもWindowsやん WSLのbash上で「ping /?」と入力するとなぜか文字化けしない日本語ヘルプが表示されるんだが、
「ping /? | less」や「ping /? > aaa.txt」などのように|や>で出力をパイプでつなぐと英語表示になる。 >>359
「どうぞ、この哀れなわたくしにfuse_mountのおめぐみぉぉ…」
「なにを言う!おまえは職業乞食だろ!だんなぁ、fuse_mountは本当に憐れなこっちにめぐんでくだせぇ」 (⌒⌒)
ii!i!i ドッカーン!
ノ~~~\
,,,,,,,/`・ω・´ \,,,,,,,,,, insider build 18980でOS起動不可になっちゃったわ sudo codeした時に、codeコマンドがないって言われるのはどうしたらいいんだろ
そもそもWSL内でcodeコマンドとか打った時って、どういう仕組みでWindows側のVSCodeが起動するんだぜ? >>366
パスが通ってない
そもそもインストールできていない
wsl側からでもwindowsアプリは普通に実行できる code.exeなんじゃない?
WSLからWinアプリが動くのはパスが通ってるのとbinfmtの会わせ技だったかと せめてLinuxの起動の仕組みぐらいは理解してほしいね すまん、sudo "$PATH"とか無駄なことして、パスが通ってるつもりになってたわ >>209
× Windows では、fork が無い
○ Windows の Ruby では、fork が無い どううまくいかないのか書かないのかな?
インストールできても初回の起動に失敗するとか
仮想NICが認識されないとか 動かない、動かない、とにかく動かない!
俺様が間違ってるわけないんだからM$が糞に決まってる!
M$M$M$!!!! WSLって、forkとファイルアクセスが遅いだけで実行速度自体が遅いわけでもないんだな
遅かったシェルスクリプトをbash互換からzshビルトイン使ってfork減らすようにして、ディスクアクセスもキャッシュするようにしたらそこそこ速くなった
そこまでするなら適当なLL使った方が良い気がするけどw
>>378,379
Linuxと同じ程度には仮想化環境にも対応してるから、妹と違って設定適当でも美味しく頂けるw scoop使ってruby入れたら上手くいかなかったけどWSLでrbenv使ってruby入れたら上手くいった
WSLはいいものだと思う >>380
具体的にどんな変更をしましたか?
zshで遅くて困っています。 >>382
具体的にって言ってもやってる事が違うから、どれ位、参考になるか分からんぞ。長文
ビルトイン使う例として、
dir=$(dirname $path);
file=$(basename $path)
ext=$(echo $path | sed -E 's/^.*\.([^\.]+)$/\1/g')
みたいにしてたのを
dir=${path:h}
file=${path:t}
ext=${path:e}
にするとか
sedやtr使ってた所で正規表現なしでもいけるのは${%%}${:#}${//}とかで置き換えたり
大文字小文字変換とかも変数の展開フラグでできる
正規表現が必要な所は、1箇所にまとめた上で、パイプじゃなくて、;でつなぐとか
ret=$(echo $base | sed -E 's/aaa/bbb/g;s/ccc/ddd/g;y/abc/ABC/')
パーツパーツでコピペで使いまわしにくくなるけど、forkは減らせる
文字列検索とかもgrepなしで変数展開フラグでいける
文字列のjoinでj:使うとか
before=(a b c d)
after="'"${(j:', ':)before}"'"
echo $after # 'a', 'b', 'c', 'd'
他にも配列も検索とか、和差積とかも出来る
find使ってる所も結構ビルトインで行ける
for zip in $(find . -name '*.zip');do 〜 ;done
↓
for zip in **/*.zip;do 〜 ;done
GLOBSTARSHORTつけてたら**.zipでOK
続く 続き
変数名の局所化の為にサブシェル使う所も、zshなら無名関数でいける(forkしない)
local ret;
(){
local tmp=$1 tmp2=$2
〜なんか変数使って処理
ret=$tmp3
} $base1 $base2
ビルトインとか配列検索や文字列置換とかはmanの14,15章に載ってる。これ流し読みして、ビルトインで行ける所を洗い出す。日本語は多分ない。
ttp://zsh.sourceforge.net/Doc/Release/index.html
情報量はドキュメントに比べると少ないけど参考になった日本語サイト
変数とかフラグとか:ttps://gist.github.com/sho-t/d9cdf8271b3de7c4238739e523490542
findを使わないファイル検索:ttps://qiita.com/mollifier/items/1c4a4930a89aa75e5ced
配列操作:ttps://qiita.com/mollifier/items/f897b3fddd2d10369333
コンパイルが有効な場合もある。これをファイルの頭に入れとくと更新時だけ自動でコンパイルする(勿論手動でやっても良い)
(){
local srcFile
for srcFile in ${1:h}/*.sh; do
local zwc="$srcFile"'.zwc'
if [ ! -e $zwc -o "$srcFile" -nt "$srcFile"'.zwc' ]; then
zcompile "$srcFile"
fi
done
} $0
この場合ファイルを分割してsourceしてるから、for文で回してるけど、スクリプトが1つのファイルなら、forはいらない。単純に$0に.zwcつけたのだけやれば良い
ファイルのキャッシュは特殊な処理だから参考にはならんと思うから省略。一般的に使えるのは、>>で何度も書き込むんじゃなくて、変数に入れて一気に書き込むとか(データ量と搭載メモリによっては逆効果)
ファイルアクセスを細かくやるとウイルスチェックが異常に重いから、実行時はリアルタイム保護切った方が良い
結論。面倒。過去の資産を使いまわすのでなければLLでやった方が良い 結論の一行だけでよかった説
shell使わずにLLで書き直せばいい。それでもI/Oまわりで遅いんだけど。 そこまでやるともう別物だし
メンテも面倒になりそうだし
嬉しみが無い 100万プロセスとか起動するなら、Ruby でも使えば?
外部コマンドを呼ばなければ、1プロセスで済む >>383
Ruby なら、こういう感じ
file_path = "tmp/a/b.tar.gz"
p File.dirname( file_path ) #=> "tmp/a"
p File.basename( file_path ) #=> "b.tar.gz"
p File.extname( file_path ) #=> ".gz" 単純な計算。
100万プロセスが本当なら、1プロセス256kbとして
1000000×256kb=256000000kb=250000MB
=244GBの主記憶が必要。
という事は、NUMA機がいるなぁw
設定を妹並には煮詰めないと >>391
ならruby使う必要無いな
布教活動止めれ /\___/\
/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたはじまった
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\ WindowsPCを渡された・・・orz
WSLが入ってたのでXサバ入れてアプリだけでもと思った・・・
WSLから立ち上げたEclipseで日本語が入力できねぇ・・・
(-_-);
トイレで独り乾いた涙を流すおっさんが出来上がった。
ググる先生、トイレで大活躍w Windows版Eclipseを使えばいいだろ
GUIアプリに関してはほぼ全てWindows版があると思っていい ■ このスレッドは過去ログ倉庫に格納されています