Назад | Перейти на главную страницу

Как я могу использовать cygwin, не тратя впустую место на HD?

Я люблю использовать Cygwin, но я ненавижу все дополнительное дисковое пространство, которое, похоже, использует ненужные мне кеширующие материалы. Что я могу удалить, чтобы уменьшить занимаемое мной место установки?

Кстати, какой хороший набор пакетов для barebone-систем даст мне все необходимое, без лишних хлопот, с которыми я, вероятно, никогда не буду работать?

Некоторые люди, похоже, полагают, что легко поменять оборудование на любой платформе, которую использует этот человек. Вполне возможно, что 500 МБ на самом деле - это большой объем места, которым можно пожертвовать, если они, возможно, используют адаптер CF и карту 4 ГБ для запуска Windows на нетбуке или аналогичном. Или они могут устанавливать его в виртуальный образ, и эта дополнительная информация означает разницу между его размещением на разархивированном DVD или необходимостью охвата нескольких DVD-дисков и решением проблем, связанных с этим, особенно если он отправляется клиенту, который например, не особо технический; Внутренний учебный материал для приложения, которое разрабатывает ваша компания. Наличие одного определенного образа, одинакового для всех обучаемых, творит чудеса, делает среду однородной и облегчает жизнь инструктора. Виртуальные образы - простой способ сделать это в большинстве ситуаций.

Решите проблему, о которой задал пользователь, или задайте ему вопрос, чтобы получить дополнительную информацию.

ПОТЕНЦИАЛЬНОЕ РЕШЕНИЕ:

При установке Cygwin на экране, где он спрашивает, где хранить ваши пакеты, укажите его в определенном месте, например c: \ Cygwin \ Packages. Установите как обычно, запустите, чтобы убедиться, что он работает правильно. Удалите папку, в которой хранятся пакеты, если требуется для обновлений, Cygwin загрузит их снова, не самое эффективное использование полосы пропускания, но в зависимости от ваших требований это может быть лучше, чем хранение кеша локально.

Другой вариант - установить эти пакеты, но в первый раз, когда вы это сделаете, сохраните пакеты в другом месте, например, на USB-накопителе, а затем, если вам нужно сделать

Я отмечаю, что моя текущая установка составляет менее 250 МБ, она должна быть в четыре раза больше, прежде чем я начну заботиться об этом на своем ноутбуке.

Но, если вам нужно сделать его меньше ...

