Cygwin を使用するのは好きですが、不要なキャッシュを使用しているように見える余分なディスク領域はすべて嫌いです。インストールのフットプリントをできるだけ小さくするために何を削除できますか?
関連するメモとして、私がおそらく決して実行しないであろう綿毛なしで、私に必需品を与える良い最低限のパッケージのセットは何ですか?
一部の人々は、この人が使用しているどのプラットフォームでもハードウェアを簡単に交換できるという想定の下にいるようです。ネットブックなどでWindowsを実行するためにCFアダプタと4GBカードを使用している場合、500MBは実際には犠牲にするための大量のスペースである可能性があります。または、仮想イメージにインストールしている可能性があり、この追加情報は、解凍したDVDに収まるか、複数のDVDにまたがる必要があることと、それに伴う問題に対処することの違いを意味します。特に、次のようなクライアントに送信される場合はそうです。たとえば、特に技術的ではありません。会社が開発するアプリケーションの社内トレーニング資料。すべての研修生に同じである1つの定義されたイメージを持つことは、不思議に働き、環境を均質にし、研修生の生活を楽にします。仮想イメージは、ほとんどの状況でこれを行う簡単な方法です。
ユーザーが尋ねた問題を解決するか、質問して詳細情報を入手してください。
潜在的なソリューション:
Cygwinをインストールするときは、パッケージを保存する場所を尋ねる画面で、c:\ Cygwin\Packagesなどの特定の場所にポイントします。通常どおりにインストールし、実行して正しく動作することを確認します。パッケージが保存されているフォルダーを削除します。更新に必要な場合は、Cygwinが再度ダウンロードします。帯域幅の最も効果的な使用法ではありませんが、要件によっては、キャッシュをローカルに保持するよりも良い場合があります。
別のオプションは、これらのパッケージをインストールすることですが、最初にインストールするときは、USBドライブなどの別の場所にパッケージを保存し、必要に応じて保存します。
私の現在のインストールは250MB未満であることに注意してください。私のラップトップでそれを気にし始める前に、それはそのサイズの4倍でなければなりません。
しかし、あなたがそれを小さくする必要があるならば...
installer をダウンロードします。 c:\ cygwin\setup.exeに保存します。インストーラーを実行します。できるだけ多くのパッケージの選択を解除します。なお、要件のあるパッケージを選択すると、必要なパッケージが自動的に選択されます。インストーラーキャッシュ(デフォルトではc:\ cygwin(http | ftp)somethingoranotherになっているはずです。c:\ setup.exeからインストーラーを再実行して、さらにパッケージをアンインストールします。インストーラーが必要なだけ小さくなるまで繰り返します。
最小限のインストールでも必要となる基本的なライブラリパッケージがたくさんあることに注意してください。私は過去(約1年前)に、bashスクリプトの観点からこれまでに投げたすべてのものを持ちながら、100メガ未満にまで下げました。
CygwinをインストールせずにWindowsを使用することはできませんが、ディスク容量を使用することでWindowsをそれほど問題にしたことはありません。 Cygwinがパッケージを格納しているフォルダーを削除できると思いますが、Cygwinを更新するたびに、必要なパッケージがダウンロードされます。
必要最低限のセットアップに関しては、それは本当にあなたが必要とするものに依存します。基本のCygwinインストールから始めて、OpenSSH、Cron、RXVT、Screen、Vim、Git、Curl、Zip/Unzip、およびWgetを追加します。これらは私が必要とするほとんどすべてのツールですが、必要が生じた場合は他のものをインストールするだけです。
CygWinから Grow 、CygWinの軽量代替品(約10倍軽量)に切り替えることができます
私は基本的なcygwinパッケージから始めて、必要な追加のコマンドで「page-fault」を使います。 [〜#〜] i [〜#〜]が使用する一般的なユーティリティのリストを保持していますが、使用するものとはかなり異なる場合があります。 Do[〜#〜] not [〜#〜]select[〜#〜] all [〜#〜 ]パッケージをCygwinをインストールする場合。これを一度行ったところ、約6GBかかりました。その時、私の考えは、プログラムがないことを心配する必要は決してないだろうということでした。それは悪い考えでした。
私のWindows XPマシンのサービスパックのアンインストールデータは1.1GBです。Cygwinを削除する前に、これらのファイルを削除します。 WinDirStat プログラムを使用してみてください。すべてのハードドライブスペースが使用されている場所-おそらくCygwinではありません。また、再起動時にクリアされないため、C:\ cygwin\tmpを削除する必要があります。
セットアップファイルを複数回プルした場合、未使用のファイルが残っていることがわかります...
Cygwinインストールセットをクリーンアップするには(インストールされたコードベースではなく、インストールを実行するために使用されるパッケージ...
どこかでこれを行うPerlスクリプトを見たと思いますが、Cygwinセットアップをクリーンアップするために次のJavaコードを試してください:
import Java.io.BufferedReader;
import Java.io.File;
import Java.io.FileInputStream;
import Java.io.InputStreamReader;
import Java.text.DecimalFormat;
import Java.util.HashSet;
public class CygwinCleaner {
boolean doClean = false;
long diskFileCount = -1;
long setupFileCount = 0;
long missingFileCount = 0;
long srcFileCount = 0;
long deleteCount = 0;
public HashSet<String> pkgs = new HashSet<String>(9999);
public String formatCount(long count) {
DecimalFormat df = new DecimalFormat("##,###");
String retval = " " + df.format(count);
return retval.substring(retval.length() - 6);
}
public void checkForMissingFiles() {
for (String filename : this.pkgs) {
if (!filename.contains("-src.")) {
if (!((new File(filename)).exists())) {
System.err.println(" Missing " + filename);
missingFileCount++;
}
}
}
}
public void checkOrCleanFiles(File testfile) {
String tfap = null;
if (testfile.isDirectory()) {
for (File file : testfile.listFiles()) {
checkOrCleanFiles(file);
}
} else {
this.diskFileCount++;
tfap = testfile.getAbsolutePath();
if (!this.pkgs.contains(tfap)) {
if (this.doClean) {
System.err.println("Deleting \"" + tfap + "\"");
if (testfile.delete()) {
this.deleteCount++;
} else {
System.err.println("COULD NOT DELETE \"" + tfap + "\"");
}
} else {
System.err.println("WOULD delete \"" + tfap + "\"");
}
}
}
}
public boolean loadFileList(File file) {
boolean retval = false;
if (file.exists()) {
try {
String basedir = (new File(file.getParent())).getParent() + "/";
basedir = basedir.replace('\\', '/');
BufferedReader br = null;
br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String line = br.readLine();
String installFile = null;
boolean processlines = false;
while ((line = br.readLine()) != null) {
if (processlines) {
if (line.startsWith("install:") || line.startsWith("source:")) {
installFile = line.substring(1 + line.indexOf(" "));
installFile = installFile.substring(0, installFile.indexOf(" "));
installFile = basedir + installFile;
String hashString = (new File(installFile)).getAbsolutePath();
if (!this.pkgs.contains(hashString)) {
this.pkgs.add(hashString);
this.setupFileCount++;
if (line.startsWith("source:")) {
srcFileCount++;
}
}
}
}
if (line.startsWith("@ ")) {
processlines = true;
}
if (line.startsWith("[test]") || line.startsWith("[prev]")) {
processlines = false;
}
}
br.close();
retval = true;
} catch (Throwable t) {
t.printStackTrace();
}
}
return retval;
}
public static void main(String[] args) {
if (args.length == 0) {
System.err.println("Usage::::: CygwinCleaner {full_path_to_setup.ini} [CLEAN]\nIf only the ini file is specified then a report will be generated\nTo perform the cleanup add the second optional parameter of CLEAN");
} else {
System.out.print("CygwinCleaner: ");
CygwinCleaner cc = new CygwinCleaner();
String setupFileName = args[0];
if (args.length > 1) {
if (args[1].equalsIgnoreCase("CLEAN"))
cc.doClean = true;
}
if (cc.doClean) {
System.out.println("Performing cleanup\n");
} else {
System.out.println("Reporting only\n");
}
File file = new File(setupFileName);
cc.pkgs.add(file.getAbsolutePath());
if (cc.loadFileList(file)) {
cc.checkOrCleanFiles(file.getParentFile());
cc.checkForMissingFiles();
System.out.println(" Total of:" + cc.formatCount(cc.setupFileCount) + " files in setup.ini");
System.out.println(" Source:" + cc.formatCount(cc.srcFileCount) + " files in setup.ini");
System.out.println(" Leaving:" + cc.formatCount((cc.setupFileCount - cc.srcFileCount)) + " files in setup.ini\n");
System.out.println(" Total of:" + cc.formatCount(cc.diskFileCount) + " files in setup directory before cleanup");
System.out.println(" Deleted:" + cc.formatCount(cc.deleteCount) + " files in setup directory (unused)");
System.out.println(" Leaving:" + cc.formatCount((cc.diskFileCount-cc.deleteCount)) + " files in setup directory after cleanup\n");
System.out.println(" Missing:" + cc.formatCount(cc.missingFileCount) + " files in setup directory that are contained in setup.ini");
} else {
System.err.println("setup.ini file (" + setupFileName + ") does nofiles in setup");
}
}
}
}
Cygwinの代わりに、Cygwinが解決できることを目指しているすべての問題を解決することを意図していないパッケージを追加することもできます。最も一般的に使用されるプログラムの限られた選択だけでunixユーティリティのパッケージがあります。
nix Utilties for Windows は私が当時使用していたものですが、それは死んだプロジェクトのようです。
GnuWin32 はまだ生きているようです。
私はCygwinで、最小限のインストールで「必要最低限の」機能を試してみました。 grep、gawk、sedなどのツールをインストールすると、cygwin、base-Cygwin、場合によってはbash、coreutilsなどの不要なツールに依存することがわかります。この依存関係が存在する理由を完全に理解しようとはしていませんが、それは私のものではありません。ゴール。ツールとそれに必要なdllだけをインストールして、Cygwinパッケージの調査を開始したかったのです。 Cygwinが提供するsetup.exeを使用しないことが、Cygwinの最小インストールを実現するための代替方法であることを発見しました。そしてこれが私がそれを成し遂げた方法です。
Sedやgawkなどの特定のツールをインストールするには、実行可能ファイルとその依存関係(.dll)を抽出するだけです。
次の手順を実行する前に、7z.exe、xz.exe、bzip2など、.xzまたはbzipアーカイブを解凍できるツールがあることを確認してください。
以下のgawkの例をインストールします。
X86またはx86_64フォルダーにあるCygwinsetup.iniファイルを調べます。文字列「@gawk」を探します。この行の後の行に、依存関係をリストする「requires:」行があります。
私は次のように読みます-「必要なもの:bash cygwin libgmp10 libintl8 libmpfr4libreadline7」
Gawkを実行するには、windowsコマンドShellがあるため、bashは必須ではありません。 (gawkが必要とする他のいくつかのdllを取得するためにbashが含まれています。ただし、これにより、より多くの不要なファイルがインストールされます)。他の依存関係には、gawkが実行する必要のあるファイルが含まれています。 7zやxzなどのツールを使用して、上記の各パッケージを個別のファイルに抽出します。
すべての依存関係が抽出されたら、必要なツール(grep/sed/gawk)をフォルダーとすべての依存関係の.dllにコピーします。これで、ベアで必要な最小限の.dllセットを使用してツールを実行できるようになります。 -bones cygwinのインストール。
注意:各ツールのsetup.iniにリストされている依存関係を抽出するだけでは不十分な場合があります。場合によっては、ツールを実行/実行して、必要なdllがさらにあることを検出する必要があります。
エグゼに必要なdllを見つける他の方法があります-MSまたは依存関係ウォーカー、ndependsまたは同様のツールからdumpbinを使用して依存するdllのリストを見つけることができます
相談- https://stackoverflow.com/questions/362560/how-do-i-detect-the-dlls-required-by-an-applicationhttps:// stackoverflow。 com/questions/475148/how-do-i-find-out-which-dlls-an-executable-will-load
また、ツールを実行し、必要なパッケージから抽出して、リストされている不足しているdllを1つずつインストールするだけで、依存するdll情報をブルートフォース攻撃しました。
Exeを実行し、.dllメッセージが見つからないというエラーが発生した場合は、ここでdllを含むパッケージを検索してください https://cygwin.com/cgi-bin2/package-grep.cgi =。不足しているdllの完全/部分名を入力して、dllを含むパッケージの名前を見つけます。
最終的には、必要なツールとdllだけを使用して必要最低限のcygwinをインストールすることになりました。例:gawk-gawk.exeおよび次のdll-cygwin1.dll、cyggmp-10.dll、cygiconv-2.dll、cygintl-8.dll、cygmpfr-4.dll、cyggcc_s-seh-1.dll、cygncursesw- 10.dll、cygreadline7.dll
sed-sed.exeおよびdll-cygwin1.dll、cygintl-8.dll
これがお役に立てば幸いです。 Cywinインストーラーはdllのリベースも行いますが、ここでは詳しく説明しません。