Windows 7 : universal image with Postdownload script : issues
-
Hi,
I had read some tutos and understood many things but its not working correctly …
Informations about my stuff :
Server :
FOG Version : Running Version 1.3.5-RC-8 ; SVN Revision: 6066
OS : Debian GNU/Linux 8Specifications : all images are on a Synology NAS storage : mounted with NAS_ip:/images
The AIM : create universal image. After a deploy, want to FOS will able to install drivers for the good model. Her, just a test with an Optiplex 7010.
Other informations : upload and dowload tasks work like a charm. This topic is only for a downloadpostscript problem.
On NAS, there is :
/images : many images of differents devices
/images/dev/postinitscripts/fog.postint withCode : /dev/postinitscripts/fog.postint
#!/bin/bash ## This file serves as a starting point to call your custom pre-imaging/post init loading scripts. ## <SCRIPTNAME> should be changed to the script you're planning to use. ## Syntax of post init scripts are #. ${postinitpath}<SCRIPTNAME>
/images/postdownloadscripts with 2 files : fog.postdownload and fog.drivers :
Code : fog.postdownload :
#!/bin/bash ## blabla if [ $osid == "5" -o $osid == "6" -o $osid == "7" ]; then #only handling Win7/8/8.1 clearScreen; mkdir /ntfs &>/dev/null ntfs-3g -o force,rw $part /ntfs #mount image dots "Mounting Device"; if [ "$?" = "0" ]; then echo "Done"; . ${postdownpath}fog.drivers # run fog.drivers script umount /ntfs; # unmount when all is done :-) else echo "Failed To Mount Device"; sleep 30; fi fi
Code : fog.drivers :
#!/bin/sh ceol=`tput el`; machine=`dmidecode -s system-product-name`; # Gets machine model machine="${machine%"${machine##*[![:space:]]}"}" #Removes Trailing Space system64="/ntfs/Windows/SysWOW64/regedit.exe"; # dirty way to determine if it's 64bit or not if [ -f "$system64" ]; then setarch="x64" else setarch="x86" fi ############################################# if [ $osid == "5" ]; then osn="Win7" elif [ $osid == "6" ]; then osn="Win8" elif [ $osid == "7" ]; then osn="Win8.1" fi ############################################# dots "Preparing Drivers"; mkdir /ntfs/Windows/DRV &>/dev/null; echo -n "In Progress"; cabextract -d /ntfs/Windows/DRV "/images/Drivers/$osn/${machine}"/*.CAB &>/dev/null; regfile="/ntfs/Windows/System32/config/SOFTWARE" key="\Microsoft\Windows\CurrentVersion\DevicePath" devpath="%SystemRoot%\inf;%SystemRoot%\DRV"; reged -e "$regfile" &>/dev/null <<EOFREG ed $key $devpath q y EOFREG echo -e "\b\b\b\b\b\b\b\b\b\b\b${ceol}Done"; # this just removes "In Progress and replaces it with done :-)" folder with the Dell .CAB file : /images/Drivers/Win7/OptiPlex 7010/7010-win7-A09-NWJXJ.CAB (i checked the folder name with the FOG interface, Inventory section of the host)
i created a win7 image with VirutalBox with :
- small install of win7
- folder C:\Windows\DRV
- not in domain
I saved this image with FOG on the NAS.
When i tries to deploy it on my OptiPlex 7010, they are some issues : (debug task mode)- ntfs-3g : No mountpoint is specified : where the value $part is defined ?
- Préparing Drivers …… Done
- umount : can’t umount /ntfs : invalid argument
- Mounting Directory ……… Done
- /usr/share/fig/lib/funcs.sh : line 895 → 905 : write error : No Space Left On Device
- Mounting Directory ……… Done
- Changing hostname ………………………………… < Freeze
After a “CTRL+C” break :
- ls /ntfs/Windows/DRV : 0 files
If i run manually ./images/postdownloadscript/fog.drivers :-
- fog.drivers : line 23 : dots : command not found
- hard disk computer seem to write some datas …. « Done »
- ls /ntfs/Windows/DRV : 7010 with
–> win7/x64
–> audio
–> chipset
–> ect
After a reboot by ctrl+alt+suppr : i can run Windows 7 but there are 0 files into C:\Windows\DRV
What’s wrong with my setup ?
-
@Jonathan-Cool said in Windows 7 : universalle image with Postdownload script : issues:
ntfs-3g : No mountpoint is specified : where the value $part is defined ?
This is defined by you, or not. Depends on your needs. You should really be pulling the information based on the data you need.
For example, if you need to check all partitions you might do something like:
#!/bin/bash . /usr/share/fog/lib/funcs.sh parts="" getPartitions "$hd" for part in $parts; do # This is where $part will be defined ..... # do stuff ..... done
Préparing Drivers …… Done
umount : can’t umount /ntfs : invalid argumentThis probably means you have a umount in a line of your script (to unmount the /ntfs element if something is attached. This is most likely safe to not worry about except…
Mounting Directory ……… Done
Is something actually being mounted here? I ask this because below:
/usr/share/fig/lib/funcs.sh : line 895 → 905 : write error : No Space Left On Device
This will typically happen because you’re copying drivers on the volume, but the volume is not mounted. Essentially, you’re trying to copy your drivers into the init’s of which there simply is not enough space to do such a thing. (This sits in ram and only has about 256MB of “free space”.
Mounting Directory ……… Done
Changing hostname ………………………………… < FreezeProbably frozen because you can’t mount the actual volume. You’ve used up all the space available trying to copy your drivers to the init and therefor there is no room on the init to actually perform any edits.
-
Hi,
Alright, i understood why it didn’t work.I tried another fog.postdownload :
fog.postdownload :#!/bin/bash . /usr/share/fog/lib/funcs.sh <-- i forgot to add this line in my first attempt ... but i think, it's essential !! case $osid in [5-7]|9) clearScreen getHardDisk getPartitions $hd if [[ ! -d /ntfs ]]; then mkdir -p /ntfs >/dev/null 2>&1 [[ ! $? -eq 0 ]] && echo " * Failed to Mount Device" fi for part in $parts; do umount /ntfs >/dev/null 2>&1 ntfs-3g -o remove_hiberfile,rw $part /ntfs >/dev/null 2>&1 [[ ! $? -eq 0 ]] && continue done . ${postdownpath}fog.drivers umount /fog /ntfs /images >/dev/null 2>&1 ;; esac
And it’s seem to work !
No error during the drivers copy process on the OptiPlex 7010.
After the reboot, i need to insert admin id …
Next, Windows install the drivers and i can show the files into C:\Windows\DRV\Now, i need to search a solution to reboot the computer AFTER the drivers installation …
I know the trick to open the administrator session once time (AutoAdminLogoon in registry) …Next steps :
- autologin in administrator once to open a session for drivers installation
- find a way to reboot computer after drivers installation
- try with others models.
Just a question : can i create my own CAB ? Especially for HP … ?
-
@Tom-Elliott Many thanks for your detailed answer Tom !
-
@Jonathan-Cool said in Windows 7 : universal image with Postdownload script : issues:
After the reboot, i need to insert admin id …
Next, Windows install the drivers and i can show the files into C:\Windows\DRV
Now, i need to search a solution to reboot the computer AFTER the drivers installation …
I know the trick to open the administrator session once time (AutoAdminLogoon in registry) …
Next steps :autologin in administrator once to open a session for drivers installation
Just for clarity, if you have the drivers on the target computer AND you either update the registry (Win7) or the unattend.xml (Win7/Win10) the drivers are installed during OOBE process. There is no need to login for drivers to be installed.
find a way to reboot computer after drivers installation
If you want to reboot the computer after OOBE, you can do it in the SetupComplete.cmd batch file (which is executed just before the login prompt is displayed). Or you can setup the first login section of the unattend.xml file and call the shutdown.exe command from one of the first run steps. Two ways to accomplish what needs to be done depending on requirements.
try with others models.
Just a question : can i create my own CAB ? Especially for HP … ?
There is no need to create your own CAB. The requirement for this “work flow” is that the drivers you use must be in the extracted INF format. You can not deploy driver images this way if the drivers are contained in a self installer .exe file. You MUST use the .INF drivers. If you have this, then you can build your own driver directories and move that to the fog server.
Moving hardware other than Dell, you may need to change where the script looks for the model number. Once you know the new location then you can adjust the script to match. You will also need to adjust the directory structure based on how the manufacturer calls its models.
-
@george1421
Thanks you for your answer.
I need to learn more about the SetupComplete.cmd to populate it correctly.
I know what is OOBE and why it exist but i don’t kown how to use it correctly.
I will do some tests with it and with my VM.But, i have no time to do it … i hope i could do new tests soon …
-
Hello,
After some research and an very interessting discuss with George, i’m back to understand why the drivers injections works with my Optiplex 7010 and not with my HP 8000 EliteBook.
The facts :
I use another fog.postdownload (https://forums.fogproject.org/topic/8889/fog-post-install-script-for-win-driver-injection/7) to find the good partition for the mount /ntfs :#!/bin/bash . /usr/share/fog/lib/funcs.sh [[ -z $postdownpath ]] && postdownpath="/images/postdownloadscripts/" case $osid in 5|6|7|9) clear [[ ! -d /ntfs ]] && mkdir -p /ntfs getHardDisk if [[ -z $hd ]]; then handleError "Could not find hdd to use" fi getPartitions $hd for part in $parts; do umount /ntfs >/dev/null 2>&1 fsTypeSetting "$part" case $fstype in ntfs) dots "Testing partition $part" ntfs-3g -o force,rw $part /ntfs ntfsstatus="$?" if [[ ! $ntfsstatus -eq 0 ]]; then echo "Skipped" continue fi if [[ ! -d /ntfs/windows && ! -d /ntfs/Windows && ! -d /ntfs/WINDOWS ]]; then echo "Not found" umount /ntf >/dev/null 2>&1 continue fi echo "Success" break ;; *) echo " * Partition $part not NTFS filesystem" ;; esac done if [[ ! $ntfsstatus -eq 0 ]]; then echo "Failed" debugPause handleError "Failed to mount $part ($0)\n Args: $*" fi echo "Done" debugPause #. ${postdownpath}fog.log . ${postdownpath}fog.drivers # . ${postdownpath}fog.ad umount /ntfs ;; *) echo "Non-Windows Deployment" debugPause return ;; esac
On the HP 8000 EliteBook, i ran a debug task with an Windows 7 x64 image.
I hit “CTRL+C” just after the “Preparing Drivers” process :- cd /ntfs : i see boot files (BOOTSEC.BAK, Boot, System Volume Information, bootmgr), not the Windows partition files
- lsblk : the wrong partition is mounted (/dev/sda1 instead of /dev/sda2)
- i type “reboot”. i go back into Windows 7. I can’t seen anyfiles into C:\Windows\DRV. None driver installed (i think of Win7 tried install drivers with generic drivers).
Same operation with Optiplex 7010 :
I hit “CTRL+C” just after the “Preparing Drivers” process :- cd /ntfs : i see boot files, not the Windows partition files
- lsblk : the wrong partition is mounted (/dev/sda1 instead of /dev/sda2)
- i type “reboot”. Go back into Windows 7. I CAN seen drivers files into C:\Windows\DRV.
One question : why, with the same script, it’s work for the Optiplex7010 and not for the HP 8000 ?
I don’t undersand why i saw the wrong partition with “lsblk” in command prompt of Optiplex 7010 but, it finally works … -
@Jonathan-Cool This is difficult to say, but the lsblk command only shows you the block devices (disks and their partitions) available on the computer. Its not a good prediction of where the windows partition is.
I think I would start debugging this on the HP computer. Since you are testing the bash script I would run a your deployment in debug mode. When you get to the point where it should be copying the drivers exit out of the deployment script. Then execute the script you posted command by command.
The script will mount each partition one by one. It checks to ensure its a ntfs type partition if it is, then it mounts it and checks to see if there is a Windows directory on that partition. If there is the script assumes that it found the right partition.
From our discussion yesterday the script seems to be picking partition 1 which is the boot partition. Is it possible that HP has done something “special” with that boot partition and placed a windows directory on it? IF so that may trick your postdownload script into saying that partition 1 is the windows partition.
-
@Jonathan-Cool said in Windows 7 : universal image with Postdownload script : issues:
I think for debugging this what I would do is update your fog.postdownload script insert the echo and debugPause (scripted breakpoint). Then save the postdownload script. Schedule a debug deployment and when the script gets to that point use ctrl-C to break out of the fog deployment script.
Then key in
. /usr/share/fog/lib/funcs.sh
into the command line to setup your environment variables and then execute the script line by line (copy and paste commands into the linux console) trying to understand why the script is picking sda1 over the right answer of sda2.#!/bin/bash . /usr/share/fog/lib/funcs.sh [[ -z $postdownpath ]] && postdownpath="/images/postdownloadscripts/" case $osid in 5|6|7|9) clear [[ ! -d /ntfs ]] && mkdir -p /ntfs echo "Scripted breakpoint" debugPause getHardDisk if [[ -z $hd ]]; then handleError "Could not find hdd to use" fi getPartitions $hd
-
@george1421 I’m pretty sure from when we use to have HP’s that the first partition was a system recovery partition which when browsing contained snapshot of OS files so would confirm your theory!.. Slightly off topic but line 27 in fog.postdownload got a typo, ntf should be ntfs
-
@Lee-Rowlett said in Windows 7 : universal image with Postdownload script : issues:
that the first partition was a system recovery partition
Then maybe its safe to assume that there IS a /Windows directory on that recover partition?? If so that would explain why the detection code is failing (Ugh!)
-
@george1421 I think the typo didn’t allow the NTFS directory to me unmounted leaving the last mounted partition in place when it tried to do any action.
-
Well, I think why that script won’t work 100% is because the script has a tiny bug in it.
if [[ ! -d /ntfs/windows && ! -d /ntfs/Windows && ! -d /ntfs/WINDOWS ]]; then echo "Not found" umount /ntf >/dev/null 2>&1 continue fi
Should be
if [[ ! -d /ntfs/windows && ! -d /ntfs/Windows && ! -d /ntfs/WINDOWS ]]; then echo "Not found" umount /ntfs >/dev/null 2>&1 continue fi
The problem being that when the script loops through the mounting of parts, but can’t find the Windows folder, it fails to unmount the ntfs folder, which will not allow the system to then mount anything else to it, and thusly it fails.
Not sure why it would work for your optiplex, but fix that and try again, imo.
edit: Did not see Tom’s post, I essentially posted the same thing.
-
@george1421 I think we need to identify if the HP recovery partition contains a /Windows directory. If so, then the script’s logic test is wrong. We may have to find another check to identify the true drive from a recovery partition.
Right now the script may be fundamentally flawed,
-
Hello,
Thank you all for your answer : quick reply :-
there is any recovery partition because, when i create a master image, i always delete all partitions. The first partition is the boot partiyon of Windows 7 (called “Partition System Reserved”).
-
i will try after edit the typo. Thank you, i missed it.
I will come back with the resultats.
-
-
Hi,
I’m back with the results … and they are the same …
Maybe with the output of SSH, that can help you …[http://txt.do/drvaa](link url)
Also, i have an other idea : just for the HP8000, i could hard-coded the good partition directly into the fog.postdownload script ?
Like that : “if $model = HP Compaq 8000 Elite USDT PC” (i don’t know if this var really exist, it’s just an example)
do
umount /ntfs
mount /dev/sda2 /ntfsor somethink like that …
-
@Jonathan-Cool
I wrong, it’s seem to work …
I just do few tests to confirm this (test with Opti7010 and HP8000) and i will go back … -
@Jonathan-Cool I’m going crazy … after reboot the computer and retry a debug task, it’s didn’t work at this point …
-
It’s working now !
I did a mistake …
This is what I did to find my mistake- create a debug Task
- at the prompt, add root password
- with SSH, run the fog command
- CTRL+C after “Preparing Drivers”
- run “. /usr/share/fog/lib/funcs.sh”
- cd /images/postdownloadscripts
- sh -x fog.postdownload
- copy / paste the output in a txt file to debug
- analyze the code
- find a mistake with rsync
I copied the ini folder into “/images/Drivers/Win7/HP Compaq 8000 Elite USDT PC/” BUT the good path is “/images/Drivers/Win7/HP Compaq 8000 Elite USDT PC/x64”.
I tried after move the files in the good folder … and it’s works !
Now, i have a little other strange problem with domain on the HP 8000.
i can’t join the domain and fog.log said :02/05/2017 13:39 Middleware::Authentication ERROR: Could not get security token 02/05/2017 13:39 Middleware::Authentication ERROR: Could not find file 'C:\Program Files (x86)\FOG\token.dat'
If I go into the folder, i can’t see the token.dat file.
With the same image and with the Optiplex7010, domain jonction works perfectly … strange !
-
@Jonathan-Cool The token.dat message is a “normal” thing and likely not the problem you’re seeing with domain not joining.