Sunday, 15 December 2019

Spinrite 6.0 on Virtualbox (Linux)



I have found a significant difference in performance depending how the VM is configured in VirtualBox (IDE vs SATA). This is the process I follow to scan hard disks connected via USB adaptors on a Virtual Machine:

Create the VM
  1. Type: Other, Version: DOS
  2. System: Disable Floppy; Memory: 128MB
  3. Storage
    1. Remove the IDE Storage Controller
    2. Add a SATA Controller, enable Host I/O Cache
    3. Add an Optical Drive and choose the Spinrite.iso
    4. Insert the USB drive
    5. As root type dmesg on the command line and identify the device, for example /dev/sdb
    6. chmod o+rw /dev/sdb
    7. As the user running VirtualBox run:
      VBoxManage internalcommands createrawvmdk -filename VirtualBox/sdb.vmdk -rawdisk /dev/sdb
    8. Add a Hard Disk to the SATA Controller > existing disk: sdb.vmdk
  4. Sound: Disabled.
  5. Network: Disable the Network adapter.
VirtualBox Storage configuration


Using the default IDE storage controller slows down the scan by a factor of 10 (approx)

The lack of support for GPT partition tables of the current version of Spinrite (6.0) is a major drawback. I still use it for checking hard disks and data recovery with my old drives, or with new ones, as long as I initiate them with a MBR partition table.

Friday, 17 May 2019

Avoid losing the OpenVPN's CA data on EdgeOS

After updating the firmware of an EdgeRouter 8 to v2.0.1, all CA data stored initially at /usr/lib/ssl/misc/demoCA was lost:

- cacert.pem
- careq.pem
d certs
d crl
- crlnumber
- index.txt
- index.txt.attr
- index.txt.attr.old
- index.txt.old
d newcerts
d private
  - cacert.key
- serial
- serial.old

Luckily, I had the CA's certificate and private key stored at /config/auth, but not the rest of the files. In order not to lose these files next time I upgrade the firmware, I have moved the newly created demoCA directory to /config/auth, and updated the configuration file /etc/ssl/openssl.cnf. Where it says:

dir      = ./demoCA

I have changed it to: 

dir      = /config/auth/demoCA

Monday, 17 December 2018

Unable to compile VirtualBox Guest Additions on CentOS kernel version 3.10.0-957

The Guest Additions for VirtualBox fail to be built on the kernel released on November 12th 2018, version 3.10.0-957 for CentOS 7.

After upgrading the kernel from 3.10.0-862 the compilation of the Guest Additions' modules generates the following errors:

