Creating a custom locked role
Unfortunately this behaviour is hard coded into the theme_user_admin_roles() function, so you'll need to override that theme function to remove the link and add the locked label. You'll also need to override the access check for the role edit/deletion page so it can't be visited directly.

This is the theme override you'll need to use (it's exactly the same as theme_user_admin_roles() except it has an extra test for your custom role):

function MYTHEME_user_admin_roles($variables) {
  $my_role_id = function_to_get_custom_role_id();

  $form = $variables['form'];

  $header = array(t('Name'), t('Weight'), array(
      'data' =&gt; t('Operations'),
      'colspan' =&gt; 2,
    ));
  foreach (element_children($form['roles']) as $rid) {
    $name = $form['roles'][$rid]['#role']-&gt;name;
    $row = array();
    if (in_array($rid, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID, $my_role_id))) {
      $row[] = t('@name &lt;em&gt;(locked)&lt;/em&gt;', array('@name' =&gt; $name));
      $row[] = drupal_render($form['roles'][$rid]['weight']);
      $row[] = '';
      $row[] = l(t('edit permissions'), 'admin/people/permissions/' . $rid);
    }
    else {
      $row[] = check_plain($name);
      $row[] = drupal_render($form['roles'][$rid]['weight']);
      $row[] = l(t('edit role'), 'admin/people/permissions/roles/edit/' . $rid);
      $row[] = l(t('edit permissions'), 'admin/people/permissions/' . $rid);
    }
    $rows[] = array(
      'data' =&gt; $row,
      'class' =&gt; array('draggable'),
    );
  }
  $rows[] = array(array(
      'data' =&gt; drupal_render($form['name']) . drupal_render($form['add']),
      'colspan' =&gt; 4,
      'class' =&gt; 'edit-name',
    ));

  drupal_add_tabledrag('user-roles', 'order', 'sibling', 'role-weight');

  $output = theme('table', array('header' =&gt; $header, 'rows' =&gt; $rows, 'attributes' =&gt; array('id' =&gt; 'user-roles')));
  $output .= drupal_render_children($form);

  return $output;
}


And this is the code for the access override (needs to go in a custom module)

function MYMODULE_menu_alter(&amp;$items) {
  $items['admin/people/permissions/roles/edit/%user_role']['access callback'] = 'MYMODULE_user_roles_edit';
  $items['admin/people/permissions/roles/delete/%user_role']['access callback'] = 'MYMODULE_user_roles_edit';
}

function MYMODULE_user_roles_edit($role) {
  $my_role_id = function_to_get_custom_role_id();

  if ($role-&gt;rid == DRUPAL_ANONYMOUS_RID || 
    $role-&gt;rid == DRUPAL_AUTHENTICATED_RID ||
    $role-&gt;rid == $my_role_id) {
    return FALSE;
  }

  return user_access('administer permissions');
}