Загрузите установщик. Сохраните его в c: \ cygwin \ setup.exe. Запустите установщик. Отмените выбор как можно большего количества пакетов. Обратите внимание, что если вы выберете пакет, у которого есть требования, он автоматически выберет необходимые пакеты. Удалите кеш установщика (который по умолчанию должен был иметь значение c: \ cygwin (http | ftp) что-нибудь или другое. Перезапустите установщик из c: \ setup.exe, пытаясь удалить другие пакеты. Повторяйте, пока установщик не станет настолько маленьким, насколько хотите.

Обратите внимание: будет множество базовых пакетов библиотеки, которые потребуются даже при самой минимальной установке. Раньше (около года назад) я уменьшал его до менее 100 мегабайт, при этом у меня все еще оставалось все, что я когда-либо использовал с точки зрения сценариев bash.

Я не могу использовать Windows без установки Cygwin, но у меня никогда не было особых проблем с использованием дискового пространства. Я думаю, вы можете удалить папку, в которой Cygwin хранит пакеты, но каждый раз, когда вы обновляете Cygwin, он будет загружать необходимые пакеты.

Что касается настройки barebone-комплекта, это действительно зависит от того, что вам нужно. Я начинаю с базовой установки Cygwin и добавляю OpenSSH, Cron, RXVT, Screen, Vim, Git, Curl, Zip / Unzip и Wget. Это почти все инструменты, которые мне нужны, но я просто устанавливаю что-то еще, если возникает необходимость.

Вместо Cygwin вы также можете использовать больше пакетов, которые не предназначены для решения всех проблем, которые Cygwin стремится решить. Существуют пакеты утилит unix с ограниченным набором наиболее часто используемых программ.

Утилиты Unix для Windows это тот, который я использовал в свое время, но, похоже, это мертвый проект.

GnuWin32 кажется все еще жив.

Я бы начал с базового пакета cygwin и «page-fault» в любых дополнительных командах, которые вам нужны. Я веду список общих утилит, которые я использовать, но может сильно отличаться от того, что вы используете. Делать НЕ Выбрать ВСЕ пакеты при установке Cygwin. Я сделал это один раз, и это заняло около 6 ГБ. Я тогда думал, что мне никогда не придется беспокоиться о том, что у меня нет программы. Это была плохая идея.

На моем компьютере с Windows XP имеется 1,1 ГБ данных для удаления пакета обновления. Я бы удалил эти файлы, прежде чем пытаться урезать Cygwin. Попробуйте использовать WinDirStat программа и посмотрите, куда уходит все место на вашем жестком диске - вероятно, это не Cygwin. Кроме того, время от времени вам, вероятно, следует удалять C: \ cygwin \ tmp, поскольку он не удаляется при перезагрузке.

Вы можете переключиться с CygWin на Гоу, легкая альтернатива CygWin (примерно в 10 раз легче)

Если вы вытаскивали установочные файлы более одного раза, вы увидите, что неиспользуемые файлы остались позади ...

Чтобы очистить установочный набор Cygwin (не установленную базу кода, а пакет, используемый для установки ...

Я думаю, что где-то видел perl-скрипт, чтобы сделать это, но попробуйте этот java-код для очистки установки Cygwin:

    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, пытаясь получить "простую" минимальную установку. Я обнаружил, что установка утилит, таких как grep, gawk, sed и подобных инструментов, зависит от cygwin, base-Cygwin, а иногда и от нежелательных инструментов, таких как bash, coreutils и т. Д., Я не пытался полностью понять, почему существует эта зависимость, но это не моя Цель. Я хотел установить только инструменты и необходимые для них библиотеки DLL и начал изучать пакет Cygwin. Я обнаружил, что отказ от setup.exe, поставляемого Cygwin, является альтернативным способом выполнить минимальную установку Cygwin. И вот как я это сделал.

  1. Используйте setup.exe, поставляемый Cygwin, чтобы загрузить все пакеты - только загрузка, без установки.
  2. После успешного завершения загрузки отдельные пакеты, такие как zlib, gawk, grep, libiconv, находятся в каталоге x86 / release или x86_64 / release.
  3. Каждый пакет заархивирован и сжат с помощью инструмента xz или bzip и хранится в соответствующих каталогах.
  4. Чтобы установить конкретный инструмент, такой как sed или gawk, все, что нужно сделать, это извлечь исполняемый файл инструмента и его зависимости (.dll)

    Перед тем, как сделать следующее, убедитесь, что у вас есть инструмент, например 7z.exe, xz.exe, bzip2 или другой, который может распаковывать архивы .xz или bzip.

Пример установки gawk ниже:

  1. Извлеките gawk.exe из архива gawk-4.1.3-1.tar.xz с помощью команды - 7z.exe e -so gawk-4.1.3-1.tar.xz | tar xvf -
  2. Как только это будет сделано, вы должны найти gawk.exe в подпапке, обычно usr / bin в папке release / gawk.
  3. Найдите зависимости для gawk - вы можете сделать это двумя способами.

    Изучите файл Cygwin setup.ini, находящийся в папке x86 или x86_64. Найдите строку '@ gawk', и в строках после этой строки вы должны найти строку «требует:», в которой перечислены зависимости.

    Мой читается так - «требует: bash cygwin libgmp10 libintl8 libmpfr4 libreadline7»

Для запуска gawk использование bash не обязательно, поскольку у нас есть командная оболочка Windows. (bash включен, чтобы получить несколько других dll, необходимых для gawk. Однако это приводит к установке гораздо большего количества ненужных файлов). Остальные зависимости содержат файлы, которые необходимо запустить gawk. Распакуйте каждый из вышеуказанных пакетов с помощью таких инструментов, как 7z или xz, в отдельные файлы.

После того, как все зависимости извлечены, скопируйте необходимый инструмент (ы) (grep / sed / gawk) в папку и все зависимые .dll. Теперь вы сможете запустить свой инструмент с минимальным набором .dll, требуемых в голом -bones cygwin установка.

Внимание: простого извлечения зависимостей, перечисленных в setup.ini для каждого инструмента, может быть недостаточно. Иногда вам может потребоваться запустить / запустить инструмент, чтобы обнаружить, что требуется больше dll.

Есть и другие способы узнать, какие библиотеки DLL требуются для exe - вы можете использовать dumpbin из MS или dependency walker, ndepends или аналогичные инструменты, чтобы найти список зависимых dll.

Проконсультируйтесь - https://stackoverflow.com/questions/362560/how-do-i-detect-the-dlls-required-by-an-application https://stackoverflow.com/questions/475148/how-do-i-find-out-which-dlls-an-executable-will-load

Я также переборщил информацию о зависимых dll, просто запустив инструмент и установив недостающие библиотеки, перечисленные одну за другой, извлекая из необходимых пакетов.

Когда вы запускаете exe, и если он выдает ошибку с отсутствующим сообщением .dll, найдите пакет, который содержит dll здесь - https://cygwin.com/cgi-bin2/package-grep.cgi . Введите полное / частичное имя отсутствующей библиотеки DLL, чтобы найти имя пакета, содержащего эту DLL.

В конце концов, у меня получилась простая установка cygwin с только необходимыми мне инструментами и DLL. Пример: 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, о чем я не буду вдаваться.

Как пользователь cygwin я согласен с обоими предыдущими сообщениями.

ПОТРЕБНОСТИ: grep, sed, awk, cut, diff, comm, vim, OpenSSH, tar, gzip, bash, wget

Что касается места, я согласен с Яном. Небольшая цена за пространство. Теперь вы можете получить диск емкостью 1 ТБ со скоростью вращения 10000 об / мин менее чем за 100 долларов США. Я помню, как нам всем приходилось платить более 150 долларов за диск емкостью 20 ГБ.

Если вас действительно беспокоит пространство на локальном диске, попробуйте поставить себе хранилище NAS в вашей сети и хранить в нем «загруженные пакеты». Это еще больше уменьшит занимаемую вами площадь на вашем компьютере.

Это действительно небольшая цена за Cygwin.