Building the graphics driver module.
Error building the module.  Build output follows.
make V=1 CONFIG_MODULE_SIG= -C /lib/modules/3.10.0-957.1.3.el7.x86_64/build SUBDIRS=/tmp/vbox.0 SRCROOT=/tmp/vbox.0 -j2 modules
make[1]: warning: -jN forced in submake: disabling jobserver mode.
test -e include/generated/autoconf.h -a -e include/config/auto.conf || (                \
echo >&2;                                                       \
echo >&2 "  ERROR: Kernel configuration is invalid.";           \
echo >&2 "         include/generated/autoconf.h or include/config/auto.conf are missing.";\
echo >&2 "         Run 'make oldconfig && make prepare' on kernel src to fix it.";      \
echo >&2 ;                                                      \
/bin/false)
mkdir -p /tmp/vbox.0/.tmp_versions ; rm -f /tmp/vbox.0/.tmp_versions/*
...
/tmp/vbox.0/vbox_mode.c: In function ‘vbox_best_single_encoder’:
/tmp/vbox.0/vbox_mode.c:358:3: warning: passing argument 2 of ‘drm_encoder_find’ makes pointer from integer without a cast [enabled by default]
   return drm_encoder_find(connector->dev, enc_id);
   ^
In file included from /tmp/vbox.0/vbox_drv.h:89:0,
                 from /tmp/vbox.0/vbox_mode.c:35:
include/drm/drm_encoder.h:221:35: note: expected ‘struct drm_file *’ but argument is of type ‘int’
 static inline struct drm_encoder *drm_encoder_find(struct drm_device *dev,
                                   ^
/tmp/vbox.0/vbox_mode.c:358:3: error: too few arguments to function ‘drm_encoder_find’
   return drm_encoder_find(connector->dev, enc_id);
   ^
In file included from /tmp/vbox.0/vbox_drv.h:89:0,
                 from /tmp/vbox.0/vbox_mode.c:35:
include/drm/drm_encoder.h:221:35: note: declared here
 static inline struct drm_encoder *drm_encoder_find(struct drm_device *dev,
                                   ^
make[2]: *** [/tmp/vbox.0/vbox_mode.o] Error 1
make[2]: *** Waiting for unfinished jobs....
/tmp/vbox.0/vbox_ttm.c: In function ‘vbox_ttm_tt_create’:
/tmp/vbox.0/vbox_ttm.c:225:2: warning: passing argument 2 of ‘ttm_tt_init’ from incompatible pointer type [enabled by default]
  if (ttm_tt_init(tt, bdev, size, page_flags, dummy_read_page)) {
  ^
In file included from include/drm/ttm/ttm_bo_driver.h:45:0,
                 from /tmp/vbox.0/vbox_drv.h:93,
                 from /tmp/vbox.0/vbox_ttm.c:31:
include/drm/ttm/ttm_tt.h:161:5: note: expected ‘struct ttm_buffer_object *’ but argument is of type ‘struct ttm_bo_device *’
 int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
     ^
/tmp/vbox.0/vbox_ttm.c:225:2: error: too many arguments to function ‘ttm_tt_init’
  if (ttm_tt_init(tt, bdev, size, page_flags, dummy_read_page)) {
  ^
In file included from include/drm/ttm/ttm_bo_driver.h:45:0,
                 from /tmp/vbox.0/vbox_drv.h:93,
                 from /tmp/vbox.0/vbox_ttm.c:31:
include/drm/ttm/ttm_tt.h:161:5: note: declared here
 int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
     ^
/tmp/vbox.0/vbox_ttm.c: In function ‘vbox_ttm_tt_populate’:
/tmp/vbox.0/vbox_ttm.c:240:2: error: too few arguments to function ‘ttm_pool_populate’
  return ttm_pool_populate(ttm);
  ^
In file included from /tmp/vbox.0/vbox_ttm.c:32:0:
include/drm/ttm/ttm_page_alloc.h:50:5: note: declared here
 int ttm_pool_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx);
     ^
/tmp/vbox.0/vbox_ttm.c: At top level:
/tmp/vbox.0/vbox_ttm.c:257:2: warning: initialization from incompatible pointer type [enabled by default]
  .ttm_tt_create = vbox_ttm_tt_create,
  ^
/tmp/vbox.0/vbox_ttm.c:257:2: warning: (near initialization for ‘vbox_bo_driver.ttm_tt_create’) [enabled by default]
/tmp/vbox.0/vbox_ttm.c:259:2: warning: initialization from incompatible pointer type [enabled by default]
  .ttm_tt_populate = vbox_ttm_tt_populate,
  ^
/tmp/vbox.0/vbox_ttm.c:259:2: warning: (near initialization for ‘vbox_bo_driver.ttm_tt_populate’) [enabled by default]
/tmp/vbox.0/vbox_ttm.c:272:16: error: ‘ttm_bo_default_io_mem_pfn’ undeclared here (not in a function)
  .io_mem_pfn = ttm_bo_default_io_mem_pfn,
                ^
/tmp/vbox.0/vbox_ttm.c: In function ‘vbox_bo_create’:
/tmp/vbox.0/vbox_ttm.c:417:6: warning: passing argument 8 of ‘ttm_bo_init’ makes integer from pointer without a cast [enabled by default]
      NULL, vbox_bo_ttm_destroy);
      ^
In file included from /tmp/vbox.0/vbox_drv.h:92:0,
                 from /tmp/vbox.0/vbox_ttm.c:31:
include/drm/ttm/ttm_bo_api.h:544:5: note: expected ‘size_t’ but argument is of type ‘void *’
 int ttm_bo_init(struct ttm_bo_device *bdev, struct ttm_buffer_object *bo,
     ^
/tmp/vbox.0/vbox_ttm.c:417:6: warning: passing argument 9 of ‘ttm_bo_init’ makes pointer from integer without a cast [enabled by default]
      NULL, vbox_bo_ttm_destroy);
      ^
In file included from /tmp/vbox.0/vbox_drv.h:92:0,
                 from /tmp/vbox.0/vbox_ttm.c:31:
include/drm/ttm/ttm_bo_api.h:544:5: note: expected ‘struct sg_table *’ but argument is of type ‘size_t’
 int ttm_bo_init(struct ttm_bo_device *bdev, struct ttm_buffer_object *bo,
     ^
/tmp/vbox.0/vbox_ttm.c:417:6: error: too many arguments to function ‘ttm_bo_init’
      NULL, vbox_bo_ttm_destroy);
      ^
In file included from /tmp/vbox.0/vbox_drv.h:92:0,
                 from /tmp/vbox.0/vbox_ttm.c:31:
include/drm/ttm/ttm_bo_api.h:544:5: note: declared here
 int ttm_bo_init(struct ttm_bo_device *bdev, struct ttm_buffer_object *bo,
     ^
/tmp/vbox.0/vbox_ttm.c: In function ‘vbox_bo_pin’:
/tmp/vbox.0/vbox_ttm.c:452:2: error: too many arguments to function ‘ttm_bo_validate’
  ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
  ^
In file included from /tmp/vbox.0/vbox_drv.h:92:0,
                 from /tmp/vbox.0/vbox_ttm.c:31:
include/drm/ttm/ttm_bo_api.h:344:5: note: declared here
 int ttm_bo_validate(struct ttm_buffer_object *bo,
     ^
/tmp/vbox.0/vbox_ttm.c: In function ‘vbox_bo_unpin’:
/tmp/vbox.0/vbox_ttm.c:486:2: error: too many arguments to function ‘ttm_bo_validate’
  ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
  ^
In file included from /tmp/vbox.0/vbox_drv.h:92:0,
                 from /tmp/vbox.0/vbox_ttm.c:31:
include/drm/ttm/ttm_bo_api.h:344:5: note: declared here
 int ttm_bo_validate(struct ttm_buffer_object *bo,
     ^
/tmp/vbox.0/vbox_ttm.c: In function ‘vbox_bo_push_sysram’:
/tmp/vbox.0/vbox_ttm.c:525:2: error: too many arguments to function ‘ttm_bo_validate’
  ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
  ^
In file included from /tmp/vbox.0/vbox_drv.h:92:0,
                 from /tmp/vbox.0/vbox_ttm.c:31:
include/drm/ttm/ttm_bo_api.h:344:5: note: declared here
 int ttm_bo_validate(struct ttm_buffer_object *bo,
     ^
make[2]: *** [/tmp/vbox.0/vbox_ttm.o] Error 1
make[1]: *** [_module_/tmp/vbox.0] Error 2
make: *** [vboxvideo] Error 2

I have also attempted to use the beta version 5.2.23, but the Windows device drivers for the VirtualBox devices would not load because of a problem with the drivers' signatures from Oracle.



The only solution I have found so far has been to go back to using kernel version 3.10.0-862.

Wednesday, 4 May 2016

Importing Bookmarks to Chrome from another Chrome installation

If you need to import your bookmarks to a new installation of Chrome, unless you log into your Chrome account, I found the task to be not so easy to find. You may need this when you switch to a new computer.

Version 50.0... on Windows 7 has 2 options when you try to import Bookmarks from the Menu Bookmarks > Import Bookmarks and configuration...:

  1. Microsoft Internet Explorer
  2. HTML Bookmarks file
The first option is quite useless, unless what you want to import are the Bookmarks and Settings from the Internet Explorer installed for the same user account as you logged in. I needed to import them from a disk from another computer, so this option is a no go.

The second option appears to be more general, but useless for my case: Chrome to Chrome.

So, the bookmarks file for Chrome on Windows 7 is installed in the file C:/Users/Your-Username/AppData/Local/Google/Chrome/User Data/Default/Bookmarks. You only need to

  1. Close Chrome.
  2. Replace your current Bookmarks file with the old one
  3. Start Chrome
The current Bookmarks are replaced with the old ones.

Saturday, 23 April 2016

Debugging module installation on Drupal 7 with NetBeans

After following Configuring NetBeans, a very informative post on Drupal, I could still not debug my module on NetBeans 8.1. My main problem was that the breakpoints set on any of my module's files appeared as broken. In order to fix this, I needed to let NetBeans know which server request calls the module's code.

The Server request


Using Chrome's "Inspect" feature on the /admin/modules page after enabling my module and submitting the form, I found out that the module installation was being initiated by a POST request to "http://.../admin/modules/list/confirm".

I had created an apache virtual site to host it. On NetBeans, I included the whole Drupal 7 web tree as the project source (var/www/drupal7), and modified the project's Run Configuration accordingly (right click on the project's name > Properties):

NetBeans Project Properties - Run Configuration
Project Properties - Run Configuration
On the Advanced... settings window, I added the following Path Mapping:
  • Server Path: http://mylocalserver.local/admin/modules/list/confirm
  • Project Path: click on the ... and browse to the directory where your module is installed: /var/www/drupal7/sites/all/modules/my_module

Project Properties - Run - Advanced Web Configuration
Project Properties - Run Configuration - Advanced...


After this, the break points set on the files under .../my_module appeared and worked just fine.

Friday, 25 March 2016

IIS Installation... no static content by default

I recently discovered that my initial installation of IIS 7.5 on Windows 7 professional didn't include basic features like serving static content... surprise!

So I reinstalled IIS following this guide on iis.net. On point number 7 of that page, it describes how to enable "Common Http Features" that are not enabled by default like: Directory browsing, or Static Content. This is the part I had missed before, I couldn't imagine that the default installation didn't include these basic features.

Thursday, 18 June 2015

Back up my laptop task... even when it's off


I changed my backup software of choice from dejadup to Back In Time a couple of months ago, hoping I could have unattended back ups of two laptops, once a month, even if the laptops were turned off when the time came.

Back In Time uses cron to schedule a task at regular intervals. The problem is, if the laptop is turned off, or suspended when the task is supposed to activate, it never runs.

To work around this problem a second task could be scheduled so that it checks whether the scheduled back up took place, and starts it when it hasn't.

The first thing to check is whether Back In Time offers any way to check the last back up... yeap!

$ backintime --last-snapshot

Back In Time
Version: 1.0.34

Back In Time comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; type `backintime --license' for details.

INFO: Mountpoint /tmp/backintime/.../mountpoint is already mounted
SnapshotID: 20150530-212330-282
INFO: Mountpoint /tmp/backintime/.../mountpoint still in use. Keep mounted


Also, we can check the crontab:

$ crontab -l
#Back In Time system entry, this will be edited by the gui:
0 0 1 * * /usr/bin/nice -n 19 /usr/bin/ionice -c2 -n7 /usr/bin/backintime --backup-job >/dev/null 2>&1

Now, we need to extract the last date backintime should have run from the crontab.

I can't find an easy way to do this yet...