Разделение репозитория Ubuntu на DVD: различия между версиями
Перейти к навигации
Перейти к поиску
Gumanoed (обсуждение | вклад) (Новая: ===Распределяем содержимое репозитория=== Распределяем содержимое репозитория на 4 части объема debpa...) |
Avp (обсуждение | вклад) |
||
(не показаны 2 промежуточные версии 1 участника) | |||
Строка 1: | Строка 1: | ||
+ | ==Устанавливаем необходимый набор инструментов== | ||
+ | Для выполнения поставленной задачи нам понадобится интерпретатор языка ruby и пакет debpartial для деления репозитория. | ||
+ | aptitude install debpartial ruby | ||
− | + | ==Распределяем содержимое репозитория== | |
Распределяем содержимое репозитория на 4 части объема | Распределяем содержимое репозитория на 4 части объема | ||
debpartial --nosource --dirprefix=ubuntu --section=main,restricted,universe,multiverse --dist=feisty,feisty-updates,feisty-backports,feisty-security --size=DVD /home/ftp/feisty/ /home/ftp/iso/ | debpartial --nosource --dirprefix=ubuntu --section=main,restricted,universe,multiverse --dist=feisty,feisty-updates,feisty-backports,feisty-security --size=DVD /home/ftp/feisty/ /home/ftp/iso/ | ||
− | + | ==Копируем необходимые файлы== | |
+ | Исполняем программу на языке ruby, которая сформирует для нас необходимую структуру файлов и папок в 4 директориях. | ||
+ | |||
ruby debcopy /home/ftp/feisty/ /home/ftp/iso/ubuntu0 | ruby debcopy /home/ftp/feisty/ /home/ftp/iso/ubuntu0 | ||
ruby debcopy /home/ftp/feisty/ /home/ftp/iso/ubuntu1 | ruby debcopy /home/ftp/feisty/ /home/ftp/iso/ubuntu1 | ||
Строка 12: | Строка 17: | ||
ruby debcopy /home/ftp/feisty/ /home/ftp/iso/ubuntu3 | ruby debcopy /home/ftp/feisty/ /home/ftp/iso/ubuntu3 | ||
− | ===Создаем образы дисков== | + | ===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 | ||
+ | |||
+ | |||
+ | ==Создаем образы дисков== | ||
+ | Создаем из директорий со сформированной структурой файлов и папок образы для записи на диски. | ||
+ | |||
mkisofs --iso-level 4 -f -J -l -r -V "Ubuntu 7.04 $(date -I) 1/4" -o ./Ubuntu\ DVD\ repository/ubuntu-7.04-$(date -I)-complete-i386-dvd1.iso ./ubuntu0 | mkisofs --iso-level 4 -f -J -l -r -V "Ubuntu 7.04 $(date -I) 1/4" -o ./Ubuntu\ DVD\ repository/ubuntu-7.04-$(date -I)-complete-i386-dvd1.iso ./ubuntu0 | ||
mkisofs --iso-level 4 -f -J -l -r -V "Ubuntu 7.04 $(date -I) 2/4" -o ./Ubuntu\ DVD\ repository/ubuntu-7.04-$(date -I)-complete-i386-dvd2.iso ./ubuntu1 | mkisofs --iso-level 4 -f -J -l -r -V "Ubuntu 7.04 $(date -I) 2/4" -o ./Ubuntu\ DVD\ repository/ubuntu-7.04-$(date -I)-complete-i386-dvd2.iso ./ubuntu1 | ||
mkisofs --iso-level 4 -f -J -l -r -V "Ubuntu 7.04 $(date -I) 3/4" -o ./Ubuntu\ DVD\ repository/ubuntu-7.04-$(date -I)-complete-i386-dvd3.iso ./ubuntu2 | mkisofs --iso-level 4 -f -J -l -r -V "Ubuntu 7.04 $(date -I) 3/4" -o ./Ubuntu\ DVD\ repository/ubuntu-7.04-$(date -I)-complete-i386-dvd3.iso ./ubuntu2 | ||
mkisofs --iso-level 4 -f -J -l -r -V "Ubuntu 7.04 $(date -I) 4/4" -o ./Ubuntu\ DVD\ repository/ubuntu-7.04-$(date -I)-complete-i386-dvd4.iso ./ubuntu3 | mkisofs --iso-level 4 -f -J -l -r -V "Ubuntu 7.04 $(date -I) 4/4" -o ./Ubuntu\ DVD\ repository/ubuntu-7.04-$(date -I)-complete-i386-dvd4.iso ./ubuntu3 | ||
+ | |||
+ | [[Категория:Ubuntu]] |
Текущая версия на 09:42, 28 июля 2021
Содержание
Устанавливаем необходимый набор инструментов
Для выполнения поставленной задачи нам понадобится интерпретатор языка ruby и пакет debpartial для деления репозитория.
aptitude install debpartial ruby
Распределяем содержимое репозитория
Распределяем содержимое репозитория на 4 части объема
debpartial --nosource --dirprefix=ubuntu --section=main,restricted,universe,multiverse --dist=feisty,feisty-updates,feisty-backports,feisty-security --size=DVD /home/ftp/feisty/ /home/ftp/iso/
Копируем необходимые файлы
Исполняем программу на языке ruby, которая сформирует для нас необходимую структуру файлов и папок в 4 директориях.
ruby debcopy /home/ftp/feisty/ /home/ftp/iso/ubuntu0 ruby debcopy /home/ftp/feisty/ /home/ftp/iso/ubuntu1 ruby debcopy /home/ftp/feisty/ /home/ftp/iso/ubuntu2 ruby debcopy /home/ftp/feisty/ /home/ftp/iso/ubuntu3
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
Создаем образы дисков
Создаем из директорий со сформированной структурой файлов и папок образы для записи на диски.
mkisofs --iso-level 4 -f -J -l -r -V "Ubuntu 7.04 $(date -I) 1/4" -o ./Ubuntu\ DVD\ repository/ubuntu-7.04-$(date -I)-complete-i386-dvd1.iso ./ubuntu0 mkisofs --iso-level 4 -f -J -l -r -V "Ubuntu 7.04 $(date -I) 2/4" -o ./Ubuntu\ DVD\ repository/ubuntu-7.04-$(date -I)-complete-i386-dvd2.iso ./ubuntu1 mkisofs --iso-level 4 -f -J -l -r -V "Ubuntu 7.04 $(date -I) 3/4" -o ./Ubuntu\ DVD\ repository/ubuntu-7.04-$(date -I)-complete-i386-dvd3.iso ./ubuntu2 mkisofs --iso-level 4 -f -J -l -r -V "Ubuntu 7.04 $(date -I) 4/4" -o ./Ubuntu\ DVD\ repository/ubuntu-7.04-$(date -I)-complete-i386-dvd4.iso ./ubuntu3