Merge branch 'fix-partition-alignment'
This commit is contained in:
commit
88eea0cce9
@ -90,17 +90,35 @@ swapSuggestion( const qint64 availableSpaceB )
|
|||||||
suggestedSwapSizeB *= overestimationFactor;
|
suggestedSwapSizeB *= overestimationFactor;
|
||||||
|
|
||||||
// don't use more than 10% of available space
|
// don't use more than 10% of available space
|
||||||
qreal maxSwapDiskRatio = 1.10;
|
qreal maxSwapDiskRatio = 0.10;
|
||||||
qint64 maxSwapSizeB = availableSpaceB * maxSwapDiskRatio;
|
qint64 maxSwapSizeB = availableSpaceB * maxSwapDiskRatio;
|
||||||
if ( suggestedSwapSizeB > maxSwapSizeB )
|
if ( suggestedSwapSizeB > maxSwapSizeB )
|
||||||
suggestedSwapSizeB = maxSwapSizeB;
|
suggestedSwapSizeB = maxSwapSizeB;
|
||||||
}
|
}
|
||||||
|
|
||||||
cDebug() << "Suggested swap size:" << suggestedSwapSizeB / 1024. / 1024. /1024. << "GiB";
|
cDebug() << "Suggested swap size:" << suggestedSwapSizeB / 1024. / 1024. / 1024. << "GiB";
|
||||||
|
|
||||||
return suggestedSwapSizeB;
|
return suggestedSwapSizeB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constexpr qint64
|
||||||
|
alignBytesToBlockSize( qint64 bytes, qint64 blocksize )
|
||||||
|
{
|
||||||
|
Q_ASSERT( bytes >= 0 );
|
||||||
|
Q_ASSERT( blocksize > 0 );
|
||||||
|
qint64 blocks = bytes / blocksize;
|
||||||
|
Q_ASSERT( blocks >= 0 );
|
||||||
|
|
||||||
|
if ( blocks * blocksize != bytes )
|
||||||
|
++blocks;
|
||||||
|
return blocks * blocksize;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr qint64
|
||||||
|
bytesToSectors( qint64 bytes, qint64 blocksize )
|
||||||
|
{
|
||||||
|
return alignBytesToBlockSize( alignBytesToBlockSize( bytes, blocksize), MiBtoBytes(1) ) / blocksize;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPassphrase )
|
doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPassphrase )
|
||||||
@ -114,25 +132,26 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass
|
|||||||
defaultFsType = "ext4";
|
defaultFsType = "ext4";
|
||||||
|
|
||||||
// Partition sizes are expressed in MiB, should be multiples of
|
// Partition sizes are expressed in MiB, should be multiples of
|
||||||
// the logical sector size (usually 512B).
|
// the logical sector size (usually 512B). EFI starts with 2MiB
|
||||||
int uefisys_part_size = 0;
|
// empty and a 300MiB EFI boot partition, while BIOS starts at
|
||||||
int empty_space_size = 0;
|
// the 1MiB boundary (usually sector 2048).
|
||||||
if ( isEfi )
|
int uefisys_part_size = isEfi ? 300 : 0;
|
||||||
{
|
int empty_space_size = isEfi ? 2 : 1;
|
||||||
uefisys_part_size = 300;
|
|
||||||
empty_space_size = 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// we start with a 1MiB offset before the first partition
|
|
||||||
empty_space_size = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
qint64 firstFreeSector = MiBtoBytes(empty_space_size) / dev->logicalSize() + 1;
|
// Since sectors count from 0, if the space is 2048 sectors in size,
|
||||||
|
// the first free sector has number 2048 (and there are 2048 sectors
|
||||||
|
// before that one, numbered 0..2047).
|
||||||
|
qint64 firstFreeSector = bytesToSectors( MiBtoBytes(empty_space_size), dev->logicalSize() );
|
||||||
|
|
||||||
if ( isEfi )
|
if ( isEfi )
|
||||||
{
|
{
|
||||||
qint64 lastSector = firstFreeSector + ( MiBtoBytes(uefisys_part_size) / dev->logicalSize() );
|
qint64 efiSectorCount = bytesToSectors( MiBtoBytes(uefisys_part_size), dev->logicalSize() );
|
||||||
|
Q_ASSERT( efiSectorCount > 0 );
|
||||||
|
|
||||||
|
// Since sectors count from 0, and this partition is created starting
|
||||||
|
// at firstFreeSector, we need efiSectorCount sectors, numbered
|
||||||
|
// firstFreeSector..firstFreeSector+efiSectorCount-1.
|
||||||
|
qint64 lastSector = firstFreeSector + efiSectorCount - 1;
|
||||||
core->createPartitionTable( dev, PartitionTable::gpt );
|
core->createPartitionTable( dev, PartitionTable::gpt );
|
||||||
Partition* efiPartition = KPMHelpers::createNewPartition(
|
Partition* efiPartition = KPMHelpers::createNewPartition(
|
||||||
dev->partitionTable(),
|
dev->partitionTable(),
|
||||||
@ -162,8 +181,11 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass
|
|||||||
{
|
{
|
||||||
qint64 availableSpaceB = ( dev->totalLogical() - firstFreeSector ) * dev->logicalSize();
|
qint64 availableSpaceB = ( dev->totalLogical() - firstFreeSector ) * dev->logicalSize();
|
||||||
suggestedSwapSizeB = swapSuggestion( availableSpaceB );
|
suggestedSwapSizeB = swapSuggestion( availableSpaceB );
|
||||||
|
// Space required by this installation is what the distro claims is needed
|
||||||
|
// (via global configuration) plus the swap size plus a fudge factor of
|
||||||
|
// 0.6GiB (this was 2.1GiB up to Calamares 3.2.2).
|
||||||
qint64 requiredSpaceB =
|
qint64 requiredSpaceB =
|
||||||
GiBtoBytes( gs->value( "requiredStorageGB" ).toDouble() + 0.1 + 2.0 ) +
|
GiBtoBytes( gs->value( "requiredStorageGB" ).toDouble() + 0.6 ) +
|
||||||
suggestedSwapSizeB;
|
suggestedSwapSizeB;
|
||||||
|
|
||||||
// If there is enough room for ESP + root + swap, create swap, otherwise don't.
|
// If there is enough room for ESP + root + swap, create swap, otherwise don't.
|
||||||
|
Loading…
Reference in New Issue
Block a user