构建Ubuntu存储库的DVD映像
1初步说明
本教程的灵感来自于我在http://cargol.net/~ramon/ubuntu-dvd-en上阅读的文章。 非常感谢Ramon Acedo(原来是这个HowTo的人)
现在几个星期以后页面都无法访问。 我保存了页面,以便离线阅读。 所以...
我发现它很有用 我希望对你来说是一样的。
2介绍
这个howto提供了创建Debian或Ubuntu http / ftp存储库的DVD映像的简单方法。
Ubuntu不提供可以使用其主
, 宇宙
, 多元
和/或受限
存储库下载的DVD。 随着你的内容,你可以自己做。
在DVD上安装Ubuntu或Debian存储库对于那些无法访问互联网的用户来说,这些用户可以使用Ubuntu或Ubuntu安装Ubuntu,但可以访问其他地方下载存储库并构建和刻录DVD。
3建立本地镜
我们必须安装debmirror
:
sudo apt-get install debmirror
现在我们将Ubuntu存储库放在本地目录中。 在下面的例子中,我们在i386体系结构中获取了存储库的主要,Universe和multiverse部分。
debmirror --nosource -m --passive --host=archive.ubuntulinux.org --root=ubuntu/ --method=ftp --progress --dist=dapper --section=main,multiverse,universe --arch=i386 ubuntu/ --ignore-release-gpg
您可以根据需要更改以下选项:
- --host - 存储库的URL。
- - dist - 你的操作系统的发行版(dapper,前卫,sarge,...)。
- - 部分 - 您要在本地镜像的部分。
- - 你的盒子的架构。
4将归档分成DVD大小的目录
我们得到的存储库太大(约30Gb)将它们刻录到DVD,所以我们必须将它们分成卷。
该工具debartartial
将为我们做。
sudo apt-get install debpartial
我们创建卷所在的目录。
mkdir ubuntu-dvd
我们使它为每个卷构造包描述符。
debpartial --nosource --dirprefix=ubuntu --section=main,universe,multiverse --dist=dapper --size=DVD ubuntu/ ubuntu-dvd/
现在我们必须将包放入刚刚创建的debpartial目录中。 该副本
包含的脚本副本
也会这样做。 脚本需要红Gem
。
sudo apt-get install ruby
如果一切正常...
ruby debcopy ubuntu/ ubuntu-dvd/ubuntu0
ruby debcopy ubuntu/ ubuntu-dvd/ubuntu1
ruby debcopy ubuntu/ ubuntu-dvd/ubuntu2
其中ubuntu /
是使用debmirror
和ubuntu-dvd / *
创建的完整存储库的目录是准备好托管新的DVD可用存储库的目录。
如果我们想从完整的存储库进行软链接,而不是复制软件包,我们可以使用选项-l
来调用debcopy
:
ruby debcopy -l ubuntu/ ubuntu-dvd/ubuntu0
ruby debcopy -l ubuntu/ ubuntu-dvd/ubuntu1
ruby debcopy -l ubuntu/ ubuntu-dvd/ubuntu2
现在每个目录(ubuntu0
, ubuntu1
和ubuntu2
)都适合一个DVD。
5制作iso图像
为了让目录ubuntu0
, ubuntu1
, ubuntu2
进入一个可以刻录的iso映像,我们可以使用mkisofs
:
mkisofs -f -J -r -o ubuntu-dvd-0.iso ubuntu-dvd/ubuntu0
mkisofs -f -J -r -o ubuntu-dvd-1.iso ubuntu-dvd/ubuntu1
mkisofs -f -J -r -o ubuntu-dvd-2.iso ubuntu-dvd/ubuntu2
现在可以刻录iso图像或装载它们。 使用以下命令将它们添加到/etc/apt/source.list
中:
sudo apt-cdrom add
现在我们可以验证新的存储库...
sudo apt-get update
sudo apt-get upgrade
...如果我以正确的方式解释,你应该让你的盒子升级。
6关于脚本'debcopy'
我听说过上面没有找到脚本解拷贝的人。
在这种情况下,请创建一个名为debcopy
的新文件:
gedit /your_path_to/debcopy
并复制下面的行:
#!/usr/bin/ruby # # debcopy - Debian Packages/Sources partial copy tool # # Usage: debcopy [-l] # # where is a top directory of a debian archive, # and is a top directory of a new debian partial archive. # # debcopy searches all Packages.gz and Sources.gz under /dists # and copies all files listed in the Packages.gz and Sources.gz # files into from . -l creates symbolic links # instead of copying files. # # Copyright (C) 2002 Masato Taruishi # # 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. # # You should have received a copy of the GNU General Public License with # the Debian GNU/Linux distribution in file /usr/share/common-licenses/GPL; # if not, write to the Free Software Foundation, Inc., 59 Temple Place, # Suite 330, Boston, MA 02111-1307 USA # require 'getoptlong' require 'zlib' require 'ftools' $link = false def usage $stderr.puts "Usage: #{__FILE__} [-l] " exit 1 end def each (file, &block) fin = Zlib::GzipReader.open(file) fin.each do |line| yield line end fin.close end def each_file (file, &block) each(file) do |line| if /Filename: (.*)/ =~ line yield $1 end end end def each_sourcefile (file, &block) dir = nil each(file) do |line| case line when /^Directory: (.*)$/ dir = $1 when /^ \S+ \d+ (\S+)$/ yield dir + "/" + $1 end end end def calc_relpath (source, dest) pwd = Dir::pwd Dir::chdir source source = Dir::pwd Dir::chdir pwd Dir::chdir dest dest = Dir::pwd Dir::chdir pwd src_ary = source.split("/") src_ary.shift dest_ary = dest.split("/") dest_ary.shift return dest if src_ary[0] != dest_ary[0] src_ary.clone.each_index do |i| break if src_ary[0] != dest_ary[0] src_ary.shift dest_ary.shift end src_ary.size.times do |i| dest_ary.unshift("..") end dest_ary.join("/") end def do_copy(path) if $link pwd=calc_relpath(File.dirname($dest_dir + "/" + path), $source_dir) File.symlink(pwd + "/" + path, $dest_dir + "/" + path) else File.copy($source_dir + "/" + path, $dest_dir + "/" + path) end end def copy(path) s=$source_dir + "/" + path d=$dest_dir + "/" + path if FileTest.exist?(d) $stats["ignore"] += 1 return end if FileTest.exist?(s) File.mkpath(File.dirname(d)) do_copy(path) $stats["copy"] += 1 else $stats["notfound"] += 1 $stderr.puts s + " not found." end end opts = GetoptLong.new(["--symlink", "-l", GetoptLong::NO_ARGUMENT], ["--help", "-h", GetoptLong::NO_ARGUMENT]) opts.each do |opt,arg| case opt when "--symlink" $link = true when "--help" usage end end usage if ARGV.size != 2 $source_dir = ARGV.shift $dest_dir = ARGV.shift if $link $source_dir = Dir::pwd + "/" + $source_dir unless $source_dir =~ /\A\// $dest_dir = Dir::pwd + "/" + $dest_dir unless $dest_dir =~ /\A\// end $stats = {} $stats["ignore"] = 0 $stats["copy"] = 0 $stats["notfound"] = 0 open("|find #{$dest_dir}/dists -name Packages.gz") do |o| o.each_line do |file| file.chomp! print "Processing #{file}... " $stdout.flush each_file(file) do |path| copy(path) end puts "done" end end open("|find #{$dest_dir}/dists -name Sources.gz") do |o| o.each_line do |file| file.chomp! print "Processing #{file}... " $stdout.flush each_sourcefile(file.chomp) do |path| copy(path) end puts "done" end end puts "Number of Copied Files: " + $stats["copy"].to_s puts "Number of Ignored Files: " + $stats["ignore"].to_s puts "Number of Non-existence File: " + $stats["notfound"].to_s