建立DVD图像的Ubuntu存储库

构建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 /是使用debmirrorubuntu-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

现在每个目录(ubuntu0ubuntu1ubuntu2 )都适合一个DVD。


5制作iso图像

为了让目录ubuntu0ubuntu1ubuntu2进入一个可以刻录的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 
       
      
     
    
   
  
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