Я пытался загрузить его несколько раз с нескольких разных компьютеров и сетей. Когда я пытаюсь скачать его, загрузка застревает на полпути, хотя. Где я могу найти надежного автономного установщика?
4 ответа
У меня есть модифицированный apt-cyg, который запускает установщик из локального архива.
Это действительно должно быть представлено как патч, но никогда не было времени, чтобы очистить его, так что здесь.
Характеристики
- Автономная установка
- Установить зеркало
- Пакет кэша, поэтому последующие установки могут быть быстрее
- Принудительная переустановка, даже если пакет установлен
- Поддерживает setup.ini / setup.bz2 /
- Используйте загрузчик по вашему выбору для получения пакетов (по умолчанию мы используем rsync)
- Сканирует кеш для остатков, максимально использует пакеты из неудачных установок setup.exe. (просто убедитесь, что вы указали папку кеша при установке из setup.exe)
Скачать
http://pastebin.com/SSTZ4ATL
или посмотрите нижнюю часть этого ответа
Использование:
Допустим, вам нужно локальное репо по адресу c:/archive/cygwin/
или /cygdrive/c/archive/cygwin/
если это имеет значение.
Позволяет настроить репо, независимо от скорости загрузки. Отрегулируйте зеркало в зависимости от того, где вы живете, или это самый быстрый доступ.
cat > /cygdrive/c/archive/cygwin/sync-with-cygwin-mirror.sh <<"EOF"
#!/bin/bash
#
###
# Choose mirror that is on http://www.cygwin.com/mirrors.html
#
# "ftp://ftp.jaist.ac.jp/pub/cygwin/"
# "ftp://ftp.sunet.se/pub/lang/cygwin/"
# "http://mirrors.kernel.org/sourceware/cygwin/"
#
# Old
# "http://sources.redhat.com/cygwin/mirrors.lst"
###
rsync --partial -va rsync://ftp.jaist.ac.jp/pub/cygwin/release/ /cygdrive/c/archive/cygwin/release/
#
#/cygdrive/c/archive/cygwin
EOF
Затем запустите следующее
chmod +x /cygdrive/c/archive/cygwin/sync-with-cygwin-mirror.sh
Отныне простой /cygdrive/c/archive/cygwin/sync-with-cygwin-mirror.sh
обновит ваш локальный репо до самого последнего и лучшего.
Затем настройте параметры среды, чтобы setup.exe не запутался.
cat > /etc/setup/last-cache <<"EOF"
C:\archive\cygwin
EOF
Настройте зеркало по умолчанию на то, что быстрее для вас
cat > /etc/setup/last-mirror <<"EOF"
ftp://ftp.iij.ad.jp/pub/cygwin
EOF
тогда попробуй!
apt-cyg find <pacakge name>
apt-cyg install <package name>
Пример вывод типовой установки сессии (я использовал --force
здесь этот пакет был установлен aready. Тебе это не нужно. Просто для того, чтобы показать, как использовать, здесь)
$ apt-cyg install man --force
Working directory is /cygdrive/c/archive/cygwin
Mirror is ftp://ftp.iij.ad.jp/pub/cygwin
We are using the cache as package source.
Installing man
Found package man
DBG:pwd=[/cygdrive/c/archive/cygwin]pkg=[man]file=[man-1.6f-1.tar.bz2]mirror=[ftp://ftp.iij.ad.jp/pub/cygwin]install=[release/man/
man-1.6f-1.tar.bz2]
DBG:169:pwd=[/cygdrive/c/archive/cygwin/release/man]pkg=[man]file=[man-1.6f-1.tar.bz2]mirror=[ftp://ftp.iij.ad.jp/pub/cygwin]insta
ll=[release/man/man-1.6f-1.tar.bz2]
Checking md5hash [9a34daa8d8dfbf9222035b4f1952ab1d] == [9a34daa8d8dfbf9222035b4f1952ab1d]
Unpacking...
Package man requires the following packages, installing:
bash libgcc1 bzip2 coreutils gawk groff gzip less cygwin
Package bash is already installed, skipping
Package libgcc1 is already installed, skipping
Package bzip2 is already installed, skipping
Package coreutils is already installed, skipping
Package gawk is already installed, skipping
Package groff is already installed, skipping
Package gzip is already installed, skipping
Package less is already installed, skipping
Package cygwin is already installed, skipping
Package man installed
Обратите внимание, что, поскольку у нас уже есть локальная копия, она не подключалась к сети, а вместо этого использовала известную копию, которая была у нас. Даже если мы не знаем, есть ли у нас пакет, пока пакет находится где-то в подкаталоге кеша, apt-cyg найдет его и использует хеш md5sum для проверки, сломан пакет или нет.
Помогите:
apt-cyg: Installs and removes Cygwin packages.
"apt-cyg install <package names>" to install packages
"apt-cyg remove <package names>" to remove packages
"apt-cyg update" to update setup.ini
"apt-cyg show" to show installed packages
"apt-cyg find <patterns>" to find packages matching patterns
"apt-cyg describe <patterns>" to describe packages matching patterns
"apt-cyg packageof <commands or files>" to locate parent packages
Options:
--mirror, -m <url> : set mirror
--cache, -c <dir> : set cache
--file, -f <file> : read package names from file
--noupdate, -u : don't update setup.ini from mirror
--localdiskcache : Use local cache as source, if available. Used for offline instalation.
--force : Force re-installing package. USE WITH CAUTION AND CARE!
--ForceUpdate : Force re-initalizeing setup.ini.
--help
--version
--find-setup-exe :experemental
И вот источник, на случай, если пастина не работает
источник
#!/bin/bash
# apt-cyg: install tool for cygwin similar to debian apt-get
#
# Copyright (C) 2005-9, Stephen Jungels
# Modified by GreenFox
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# (http://www.fsf.org/licensing/licenses/gpl.html)
# this script requires some packages
WGET=`which wget 2> /dev/null`
BZIP2=`which bzip2 2> /dev/null`
TAR=`which tar 2> /dev/null`
GAWK=`which awk 2> /dev/null`
if test "-$WGET-" = "--" || test "-$BZIP2-" = "--" || test "-$TAR-" = "--" \
|| test "-$GAWK-" = "--"
then
echo You must install wget, tar, gawk and bzip2 to use apt-cyg.
exit 1
fi
function usage()
{
echo apt-cyg: Installs and removes Cygwin packages.
echo " \"apt-cyg install <package names>\" to install packages"
echo " \"apt-cyg remove <package names>\" to remove packages"
echo " \"apt-cyg update\" to update setup.ini"
echo " \"apt-cyg show\" to show installed packages"
echo " \"apt-cyg find <patterns>\" to find packages matching patterns"
echo " \"apt-cyg describe <patterns>\" to describe packages matching patterns"
echo " \"apt-cyg packageof <commands or files>\" to locate parent packages"
echo "Options:"
echo " --mirror, -m <url> : set mirror"
echo " --cache, -c <dir> : set cache"
echo " --file, -f <file> : read package names from file"
echo " --noupdate, -u : don't update setup.ini from mirror"
echo " --localdiskcache : Use local cache as source, if available. Used for offline instalation."
echo " --force : Force re-installing package. USE WITH CAUTION AND CARE!"
echo " --ForceUpdate : Force re-initalizeing setup.ini. "
echo " --help"
echo " --version"
echo " --find-setup-exe :experemental"
}
function version()
{
echo "apt-cyg version 0.58 custombuild"
echo "Written by Stephen Jungels"
echo "Modified by GreenFox"
echo "Copyright (c) 2005-2012. Released under the GPL."
}
function findsetupexe()
{
echo "Attempting to load setup.exe, or loading from network..."
[ -e "${cache}/setup.exe" ] && echo "Try using [ ${cache}/setup.exe ]"
}
function findworkspace()
{
# default working directory and mirror
mirror="ftp://mirror.mcs.anl.gov/pub/cygwin"
mirror="ftp://ftp.iij.ad.jp/pub/cygwin"
cache="/cygdrive/c/archive/cygwin"
# Note: path should be in unix format.
# work wherever setup worked last, if possible
if test -e /etc/setup/last-cache
then
tmp="`head -1 /etc/setup/last-cache`"
cache="`cygpath -au "$tmp"`"
fi
if test -e /etc/setup/last-mirror
then
mirror="`head -1 /etc/setup/last-mirror`"
fi
if test "$localdiskcache" == "1"
then
echo Working directory is $cache
echo Mirror is $mirror
echo We are using the cache as package source.
cd "$cache"
else
# Old method that uses network. Left for compatibility purpose.
mirrordir="`echo "$mirror" | sed -e "s/:/%3a/g" -e "s:/:%2f:g"`"
echo Working directory is $cache
echo Mirror is $mirror
mkdir -p "$cache/$mirrordir"
cd "$cache/$mirrordir"
fi
}
function getsetup()
{
if test "$noscripts" == "0" -a "$noupdate" == "0" -a "$localdiskcache" == "0"
then
touch "setup.ini"
mv "setup.ini" "setup.ini-save"
wget -N "$mirror/setup.bz2"
if test -e "setup.bz2" && test $? -eq 0
then
bunzip2 "setup.bz2"
mv "setup" "setup.ini"
echo "Updated setup.ini"
else
wget -N "$mirror/setup.ini"
if test -e setup.ini && test $? -eq 0
then
echo "Updated setup.ini"
else
mv "setup.ini-save" "setup.ini"
echo "Error updating setup.ini, reverting"
fi
fi
fi
}
function checkpackages()
{
if test "-$packages-" = "--"
then
echo Nothing to do, exiting
exit 0
fi
}
function apt-cyg-func-install(){
for pkg in $packages
do
already="`grep -c "^$pkg " /etc/setup/installed.db`"
if test $already -ge 1 -a "$forceinstall" == "0"
then
echo "Package $pkg is already installed, skipping"
continue
fi
echo ""
echo Installing $pkg
# look for package and save desc file
mkdir -p "release/$pkg"
cat setup.ini | awk > "release/$pkg/desc" -v package="$pkg" \
'BEGIN{RS="\n\n@ "; FS="\n"} {if ($1 == package) {desc = $0; px++}} \
END{if (px == 1 && desc != "") print desc; else print "Package not found"}'
desc=`cat "release/$pkg/desc"`
if test "-$desc-" = "-Package not found-"
then
echo Package $pkg not found or ambiguous name, exiting
rm -r "release/$pkg"
exit 1
fi
echo Found package $pkg
# download and unpack the bz2 file
# pick the latest version, which comes first
install=`cat "release/$pkg/desc" | awk '/^install: / { print $2; exit }'`
if test "-$install-" = "--"
then
echo "Could not find \"install\" in package description: obsolete package?"
echo "Debug output of [$(realpath "release/$pkg/desc")]"
echo "-----------------------------------------------------"
cat "release/$pkg/desc"
echo "-----------------------------------------------------"
exit 1
fi
file=`basename $install`
if test "$localdiskcache" == "1"
then
############################################
# This section needs refactoring. TODO
############################################
echo "DBG:pwd=[`pwd`]pkg=[$pkg]file=[$file]mirror=[$mirror]install=[$install]"
cd "$cache"
cd "release/$pkg"
if ! test -e "$file"
then
# Scan dir for matching name
echo "Scanning cache for leftover..."
local leftover_file="`find "$cache" -name "$file" |head -n 1`";
if test "$leftover_file" == "" ; then
#
echo "Package $pkg missing from cache. Downloading file from mirror $mirror."
wget -nc $mirror/$install
# The mirror might not have the file.TODO.
else
echo "Trying to use [$leftover_file] as alternative to [$file]"
file="$leftover_file";
fi
fi
echo "DBG:169:pwd=[`pwd`]pkg=[$pkg]file=[$file]mirror=[$mirror]install=[$install]"
digest="`cat "desc" | awk '/^install: / { print $4; exit }'`";
digactual="`md5sum "$file" | awk '{print $1}'`";
echo "Checking md5hash [$digest] == [$digactual] "
if test "$digest" != "$digactual" ;
then
echo "Package $pkg in cache data is broken, partial, or empty. Downloading file from mirror."
wget -c $mirror/$install
fi
digactual=`md5sum $file | awk '{print $1}'`
############################################
else
cd "release/$pkg"
wget -nc $mirror/$install
digest=`cat "desc" | awk '/^install: / { print $4; exit }'`
digactual=`md5sum $file | awk '{print $1}'`
fi
if ! test $digest = $digactual
then
echo "MD5 sum did not match, exiting"
exit 1
fi
echo "Unpacking..."
#####
# Dumps to root dir. We need to add code for chroot creating options
####
cat "$file" | bunzip2 | tar > "/etc/setup/$pkg.lst" xvf - -C /
gzip -f "/etc/setup/$pkg.lst"
cd ../..
# update the package database
cat /etc/setup/installed.db | awk > /tmp/awk.$$ -v pkg="$pkg" -v bz=$file \
'{if (ins != 1 && pkg < $1) {print pkg " " bz " 0"; ins=1}; print $0} \
END{if (ins != 1) print pkg " " bz " 0"}'
mv /etc/setup/installed.db /etc/setup/installed.db-save
mv /tmp/awk.$$ /etc/setup/installed.db
# recursively install required packages
echo > /tmp/awk.$$ '/^requires: / {s=gensub("(requires: )?([^ ]+) ?", "\\2 ", "g", $0); print s}'
requires=`cat "release/$pkg/desc" | awk -f /tmp/awk.$$`
warn=0
if ! test "-$requires-" = "--"
then
echo Package $pkg requires the following packages, installing:
echo $requires
for package in $requires
do
already=`grep -c "^$package " /etc/setup/installed.db`
if test $already -ge 1
then
echo Package $package is already installed, skipping
continue
fi
apt-cyg --noscripts install $package
if ! test $? = 0 ; then warn=1; fi
done
fi
if ! test $warn = 0
then
echo "Warning: some required packages did not install, continuing"
fi
# run all postinstall scripts
pis=`ls "/etc/postinstall/*.sh" 2>/dev/null | wc -l`
if test $pis -gt 0 && ! test $noscripts -eq 1
then
echo Running postinstall scripts
for script in "/etc/postinstall/*.sh"
do
$script
mv $script $script.done
done
fi
echo Package $pkg installed
done
}
function main(){
# process options
local noscripts=0
local noupdate=0
local file=""
local dofile=0
local command=""
local filepackages=""
local packages=""
local localdiskcache=1
local forceinstall=0
# use vars = [ noscripts noupdate localdiskcache forceinstall file dofile command packages ]
while test $# -gt 0
do
case "$1" in
--mirror|-m)
echo "$2" > /etc/setup/last-mirror
shift ; shift
;;
--cache|-c)
cygpath -aw "$2" > /etc/setup/last-cache
shift ; shift
;;
--noscripts)
noscripts=1
shift
;;
--noupdate|-u)
noupdate=1
shift
;;
--ForceUpdate)
noupdate=0
localdiskcache=0
shift
;;
--localdiskcache)
localdiskcache=1
shift
;;
--force)
forceinstall=1
shift
;;
--help)
usage
exit 0
;;
--version)
version
exit 0
;;
--find-setup-exe)
findsetupexe
exit 0
;;
--file|-f)
if ! test "-$2-" = "--"
then
file="$2"
dofile=1
shift
else
echo 1>&2 No file name provided, ignoring $1
fi
shift
;;
update|show|find|describe|packageof|install|remove)
if test "-$command-" = "--"
then
command=$1
else
packages="$packages $1"
fi
shift
;;
*)
packages="$packages $1"
shift
;;
esac
done
######################################################
# Done reading the options. Now process accordingly
######################################################
if test $dofile = 1
then
if test -f "$file"
then
filepackages="$filepackages `cat "$file" | awk '{printf "%s ", $0}'`"
else
echo File $file not found, skipping
fi
packages="$packages $filepackages"
fi
case "$command" in
update)
findworkspace
getsetup
;;
show)
echo 1>&2 The following packages are installed:
cat /etc/setup/installed.db | awk '/[^ ]+ [^ ]+ 0/ {print $1}'
;;
find)
checkpackages
findworkspace
getsetup
for pkg in $packages
do
echo ""
echo Searching for installed packages matching $pkg:
awk '/[^ ]+ [^ ]+ 0/ {if ($1 ~ query) print $1}' query="$pkg" /etc/setup/installed.db
echo ""
echo Searching for installable packages matching $pkg:
cat setup.ini | awk -v query="$pkg" \
'BEGIN{RS="\n\n@ "; FS="\n"; ORS="\n"} {if ($1 ~ query) {print $1}}'
done
;;
describe)
checkpackages
findworkspace
getsetup
for pkg in $packages
do
echo ""
cat setup.ini | awk -v query="$pkg" \
'BEGIN{RS="\n\n@ "; FS="\n"; ORS="\n"} {if ($1 ~ query) {print $0 "\n"}}'
done
;;
packageof)
checkpackages
for pkg in $packages
do
key=`which "$pkg" 2>/dev/null | sed "s:^/::"`
if test "-$key-" = "--"
then
key="$pkg"
fi
for manifest in "/etc/setup/*.lst.gz"
do
found=`cat "$manifest" | gzip -d | grep -c "$key"`
if test $found -gt 0
then
package=`echo "$manifest" | sed -e "s:/etc/setup/::" -e "s/.lst.gz//"`
echo Found $key in the package $package
fi
done
done
;;
install)
checkpackages
findworkspace
getsetup
apt-cyg-func-install
;;
remove)
checkpackages
for pkg in $packages
do
already=`grep -c "^$pkg " /etc/setup/installed.db`
if test $already = 0
then
echo Package $pkg is not installed, skipping
continue
fi
dontremove="cygwin coreutils gawk bzip2 tar wget bash"
for req in $dontremove
do
if test "-$pkg-" = "-$req-"
then
echo apt-cyg cannot remove package $pkg, exiting
exit 1
fi
done
if ! test -e "/etc/setup/$pkg.lst.gz"
then
echo Package manifest missing, cannot remove $pkg. Exiting
exit 1
fi
echo Removing $pkg
# run preremove scripts
if test -e "/etc/preremove/$pkg.sh"
then
"/etc/preremove/$pkg.sh"
rm "/etc/preremove/$pkg.sh"
fi
cat "/etc/setup/$pkg.lst.gz" | gzip -d | awk '/[^\/]$/ {print "rm -f \"/" $0 "\""}' | sh
rm "/etc/setup/$pkg.lst.gz"
rm -f /etc/postinstall/$pkg.sh.done
cat /etc/setup/installed.db | awk > /tmp/awk.$$ -v pkg="$pkg" '{if (pkg != $1) print $0}'
mv /etc/setup/installed.db /etc/setup/installed.db-save
mv /tmp/awk.$$ /etc/setup/installed.db
echo Package $pkg removed
done
;;
*)
usage
;;
esac
}
main "$@"
Я обычно использую опцию "загрузить в локальный каталог" в стандартном установщике и выбираю нужные пакеты в базовой установке. Это загружает пакеты, которые я хочу, но не устанавливаю, и я могу скопировать этот каталог пакетов в сетевую папку или флэш-накопитель. Добавьте копию Cygwin setup.exe в этот локальный каталог, и вы получите автономный установщик.
Недостатком этого метода является то, что ваши автономные пакеты не обновляются. Но вы всегда можете перезапустить программу установки, чтобы загрузить и установить обновленные пакеты.
У меня были некоторые проблемы с apt-cyg setup.ini
Мне пришлось изменить метод getsetup в apt-cyg, чтобы все заработало.
function getsetup()
{
if test "$noscripts" == "0" -a "$noupdate" == "0"
then
touch setup.ini
mv setup.ini setup.ini-save
wget -N $mirror/setup.bz2
if test -e setup.bz2 && test $? -eq 0
then
bunzip2 setup.bz2
mv setup setup.ini
echo Updated setup.ini
else
if [ `arch` == "x86_64" ]
then
echo using x86_64
arch=x86_64
else
echo using x86
arch=x86
fi
wget -N $mirror/$arch/setup.ini
if test -e setup.ini && test $? -eq 0
then
echo Updated setup.ini
else
mv setup.ini-save setup.ini
echo Error updating setup.ini, reverting
fi
fi
fi
}
Попробуйте создать автономный установщик Cygwin с помощью pmycg.