mirror of
https://github.com/ntdevlabs/tiny11builder.git
synced 2025-12-18 17:34:13 +00:00
Fix ISO mount drive letter detection
- Exclude system drive from search (prevents selecting C: drive) - Add verification that drive contains Windows files before selecting - Add automatic drive letter assignment if partition has no letter - Improve logging to show all partitions and drives - Add StorageType ISO parameter to mount command - Improve error handling and recovery
This commit is contained in:
parent
08f4f50bcc
commit
9b93d58fcd
1 changed files with 107 additions and 14 deletions
121
.github/workflows/build-tiny11.yml
vendored
121
.github/workflows/build-tiny11.yml
vendored
|
|
@ -65,10 +65,11 @@ jobs:
|
||||||
|
|
||||||
Write-Host "ISO file size: $((Get-Item $isoPath).Length / 1GB) GB"
|
Write-Host "ISO file size: $((Get-Item $isoPath).Length / 1GB) GB"
|
||||||
|
|
||||||
# Mount ISO
|
# Mount ISO with StorageType option to ensure proper mounting
|
||||||
Write-Host "Mounting disk image..."
|
Write-Host "Mounting disk image..."
|
||||||
try {
|
try {
|
||||||
$mountResult = Mount-DiskImage -ImagePath $isoPath -PassThru -ErrorAction Stop
|
# Mount with StorageType ISO to ensure it mounts as a CD/DVD drive
|
||||||
|
$mountResult = Mount-DiskImage -ImagePath $isoPath -PassThru -StorageType ISO -ErrorAction Stop
|
||||||
Write-Host "Mount command executed successfully"
|
Write-Host "Mount command executed successfully"
|
||||||
Write-Host "Mount result: $mountResult"
|
Write-Host "Mount result: $mountResult"
|
||||||
} catch {
|
} catch {
|
||||||
|
|
@ -76,12 +77,18 @@ jobs:
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Wait a bit longer for mount to complete
|
||||||
|
Start-Sleep -Seconds 3
|
||||||
|
|
||||||
# Wait for mount to complete and drive letter to be assigned
|
# Wait for mount to complete and drive letter to be assigned
|
||||||
Write-Host "Waiting for drive letter assignment..."
|
Write-Host "Waiting for drive letter assignment..."
|
||||||
$maxWaitTime = 30 # 30 seconds max wait
|
$maxWaitTime = 30 # 30 seconds max wait
|
||||||
$waitInterval = 1 # Check every second
|
$waitInterval = 1 # Check every second
|
||||||
$elapsed = 0
|
$elapsed = 0
|
||||||
$driveLetter = $null
|
$driveLetter = $null
|
||||||
|
$systemDrive = $env:SystemDrive -replace ':', ''
|
||||||
|
|
||||||
|
Write-Host "System drive: $systemDrive"
|
||||||
|
|
||||||
while ($elapsed -lt $maxWaitTime -and -not $driveLetter) {
|
while ($elapsed -lt $maxWaitTime -and -not $driveLetter) {
|
||||||
Start-Sleep -Seconds $waitInterval
|
Start-Sleep -Seconds $waitInterval
|
||||||
|
|
@ -94,33 +101,59 @@ jobs:
|
||||||
# Get disk number
|
# Get disk number
|
||||||
$diskNumber = $diskImage.Number
|
$diskNumber = $diskImage.Number
|
||||||
|
|
||||||
|
Write-Host "Mounted disk number: $diskNumber"
|
||||||
|
|
||||||
# Get partitions on this disk
|
# Get partitions on this disk
|
||||||
$partitions = Get-Partition -DiskNumber $diskNumber -ErrorAction SilentlyContinue
|
$partitions = Get-Partition -DiskNumber $diskNumber -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
if ($partitions) {
|
if ($partitions) {
|
||||||
# Get drive letter from partition
|
Write-Host "Found $($partitions.Count) partition(s) on mounted disk"
|
||||||
|
# Get drive letter from partition, but exclude system drive
|
||||||
foreach ($partition in $partitions) {
|
foreach ($partition in $partitions) {
|
||||||
if ($partition.DriveLetter) {
|
if ($partition.DriveLetter) {
|
||||||
$driveLetter = $partition.DriveLetter
|
Write-Host "Found partition with drive letter: $($partition.DriveLetter)"
|
||||||
Write-Host "Found drive letter via partition: $driveLetter"
|
if ($partition.DriveLetter -ne $systemDrive) {
|
||||||
break
|
$driveLetter = $partition.DriveLetter
|
||||||
|
Write-Host "Found drive letter via partition: $driveLetter"
|
||||||
|
|
||||||
|
# Verify this drive has Windows installation files
|
||||||
|
if (Test-Path "$driveLetter`:\sources\boot.wim" -or Test-Path "$driveLetter`:\sources\install.wim" -or Test-Path "$driveLetter`:\sources\install.esd") {
|
||||||
|
Write-Host "Verified: Drive $driveLetter contains Windows installation files"
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
Write-Host "Warning: Drive $driveLetter does not contain Windows files, continuing search..."
|
||||||
|
$driveLetter = $null
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "Skipping system drive: $($partition.DriveLetter)"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Fallback: Check all drives for Windows installation files
|
# Fallback: Check all drives for Windows installation files (excluding system drive)
|
||||||
if (-not $driveLetter) {
|
if (-not $driveLetter) {
|
||||||
$allDrives = Get-Volume | Where-Object { $_.DriveLetter -ne $null } | Select-Object -ExpandProperty DriveLetter
|
$allDrives = Get-Volume | Where-Object {
|
||||||
|
$_.DriveLetter -ne $null -and $_.DriveLetter -ne $systemDrive
|
||||||
|
} | Select-Object -ExpandProperty DriveLetter
|
||||||
|
|
||||||
|
Write-Host "Checking drives: $($allDrives -join ', ')"
|
||||||
|
|
||||||
foreach ($letter in $allDrives) {
|
foreach ($letter in $allDrives) {
|
||||||
if (Test-Path "$letter`:\sources\boot.wim" -or Test-Path "$letter`:\sources\install.wim" -or Test-Path "$letter`:\sources\install.esd") {
|
$bootPath = "$letter`:\sources\boot.wim"
|
||||||
|
$installPath = "$letter`:\sources\install.wim"
|
||||||
|
$esdPath = "$letter`:\sources\install.esd"
|
||||||
|
|
||||||
|
if ((Test-Path $bootPath) -or (Test-Path $installPath) -or (Test-Path $esdPath)) {
|
||||||
|
Write-Host "Found Windows files on drive: $letter"
|
||||||
# Verify this is actually our mounted ISO
|
# Verify this is actually our mounted ISO
|
||||||
$testDiskImage = Get-DiskImage -ImagePath $isoPath -ErrorAction SilentlyContinue
|
$testDiskImage = Get-DiskImage -ImagePath $isoPath -ErrorAction SilentlyContinue
|
||||||
if ($testDiskImage) {
|
if ($testDiskImage) {
|
||||||
$testPartition = Get-Partition -DriveLetter $letter -ErrorAction SilentlyContinue
|
$testPartition = Get-Partition -DriveLetter $letter -ErrorAction SilentlyContinue
|
||||||
if ($testPartition -and $testPartition.DiskNumber -eq $testDiskImage.Number) {
|
if ($testPartition -and $testPartition.DiskNumber -eq $testDiskImage.Number) {
|
||||||
$driveLetter = $letter
|
$driveLetter = $letter
|
||||||
Write-Host "Found drive letter by checking Windows files: $driveLetter"
|
Write-Host "Verified: Found drive letter by checking Windows files: $driveLetter"
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -140,9 +173,40 @@ jobs:
|
||||||
Write-Host "Mount result: $mountResult"
|
Write-Host "Mount result: $mountResult"
|
||||||
Write-Host "Disk image info:"
|
Write-Host "Disk image info:"
|
||||||
Get-DiskImage -ImagePath $isoPath | Format-List
|
Get-DiskImage -ImagePath $isoPath | Format-List
|
||||||
Write-Host "Available volumes:"
|
Write-Host "Available volumes (excluding system drive):"
|
||||||
Get-Volume | Format-List
|
Get-Volume | Where-Object { $_.DriveLetter -ne $null -and $_.DriveLetter -ne $systemDrive } | Format-List
|
||||||
exit 1
|
Write-Host "All partitions on mounted disk:"
|
||||||
|
if ($diskImage) {
|
||||||
|
$allPartitions = Get-Partition -DiskNumber $diskImage.Number -ErrorAction SilentlyContinue
|
||||||
|
$allPartitions | Format-List
|
||||||
|
|
||||||
|
# Try to assign drive letter manually if partition exists but has no letter
|
||||||
|
foreach ($partition in $allPartitions) {
|
||||||
|
if (-not $partition.DriveLetter) {
|
||||||
|
Write-Host "Found partition without drive letter. Attempting to assign..."
|
||||||
|
# Find next available drive letter
|
||||||
|
$usedLetters = Get-Volume | Where-Object { $_.DriveLetter -ne $null } | Select-Object -ExpandProperty DriveLetter
|
||||||
|
$availableLetters = ('D'..'Z') | Where-Object { $_ -notin $usedLetters }
|
||||||
|
if ($availableLetters) {
|
||||||
|
$newLetter = $availableLetters[0]
|
||||||
|
Write-Host "Assigning drive letter $newLetter to partition..."
|
||||||
|
try {
|
||||||
|
Set-Partition -InputObject $partition -NewDriveLetter $newLetter -ErrorAction Stop
|
||||||
|
Start-Sleep -Seconds 2
|
||||||
|
$driveLetter = $newLetter
|
||||||
|
Write-Host "Successfully assigned drive letter: $driveLetter"
|
||||||
|
break
|
||||||
|
} catch {
|
||||||
|
Write-Host "Failed to assign drive letter: $_"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not $driveLetter) {
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "ISO mounted successfully to drive: $driveLetter"
|
Write-Host "ISO mounted successfully to drive: $driveLetter"
|
||||||
|
|
@ -165,8 +229,37 @@ jobs:
|
||||||
if (Test-Path "$driveLetter`:\sources") {
|
if (Test-Path "$driveLetter`:\sources") {
|
||||||
Write-Host "Contents of $driveLetter`:\sources:"
|
Write-Host "Contents of $driveLetter`:\sources:"
|
||||||
Get-ChildItem "$driveLetter`:\sources" | Select-Object -First 10
|
Get-ChildItem "$driveLetter`:\sources" | Select-Object -First 10
|
||||||
|
} else {
|
||||||
|
Write-Host "sources folder does not exist in $driveLetter`:\"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check all drives to find where ISO actually mounted
|
||||||
|
Write-Host "Searching all drives for Windows installation files..."
|
||||||
|
$allDrives = Get-Volume | Where-Object { $_.DriveLetter -ne $null } | Select-Object -ExpandProperty DriveLetter
|
||||||
|
foreach ($letter in $allDrives) {
|
||||||
|
if ($letter -ne $systemDrive) {
|
||||||
|
$bootPath = "$letter`:\sources\boot.wim"
|
||||||
|
$installPath = "$letter`:\sources\install.wim"
|
||||||
|
$esdPath = "$letter`:\sources\install.esd"
|
||||||
|
if ((Test-Path $bootPath) -or (Test-Path $installPath) -or (Test-Path $esdPath)) {
|
||||||
|
Write-Host "Found Windows files on drive $letter`!"
|
||||||
|
$testDiskImage = Get-DiskImage -ImagePath $isoPath -ErrorAction SilentlyContinue
|
||||||
|
if ($testDiskImage) {
|
||||||
|
$testPartition = Get-Partition -DriveLetter $letter -ErrorAction SilentlyContinue
|
||||||
|
if ($testPartition -and $testPartition.DiskNumber -eq $testDiskImage.Number) {
|
||||||
|
Write-Host "This is the correct ISO drive! Updating drive letter..."
|
||||||
|
$driveLetter = $letter
|
||||||
|
Write-Host "ISO_DRIVE=$driveLetter" >> $env:GITHUB_ENV
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Test-Path $bootWim) -and -not (Test-Path $installWim) -and -not (Test-Path $installEsd)) {
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
exit 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "Windows installation files verified successfully"
|
Write-Host "Windows installation files verified successfully"
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue