If you are not connected to internet, then still you can install packages
from Debian Installer ISOs.
For example, if Debian 7.0 (Wheezy) ISOs are in directory /media/FreeAgent GoFlex Drive/Softwares/Debian_7.0_Wheezy
directory and we want to mount these iso in /mnt/Debian/ directory. The following command can be used:
PS: iso_dir is not required with -u command
The mount_debian.sh perl script is given as follows:
PS: The above script can be used with any Debian Package Management related distros like Ubuntu, Linux Mint, etc.
$ sudo $(which mount_debian.pl) -d /mnt/Debian -g -r "/media/FreeAgent GoFlex Drive/Softwares/Debian_7.0_Wheezy" Using iso(s) dir '/media/FreeAgent GoFlex Drive/Softwares/Debian_7.0_Wheezy' Using mount point dir '/mnt/Debian' ... Total 11 iso(s) mounted successfully.Unmounting of the iso(s) can be achieved by the following command:
$ sudo $(which mount_debian.pl) -d /mnt/Debian -u -g -r Running: umount "/mnt/Debian"/*.iso Running: rmdir "/mnt/Debian"/*.iso Running: cp "/etc/apt/sources.list.net" "/etc/apt/sources.list" Running: apt-get update ...Usage of the command:
$ sudo $(which mount_debian.pl) /home/mitesh/Perl/mount_debian.pl: Please provide Dir where Debian installer iso(s) are present. USAGE: /home/mitesh/Perl/mount_debian.pl [options] iso_dir -a apt_sources_dir default /etc/apt -d mount_base_dir default /mnt/Debian -g debug on -r apt-get update -u unmount iso_dir Dir where Debian installer iso(s) are present.
PS: iso_dir is not required with -u command
The mount_debian.sh perl script is given as follows:
#!/usr/bin/perl -w #=============================================================================== # # FILE: mount_debian.pl # # USAGE: ./mount_debian.pl # # DESCRIPTION: # # OPTIONS: --- # REQUIREMENTS: --- # BUGS: --- # NOTES: --- # AUTHOR: Mitesh Singh Jat (mitesh) # COMPANY: # VERSION: 1.0 # CREATED: 11/07/2013 10:30:04 PM IST # REVISION: --- #=============================================================================== use strict; use warnings; use Getopt::Std; my $apt_sources_dir = "/etc/apt"; my $mount_point_base = "/mnt/Debian"; my $umount = 0; my $reload = 0; my $debug = 0; sub usage() { print STDERR "USAGE: $0 [options] <iso_dir>\n"; print STDERR " -a <apt_sources_dir> apt sources dir: default $apt_sources_dir\n"; print STDERR " -d <mount_base_dir> mount point dir: default $mount_point_base\n"; print STDERR " -g debug on \n"; print STDERR " -r apt-get update \n"; print STDERR " -u unmount \n"; print STDERR " <iso_dir> Dir where Debian installer iso(s) are present.\n"; } sub run_cmd() { my $cmd = $_[0]; print "Running: $cmd\n" if $debug; system("$cmd"); my $retval = $?; if ($retval != 0) { print STDERR "Error in running: $cmd\nExit code = $retval\n"; } return ($retval); } sub run_cmd_get() { my $cmd = $_[0]; print "Running: $cmd\n" if $debug; my @outs = `$cmd`; my $retval = $?; if ($retval < 0) { print STDERR "Error in running: $cmd\nExit code = $retval\n"; exit($retval); } chomp(@outs); return (@outs); } sub take_backup() { my $file1 = $_[0]; my $file2 = $_[1]; my $cmd = "cp \"$file1\" \"$file2\""; my $retval = &run_cmd("$cmd"); if ($retval != 0) { print STDERR "$0: Cannot copy \"$file1\" to \"$file2\"\n"; exit(-1); } return 1; } sub reload_repo() { my $file1 = $_[0]; my $file2 = $_[1]; my $cmd = "cp \"$file1\" \"$file2\""; my $retval = &run_cmd($cmd); exit(-1) if ($retval != 0); $cmd = "apt-get update"; $retval = &run_cmd($cmd); exit(-1) if ($retval != 0); } my %opts; getopt('a:d:', \%opts); foreach my $opt (sort keys %opts) { if (!defined($opts{$opt})) { print STDERR "$0: Requires value for option '$opt'\n"; &usage(); exit(-1); } else { if ($opts{$opt} =~ m/^-/) { print STDERR "$0: Requires value for option '$opt'\n"; &usage(); exit(-1); } } } $apt_sources_dir = $opts{"a"} if (defined($opts{"a"})); $mount_point_base = $opts{"d"} if (defined($opts{"d"})); $debug = 1 if (defined($opts{"g"})); $reload = 1 if (defined($opts{"r"})); $umount = 1 if (defined($opts{"u"})); my $apt_dvd = "$apt_sources_dir/sources.list.dvd"; my $apt_net = "$apt_sources_dir/sources.list.net"; my $apt_orig = "$apt_sources_dir/sources.list"; my $retval = 0; my $cmd; $retval = `whoami`; chomp($retval); unless ($retval eq "root") { print STDERR "$0: Please run this script as 'root' user.\n"; &usage(); exit(-1); } unless ($umount) { if (@ARGV != 1) { print STDERR "$0: Please provide Dir where Debian installer iso(s) are present.\n"; &usage(); exit(-1); } my $iso_dir = "$ARGV[0]"; ## Check for iso dir presence unless (-d "$iso_dir") { print STDERR "$0: Please make sure the iso(s) dir '$iso_dir' is present\n"; exit(-1); } print "Using iso(s) dir '$iso_dir'\n" if ($debug); ## Check for destination dir unless (-d "$mount_point_base") { $cmd = "mkdir -p \"$mount_point_base\""; $retval = &run_cmd("$cmd"); if ($retval != 0) { print STDERR "$0: Cannot create dir '$mount_point_base'\n"; exit(-1); } } print "Using mount point dir '$mount_point_base'\n" if ($debug); ## Taking backup of ftp/http line sources.list my $is_backed_up = 0; if (-f "$apt_net") { ## Take backup only when ftp / http (internet) $cmd = "grep -v -e \"^#\" -e \"^\$\" \"$apt_orig\" | egrep -c \"(ftp|http)://\""; my @nets = &run_cmd_get($cmd); if ($nets[0] > 0) { $is_backed_up = &take_backup("$apt_orig", "$apt_net"); } } else { $is_backed_up = &take_backup("$apt_orig", "$apt_net"); } ## Get loop devices $cmd = "ls /dev/loop[0-9]*"; my @temps = &run_cmd_get($cmd); my %loop_devices; my $nloop_devices = @temps; foreach my $temp (@temps) { $loop_devices{$temp} = 1; } $cmd = "ls \"$iso_dir\" | grep -i \"\.iso\$\""; @temps = &run_cmd_get($cmd); my %iso_images; my $niso_images = @temps; foreach my $temp (@temps) { $iso_images{$temp} = 1; } $cmd = "df | awk '{print \$1}' | grep \"/dev/loop\""; @temps = &run_cmd_get($cmd); my %mounted_loop_devices; my $nmounted_loop_devices = @temps; foreach my $temp (@temps) { $mounted_loop_devices{$temp} = 1; } ## Check for free loop devices my $nfree_loops = $nloop_devices - $nmounted_loop_devices; if ($niso_images > $nfree_loops) { print "Less available loop devices $nfree_loops than isos $niso_images\n" if ($debug); my $req_loops = $niso_images - $nfree_loops; if ($nmounted_loop_devices == 0) { print "Reloading loop kernel module with extra $req_loops loop devices\n" if $debug; $cmd = "rmmod loop"; $retval = &run_cmd($cmd); print "$retval\n"; exit(-1) if ($retval != 0); $cmd = "modprobe loop max_loop=$niso_images"; $retval = &run_cmd($cmd); exit(-1) if ($retval != 0); } else { print STDERR "Please reload 'loop' kernel module. After unloading following loop devices...\n"; foreach my $temp (sort keys %mounted_loop_devices) { print STDERR "$temp\n"; } print STDERR "\nrmmod loop\n"; my $temp = $nmounted_loop_devices + $req_loops; print STDERR "\nmodprobe loop max_loop=$temp\n\n"; exit(-2); } } ## Create entries in sources.list file open(SFH, ">$apt_orig") or die("$0: Cannot write in file '$apt_orig'\n"); foreach my $iso (sort keys %iso_images) { print "Mounting iso $iso ...\n" if $debug; my $dest_dir = "$mount_point_base/$iso"; unless (-d "$dest_dir") { $cmd = "mkdir -p \"$dest_dir\""; $retval = &run_cmd($cmd); exit(-1) if ($retval != 0); } $cmd = "df \"$dest_dir\" | grep -c \"^/dev/loop.*\.iso\$\""; my @mounts = &run_cmd_get($cmd); if ($mounts[0] == 0) ## Mount only if not mounted { $cmd = "mount -o loop,ro \"$iso_dir/$iso\" \"$dest_dir\""; $retval = &run_cmd($cmd); exit(-1) if ($retval != 0); ## read distro version dir in dists/ $cmd = "ls -l \"$dest_dir/dists\" | grep \"^d\" | awk '{print \$(NF)}' | head -1"; my $version = `$cmd`; if (defined($version) and ($version ne "")) { $cmd = "ls -l \"$dest_dir/dists\"/*/ | grep \"^d\" | sort -u | awk '{print \$(NF)}' | awk '{sec=sec\" \"\$1} END{print sec}'"; my $sections = `$cmd`; if (defined($sections)) { chomp($sections); chomp($version); print SFH "deb file://$dest_dir $version $sections\n"; } } } } print SFH "\n## Automatically generated by $0 ##\n"; close(SFH); print "Total $niso_images iso(s) mounted successfully.\n" if $debug; ## Reload repository if sources.list is updated if ($is_backed_up and $reload) { &reload_repo("$apt_orig", "$apt_dvd"); } exit(0); } ####################################### ## umount code ## ####################################### $cmd = "umount \"$mount_point_base\"/*.iso"; $retval = &run_cmd($cmd); exit(-1) if ($retval != 0); $cmd = "rmdir \"$mount_point_base\"/*.iso"; $retval = &run_cmd($cmd); exit(-1) if ($retval != 0); if ($reload) { &reload_repo("$apt_net", "$apt_orig"); } exit(0);
PS: The above script can be used with any Debian Package Management related distros like Ubuntu, Linux Mint, etc.
No comments:
Post a Comment