Linux/udisks2/image customization: fix issue with mounting NVMe drives

When using image customization with an NVMe drive under RPI OS on a CM4,
the system will prompt non-root users for password when mounting the FAT file system.
(Passwordless mounting does is available for removable storage,
but the NVMe drive qualifies as internal storage instead).

- The mount command we send to udisks2 over dbus2 may timeout
before the user completed the password prompt.
Raise timeout to counter this.

- Print mount error details to console
- On mount error report error mounting in GUI instead of
  "/config.txt does not exist" (which happened when mountDevice()
  returned empty string)
This commit is contained in:
Floris Bos 2021-11-27 19:22:55 +01:00
parent 8b25991537
commit b42342d0ac
2 changed files with 25 additions and 1 deletions

View file

@ -916,7 +916,9 @@ bool DownloadThread::_customizeImage()
/* Not running as root, try to outsource mounting to udisks2 */ /* Not running as root, try to outsource mounting to udisks2 */
#ifndef QT_NO_DBUS #ifndef QT_NO_DBUS
UDisks2Api udisks2; UDisks2Api udisks2;
mountpoints.push_back(udisks2.mountDevice(fatpartition).toStdString()); QString mp = udisks2.mountDevice(fatpartition);
if (!mp.isEmpty())
mountpoints.push_back(mp.toStdString());
#endif #endif
} }
else else

View file

@ -156,6 +156,8 @@ bool UDisks2Api::formatDrive(const QString &device, bool mountAfterwards)
for (int attempt = 0; attempt < 10; attempt++) for (int attempt = 0; attempt < 10; attempt++)
{ {
qDebug() << "Mounting partition"; qDebug() << "Mounting partition";
// User may need to enter password in authentication dialog if non-removable storage, so set long timeout
filesystem.setTimeout(3600 * 1000);
QDBusReply<QString> mp = filesystem.call("Mount", mountOptions); QDBusReply<QString> mp = filesystem.call("Mount", mountOptions);
if (mp.isValid()) if (mp.isValid())
@ -172,6 +174,10 @@ bool UDisks2Api::formatDrive(const QString &device, bool mountAfterwards)
qDebug() << "Was already auto-mounted at:" << mps; qDebug() << "Was already auto-mounted at:" << mps;
return true; return true;
} }
else
{
qDebug() << "Error mounting:" << mp.error().message();
}
} }
QThread::sleep(1); QThread::sleep(1);
@ -197,6 +203,8 @@ QString UDisks2Api::mountDevice(const QString &device)
for (int attempt = 0; attempt < 10; attempt++) for (int attempt = 0; attempt < 10; attempt++)
{ {
qDebug() << "Mounting partition"; qDebug() << "Mounting partition";
// User may need to enter password in authentication dialog if non-removable storage, so set long timeout
filesystem.setTimeout(3600 * 1000);
QDBusReply<QString> mp = filesystem.call("Mount", mountOptions); QDBusReply<QString> mp = filesystem.call("Mount", mountOptions);
if (mp.isValid()) if (mp.isValid())
@ -204,6 +212,20 @@ QString UDisks2Api::mountDevice(const QString &device)
qDebug() << "Mounted file system at:" << mp; qDebug() << "Mounted file system at:" << mp;
return mp; return mp;
} }
else
{
/* Check if already auto-mounted */
auto mps = mountPoints(filesystem);
if (!mps.isEmpty())
{
qDebug() << "Was already auto-mounted at:" << mps;
return mps.first();
}
else
{
qDebug() << "Error mounting:" << mp.error().message();
}
}
QThread::sleep(1); QThread::sleep(1);
} }