Index: /trunk/src/VBox/Devices/Serial/DrvHostSerial.cpp
===================================================================
--- /trunk/src/VBox/Devices/Serial/DrvHostSerial.cpp	(revision 33727)
+++ /trunk/src/VBox/Devices/Serial/DrvHostSerial.cpp	(revision 33728)
@@ -1360,7 +1360,18 @@
     }
 
-#else
-
-    rc = RTFileOpen(&pThis->DeviceFile, pThis->pszDevicePath, RTFILE_O_READWRITE | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
+#else /* !RT_OS_WINDOWS */
+
+    uint32_t fOpen = RTFILE_O_READWRITE | RTFILE_O_OPEN | RTFILE_O_DENY_NONE;
+# ifdef RT_OS_LINUX
+    /* This seems to be necessary on some Linux hosts, otherwise we hang here forever.
+     * Surprisingly, I've never seen VERR_TRY_AGAIN as result even if RTFileOpen()
+     * would block without that flag. */
+    fOpen |= RTFILE_O_NON_BLOCK;
+# endif
+    rc = RTFileOpen(&pThis->DeviceFile, pThis->pszDevicePath, fOpen);
+# ifdef RT_OS_LINUX
+    if (rc == VERR_INVALID_PARAMETER)
+        rc = RTFileOpen(&pThis->DeviceFile, pThis->pszDevicePath, fOpen & ~RTFILE_O_NON_BLOCK);
+# endif
 # ifdef RT_OS_DARWIN
     if (RT_SUCCESS(rc))
@@ -1369,5 +1380,5 @@
 
 
-#endif
+#endif /* !RT_OS_WINDOWS */
 
     if (RT_FAILURE(rc))
