Skip to content

Instantly share code, notes, and snippets.

@kanazux
Last active December 7, 2015 13:56
Show Gist options
  • Select an option

  • Save kanazux/b4a0bd997ef6514447de to your computer and use it in GitHub Desktop.

Select an option

Save kanazux/b4a0bd997ef6514447de to your computer and use it in GitHub Desktop.
install ubuntu server utm 100
#!/usr/bin/perl
#
# This script fixes problems when trying to make a bootable Ubuntu USB stick from an ISO image.
#
# How to use this script:
#
# 1. Make your bootable USB stick as per usual. I use "Linux Live USB creator".
#
# 2. Install perl
#
# * Perl is generally installed by default on Linux boxes. If not, use your
# package manager to install it.
#
# * For Windows 7, I use ActivePerl, which you can download from the web.
# ActivePerl may have versions for other versions of Windows as well.
#
# 3. Run this script
#
# For Windows 7 and ActivePerl:
# * Copy this file to the USB stick's root directory
# * Double click on the script's icon, and it will launch
#
# For Linux:
# * Copy this file to the USB stick's root directory
# * cd to the stick's root directory and run this script ("./fix_USB_boot_problems_v01.pl")
#
# -------------------------------------------------------------------------------------------
# How this script works
#
# I have never gotten Ubuntu on a USB stick to work. I know, I've read tons of comments
# on the internet that people generally get this working, so why does it always fail
# for me?
#
# The crux of the issue seems to be that when the USB stick is written from an ISO image, the
# filenames are written "as if" it were a CD-ROM. Now a CD-ROM has limitations as to the file
# names that can be accomodated. The traditional explanation is that it can only be 64 characters.
# On the other hand, many of the package names in Ubuntu LTS server (which is what I use)
# have more characters than that in the filename.
#
# So here is what I think might be happening. I believe that most ISO Linux images
# use 64-char (max) filenames when they are created, in the belief that they will be
# written to a CD-ROM. Perhaps when a *real* CD-ROM file system is given a file name that
# is too long, the CD-ROM driver truncates that long name to a 64-char name. In that
# event everything will work -- the filename was written to the CD-ROM with only 64 chars
# max, and the CD-ROM driver, when given an overly long file name to read, will automatically
# truncate the filename to 64 chars, and so finds the file under the name it was written.
# However I speculate that the USB driver does not do this truncation, since a USB stick
# (as far as I know) has no limitations on the file name length. So, the USB driver is
# handed a long file name, the driver does *not* truncate the file name, and the file
# (which was written with a truncated name in anticipation of being written to a CD-ROM)
# is not found. Errors result.
#
# This script fixes the problem (at least, for Ubuntu LTS server 12.04.2, which is what
# I tested it on). It renames the truncated files back to their original, un-truncated
# names. You might well ask, if the files are written onto the USB stick in the first
# place in truncated form, how can you possibly know what the original name of the file
# was? Some characters were lost when the filename was truncated. Well, we can get the
# original names of the files from the md5sum.txt file, which has a md5 checksum of every
# file on the USB key (I think). The algorithm is to go through each filename in the md5
# checksum file; if the file already exists under that name, then we are fine. If the file
# is missing, then we check to see if a file exists with the truncated version of the
# filename. If *that* file exists, then we rename the truncated file back to the original
# filename.
#
# Obviously this fails with very long file names that differ after 64 characters. For
# example, if you try to write these two filenames to a CD-ROM they will overwrite
# each other:
#
# package_with_very_long_filename_that_is_more_than_64_chars_long_version-0001.deb
# package_with_very_long_filename_that_is_more_than_64_chars_long_version-0002.deb
#
# In that case this script will fail, but there is nothing I can do about that. The
# USB key (and a CD-ROM version of it) would both be invalid in that case.
#
# David W. Pierce
# Division of Climate, Atmospheric Sciences, and Physical Oceanography
# Scripps Institution of Oceanography, La Jolla, CA
# [email protected]
#
#----------------------------------------------------------------------------------
# Version 1 released 27 February 2013
#
#----------------------------------------------------------------------------------
#
# This is free and unencumbered software released into the public domain.
#
# Anyone is free to copy, modify, publish, use, compile, sell, or
# distribute this software, either in source code form or as a compiled
# binary, for any purpose, commercial or non-commercial, and by any
# means.
#
# In jurisdictions that recognize copyright laws, the author or authors
# of this software dedicate any and all copyright interest in the
# software to the public domain. We make this dedication for the benefit
# of the public at large and to the detriment of our heirs and
# successors. We intend this dedication to be an overt act of
# relinquishment in perpetuity of all present and future rights to this
# software under copyright law.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# For more information, please refer to <http://unlicense.org/>
#
#======================================================================================
print "starting!\n";
$fname_in = "md5sum.txt";
#------------------
# Open the md5 file
#------------------
print "opening input md5 file $fname_in\n";
if( ! open(MD5FILE_IN, "<".$fname_in)) {
print "\n";
print "==============================================================================\n";
print "Error: I cannot find a file named $fname_in ; I cannot handle that case!\n";
print "Did you copy this script to the root directory of the USB stick?\n";
print "Are you running this script from the root directory of the USB stick?\n";
print "==============================================================================\n";
print "\nDone -- press the ENTER key to exit\n";
$z = <>;
exit 0;
}
#-------------------------------------------------------------------
# Process each line. Each line should have two entries, first one is
# the md5 sum and second is the filename.
#-------------------------------------------------------------------
print "Processing, this might take a minute...\n";
$n_proc = 0;
$n_fixed = 0;
$n_not_fixed = 0;
while( <MD5FILE_IN> ) {
$n_proc++;
@t = split " ";
$md5 = $t[0];
$fname = $t[1];
if( ! -e $fname ) {
print "----------------------------------------------------\n";
print "Found a problem, file does not exist: $fname\n";
$nc = length( $fname ); # number chars in the filename
#--------------------------------------------------------------
# Find location of last period so we can identify the extension.
# At same time get loc of last file name separator.
#--------------------------------------------------------------
$file_sep = "/";
$loc_last_period = -1;
$loc_last_fsep = -1;
for( $i=0; $i<$nc; $i++ ) {
if( substr($fname, $i, 1) eq "." ) {
$loc_last_period = $i;
}
if( substr($fname, $i, 1) eq $file_sep ) {
$loc_last_fsep = $i;
}
}
# ---------------------------------------------------------
# This is the file name stripped of all leading directories
# ---------------------------------------------------------
$fname_after_fsep = substr( $fname, $loc_last_fsep+1 );
# ----------------------------
# This is the file's extension
# ----------------------------
$ext = "";
$has_extension = ($loc_last_period != -1);
if( $has_extension ) {
$ext = substr( $fname, $loc_last_period+1 );
}
# -------------------------------------------------------------
# Basename is the file name stripped of all leading directories
# and any extension
# -------------------------------------------------------------
if( $loc_last_fsep == -1 ) {
$basename = $filename;
$path = "";
}
else
{
$basename = substr( $fname, $loc_last_fsep+1,
length($fname_after_fsep) - (length($ext)+1) );
$path = substr( $fname, 0, $loc_last_fsep );
}
$nc_after_fsep = length( $fname_after_fsep );
# ---------------------------------------------------------
# If this is a ".udeb" file, see if a simple ".ude" version
# is there instead.
# ---------------------------------------------------------
if( $ext eq "udeb" ) {
$fname_maybe = $path . $file_sep . $basename
. ".ude";
if( -e $fname_maybe ) {
print "...fixed with $fname_maybe\n";
system( "mv " . $fname_maybe . " " . $fname );
$n_fixed++;
}
else
{
# ------------------------------------------
# Not there with a simple .ude extension --
# maybe the entire filename is too long, and
# was truncated?
# ------------------------------------------
$basename_trunc = substr( $basename, 0, 61 );
$fname_maybe = $path . $file_sep
. $basename_trunc
. ".ude";
#print "trying: $fname_maybe\n";
if( -e $fname_maybe ) {
print "...fixed with $fname_maybe\n";
system( "mv " . $fname_maybe . " " . $fname );
$n_fixed++;
}
else
{
print "Warning! Did not find any fix for that file\n";
$n_not_fixed++;
}
}
}
elsif( $ext eq "deb" ) {
# --------------------------------------
# See if the deb file's name is too long
# --------------------------------------
$basename_trunc = substr( $basename, 0, 61 );
$fname_maybe = $path . $file_sep
. $basename_trunc
. ".deb";
if( -e $fname_maybe ) {
print "...fixed with $fname_maybe\n";
system( "mv " . $fname_maybe . " " . $fname );
$n_fixed++;
}
else
{
print "Warning! Did not find any fix for that file\n";
$n_not_fixed++;
}
}
else
{
$n_not_fixed++;
}
}
}
close( MD5FILE_IN );
print "\n\n";
print "Summary:\n";
print "\n";
print "Number of files processed: $n_proc\n";
print "Number of files fixed : $n_fixed\n";
print "Number of files NOT fixed: $n_not_fixed\n";
print "\nAll done -- you are ready to use your USB stick now.\nPress the ENTER key to exit\n";
$z = <>;

Edit the USBSTICK:/syslinux.cfg file like this:

serial 0 115200 0x303 default unetbootindefault prompt 0 menu title UNetbootin timeout 1

label unetbootindefault menu label Default kernel /ubnkern append initrd=/ubninit console=ttyS0,115200n8

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment